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

时间:2008-09-10 07:44:54

标签: git branch

自从当前分支分支以来,在分支上获取提交日志的最佳方法是什么?到目前为止我的解决方案是:

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 log命令给了我更多的东西。

在图片中,假设:

         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。

10 个答案:

答案 0 :(得分:176)

在修订列表的上下文中,A...Bgit-rev-parse定义它的方式。 git-log采用修订列表。 git-diff未获取修订列表 - 需要一次或两次修订,并且已将A...B语法定义为在git-diff联机帮助页中定义它的方式。如果git-diff未明确定义A...B,则该语法无效。请注意,git-rev-parse联机帮助页在“指定范围”部分中描述了A...B,该部分中的所有内容仅在修订范围有效的情况下有效(即需要修订列表时)。 / p>

要获取仅包含x,y和z的日志,请尝试git log HEAD..branch(两个点,而不是三个点)。这与git log branch --not HEAD相同,表示分支上不在HEAD上的所有提交。

答案 1 :(得分:64)

git cherry branch [newbranch]
当你在master分支时,

正是你所要求的。

我也非常喜欢:

git diff --name-status branch [newbranch]

这不完全是你所要求的,但在相同的背景下仍然非常有用。

答案 2 :(得分:33)

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

执行此操作
git log master..branchName 

git log master..branchName --oneline

我假设“branchName”被创建为“master”的跟踪分支。

同样,要查看传入的更改,您可以使用:

git log branchName..master

答案 3 :(得分:23)

这与我发布的答案类似:Preview a Git push

将这些功能放入Bash配置文件中:

  • gbout - git branch outgoing
  • gbin - git branch incoming

你可以使用它:

  • 如果在master上:gbin branch1< - 这个 会告诉你branch1和 不在主人
  • 如果在主人:gbout branch1< - 这会告诉你什么 在不在分支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
}

答案 4 :(得分:13)

类似于Alex V&NDavis和NDavis等几个答案,但它们都没有完全相同。

当已经在相关分支中

使用:

git diff master...

其中包含多项功能:

  • 它的超短
  • 显示实际更改

更新

这应该是git diff master,但这也显示了差异,而不是指定问题的提交。

答案 5 :(得分:8)

在那里扔一个-p以查看一些文件更改

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

答案 6 :(得分:6)

要查看当前分支的日志,因为从master分支:

git log master...

如果您当前在master上,要查看不同分支的日志,因为它分支了master:

git log ...other-branch

答案 7 :(得分:4)

git log --cherry-mark --oneline from_branch...to_branch

(3dots)但有时它显示'+'而不是'='

答案 8 :(得分:2)

我找到了

git diff <branch_with_changes> <branch_to_compare_to>

更有用,因为你不仅获得提交消息而且获得整个差异。如果您已经在分支机构上,您希望看到更改和(例如)想要查看更改为主服务器的更改,您可以使用:

git diff HEAD master

答案 9 :(得分:0)

在Git 2.30(Q1 2021)上,“ git diff A ... B(man)”学习了“ git diff --merge-base AB(man)”,这是说同一话的更长手。

因此,您可以使用git diff --merge-base <branch> HEAD执行此操作。这应该等效于git diff <branch>...HEAD,但不必在差异中使用范围标记。