【问题标题】:How to get the changes on a branch in Git如何在 Git 中获取分支上的更改
【发布时间】:2010-09-08 09:20:10
【问题描述】:

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

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---分支 / ---a---b---c---d---e---头

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

  • git diff HEAD...branch 提供这些提交
  • 但是,git log HEAD...branch 给出 x、y、z、c、d、e。

【问题讨论】:

  • 据我所知,您出于您的目的错误地使用了“git log”。我在下面添加了我的答案。

标签: git branch


【解决方案1】:

在修订列表的上下文中,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 diff HEAD..branch”显示所有提交(x,y,z,c,d,e),但“git log HEAD..branch”完全符合我的要求,只显示x,y ,z!这与使用“...”完全相反。
  • git diff HEAD..branch 与 git diff HEAD branch 相同。这里要记住的关键是 log 需要一个修订列表/范围,而 diff 没有。这就是为什么他们以不同的方式对待他们的参数。
  • 好像git diff HEAD...branch(三个点)对应git log HEAD..branch的输出
【解决方案2】:
git cherry branch [newbranch]

当您在 master 分支时,完全按照您的要求进行操作。

我也很喜欢:

git diff --name-status branch [newbranch]

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

【讨论】:

  • 'git cherry' 输出提交 ID 列表。我可以将这些转换为单个 diff 组合每次提交中的所有更改吗?
  • @JonathanHartley 获取提交 ID 的 first 和 last 之类的并将它们扔到 gif-diff:git diff x..z,或我自己的例子是git diff 13bc4d..8eda3a。
  • 很难理解必须在命令中替换哪些代码,因为分支或新分支中的哪个是关键字,应该用自定义分支名称替换
【解决方案3】:

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

git log master..branchName 

或

git log master..branchName --oneline

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

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

git log branchName..master

【讨论】:

  • @A-B-B,如果省略branchName,则默认为“head”,即上例中的实际branchName。
【解决方案4】:

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

将这些函数放入您的 Bash 配置文件中:

  • gbout - git 分支传出
  • gbin - git 分支传入

你可以这样使用:

  • 如果在master上:gbin branch1
  • 如果在主服务器上:gbout branch1

这适用于任何分支。

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
}

【讨论】:

    【解决方案5】:

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

    当已经在相关分支中时

    使用:

    git diff master...
    

    它结合了几个功能:

    • 超短
    • 显示实际变化

    更新:

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

    【讨论】:

    • 如果您在创建分支后就使用了git co master; git pull,那么git diff master 将无法获得仅由指定分支中的提交引入的差异。
    • 或明确指定分支:git diff <branch1>...<branch2> 将显示branch2 引入的更改。
    【解决方案6】:

    在其中输入 -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
    

    【讨论】:

      【解决方案7】:

      查看从master分支后当前分支的日志:

      git log master...

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

      git log ...other-branch

      【讨论】:

        【解决方案8】:
        git log --cherry-mark --oneline from_branch...to_branch
        

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

        【讨论】:

        • 3 个点显示分支上的第一个提交两次,而两个没有。
        【解决方案9】:

        我找到了

        git diff <branch_with_changes> <branch_to_compare_to>
        

        更有用,因为您不仅可以获得提交消息,还可以获得整个差异。如果您已经在想要查看更改的分支上并且(例如)想要查看主分支的更改,您可以使用:

        git diff HEAD master
        

        【讨论】:

          【解决方案10】:

          在 Git 2.30(2021 年第一季度)中,“git diff A...B(man)”学会了“git diff --merge-base AB(man),这是一个更长的简写方式来表达同样的事情。

          因此,您可以使用git diff --merge-base &lt;branch&gt; HEAD 执行此操作。这应该等同于git diff &lt;branch&gt;...HEAD,但不会因为必须在差异中使用范围表示法而感到困惑。

          【讨论】:

            猜你喜欢
            • 2011-07-17
            • 2014-06-08
            • 2022-01-05
            • 2011-03-08
            • 1970-01-01
            • 2013-05-30
            • 2015-12-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多