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

时间:2020-03-05 18:50:34  来源:igfitidea点击:

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

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-而不是$(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。

解决方案

回答

在修订列表的上下文中,A ... B是git-rev-parse对其定义的方式。 git-log获取修订列表。 git-diff不包含修订版本列表,而仅包含一个或者两个修订版本,并且已经定义了" A ... B"语法以表示它在git-diff手册页中的定义方式。如果git-diff没有显式定义A ... B,则该语法无效。请注意,git-rev-parse`手册页在"指定范围"部分中描述了" 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中的内容
  • 如果在主节点上:gbout branch1 <-这将向我们显示主节点中不在分支1中的内容

这将适用于任何分支。

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

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

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