如何在Git中获得分支上的更改

从一个分支被分支到当前分支之后,最好的方法是什么?目前我的解决方案是:

git log $(git merge-base HEAD branch)..branch

git-diff的文档表明git diff A...B等价于git diff $(git-merge-base A B) B。另一方面,git-rev-parse的文档指出r1...r2被定义为r1 r2 --not $(git merge-base --all r1 r2)

为什么这些不同呢?注意,git diff HEAD...branch给了我想要的差异,但对应的git日志命令给了我更多。

在图片中,假设:

x---y---z---branch
/
---a---b---c---d---e---HEAD

我想要得到一个包含提交x y z的日志。

  • git diff HEAD...branch给出了这些提交
  • 然而,git log HEAD...branch给出x, y, z, c, d, e。
257805 次浏览

在修订列表的上下文中,A...Bgit-rev-parse定义它的方式。Git-log接受一个修订列表。git-diff不接受修订列表-它接受一个或两个修订,并定义了A...B语法,以表示如何在git-diff manpage中定义它。如果git-diff没有显式定义A...B,那么该语法将是无效的。注意,git-rev-parse manpage在“指定范围”部分中描述了A...B,并且该部分中的所有内容仅在修订范围有效的情况下有效(即当需要修订列表时)。

要获得只包含x, y和z的日志,尝试git log HEAD..branch(两个点,而不是三个点)。这与git log branch --not HEAD相同,并且意味着所有在分支上的提交都不在HEAD上。

git cherry branch [newbranch]

当你在master分支中时,它完全是你所要求的。

我也很喜欢:

git diff --name-status branch [newbranch]

这不是你要问的,但在相同的上下文中仍然非常有用。

这与我在预览Git推送上发布的答案类似

把这些函数放到你的Bash配置文件中:

  • Gbout - git分支输出
  • Gbin - git分支传入

你可以这样使用:

  • 如果在master上:gbin branch1 < 我会告诉你branch1和 不在master
  • 如果在master: gbout Branch1 <——这将告诉你什么是 在master中,它不在分支1

这将适用于任何分支。

function parse_git_branch {
git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
}


function gbin {
echo branch \($1\) has these commits and \($(parse_git_branch)\) does not
git log ..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}


function gbout {
echo branch \($(parse_git_branch)\) has these commits and \($1\) does not
git log $1.. --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
}
git log --cherry-mark --oneline from_branch...to_branch

(3个点)但有时它会显示“+”而不是“=”

您希望看到的是传出提交的列表。你可以用

git log master..branchName

git log master..branchName --oneline

在这里,我假设“branchName”是作为“master”的跟踪分支创建的。

类似地,要查看传入的更改,您可以使用:

git log branchName..master

在那里抛出一个-p来查看一些FILE CHANGES

git log -p master..branch

做一些别名:

alias gbc="git branch --no-color | sed -e '/^[^\*]/d' -e 's/* \\(.*\\)/\1/'"


alias gbl='git log -p master..\`gbc\`'

查看分支的唯一提交:

gbl

我发现

git diff <branch_with_changes> <branch_to_compare_to>

更有用,因为你不只是得到提交消息,而是整个diff。如果你已经在分支上,你想要看到的变化,(例如)想要看到master的变化,你可以使用:

git diff HEAD master

查看当前分支自master分支以来的日志:

git log master...

如果你当前在master上,查看不同分支的日志,因为它是从master上分支的:

git log ...other-branch

当已经在有问题的分支使用

git diff master...

它结合了以下几个特点:

  • 它非常短
  • 显示实际的变化
  • 允许主人向前移动

随着Git 2.30(2021年第一季度),“Git diff A…B(man)”;学会了git diff -merge-base A B(man),这是说同样事情的一个较长的简写。

因此,你可以使用git diff --merge-base <branch> HEAD来做到这一点。这应该相当于git diff <branch>...HEAD,但没有必须在diff中使用范围符号的混乱。