【问题标题】:How can I check whether two branches are "even"?如何检查两个分支是否“偶数”?
【发布时间】:2015-11-06 02:37:53
【问题描述】:

GitHub 网络界面有一个很好的功能,可以告诉我一个分支是否与 master 分支相同。

是否有与此功能等效的命令行?我使用多个存储库,我正在寻找一种快速的方法来查看分支是否均匀或需要注意。

这里是 GitHub 网络界面的截图,对于那些想知道这个功能的人:

【问题讨论】:

  • “偶数”是什么意思?这是否意味着两个分支相同?或者分支与 master 是最新的(但分支可能包含不在 master 上的新提交)?还是别的什么?
  • 我假设“偶数”意味着两个分支彼此是最新的。要么这个,要么分支不欠对方任何钱^ ^
  • github 网站上的定义是,关于提交,两个分支都不落后。我认为@TimBiegeleisen 的回答只检查文件而不提交,但已经足够好了。
  • 两个分支可能有相同的文件集但有不同的提交。想象一下对一个文件进行更改,提交,然后恢复(这也会进行新的提交)。现在文件集是相同的,但提交不同。
  • 确实,我认为您的答案只检查文件,对吗?如果您也有提交的解决方案,请随时编辑您的答案?

标签: git github git-branch


【解决方案1】:

GitHub 术语

分支A 和分支B 是偶数。

是 GitHub 的说法

Branch A 和 Branch B 指向同一个提交。

两个分支是否相等?

如果您只对是否这两个分支感兴趣,没有任何额外的细节(例如提交计数),脚本友好的方法是简单地测试它们的提示的 SHA平等:

[ "$(git rev-parse <refA>)" = "$(git rev-parse <refB>)" ]

运行此命令后,如果&lt;ref1&gt;&lt;ref2&gt;是偶数,则$?的值为0,否则为1。因为这个命令只涉及到管道 Git 命令git-rev-parse,所以它可以安全地以编程方式使用。

一个分支是在另一个分支之前还是之后?

如果您想模拟 GitHub 的功能,例如打印

foo 是在 bar 之前的 n 次提交

等等,你可以使用下面的脚本:

#!/bin/sh

# git-checkeven.sh
#
# Check whether two revisions are even, and, otherwise, to what extent
# the first revision is ahead of / behind the second revision
#
# Usage: git checkeven <revA> <revB>
#
# To make a Git alias called 'checkeven' out of this script,
# put the latter on your search path, and run
#
#   git config --global alias.checkeven '!sh git-checkeven.sh'

if [ $# -ne 2 ]; then
    printf "usage: git checkeven <revA> <revB>\n\n"
    exit 2
fi

revA=$1
revB=$2

nA2B="$(git rev-list --count $revA..$revB)"
nB2A="$(git rev-list --count $revB..$revA)"

if [ "$nA2B" -eq 0 -a "$nB2A" -eq 0 ]; then
  printf "$revA is even with $revB\n"
  exit 0
elif [ "$nA2B" -gt 0 ]; then
  printf "$revA is $nA2B commits behind $revB\n"
  exit 1
else
  printf "$revA is $nB2A commits ahead of $revB\n"
  exit 1
fi

测试

假设一个玩具仓库具有以下历史:

... -- * [release71]
        \
         * [master, develop]

然后,在定义了一个名为checkeven 的 Git 别名来调用上面的脚本之后,你会得到...

$ git checkeven release71 develop
release71 is 1 commits behind develop
$ git checkeven develop release71
develop is 1 commits ahead of release71
$ git checkeven master develop
master is even with develop

【讨论】:

  • 没问题!感谢您的脚本!
【解决方案2】:

简答

if [ $(git rev-parse develop) == $(git rev-parse feature/SPRINT_WSMR_UPDATES) ]; 
then 
    echo "branches are the same"
fi

说明

git rev-parse develop 将返回分支的哈希值。

# git rev-parse develop
c400a9bfb08458f693a1cd05cf7999f6c5b523d2

您可以使用哈希来比较两个分支。当您使用子模块在分支相同的情况下做一些特别的事情时,这很有趣。例如,如果您想切换到开发分支,如果您的所有子模块的功能分支都相同......

与子模块一起使用

git submodule foreach '[ $(git rev-parse develop) == $(git rev-parse feature/SPRINT_WSMR_UPDATES) ] && git checkout develop || : '

分解

  • git submodule foreach 'cmd' 将在每个子模块中运行 cmd
  • [ $(git rev-parse develop) == $(git rev-parse feature/SPRINT_WSMR_UPDATES) ] 测试“确实发展”的真相 哈希是否匹配特征的哈希?”。
  • &amp;&amp; git checkout develop 只会在真实陈述为 是的。
  • || : 确保整个命令将返回 true,以便 foreach 命令不会在分支不同时终止。

【讨论】:

    【解决方案3】:

    您可以使用git branch --remotes --list --all -vv 检查本地和远程所有分支的相等性,这将向您显示所有分支以及它们所在的位置。在我的仓库中,你看到它们都是@1ba393b

    git 分支 --remotes --list --all -vv

    * Develop              1ba393b [origin/Develop] Merge remote-tracking branch into Master
    Master                 1ba393b [origin/Master] Merge remote-tracking branch into Master
    Release                1ba393b [origin/Release] Merge remote-tracking branch into Master
    remotes/origin/Develop 1ba393b Merge remote-tracking branch into Master
    remotes/origin/HEAD    -> origin/master
    remotes/origin/Master  1ba393b Merge remote-tracking branch into Master
    remotes/origin/Release 1ba393b Merge remote-tracking branch into Master
    

    正如其他人暗示的那样,你可以把它变成一个 git 别名。我不太使用 bash,我在 windows 命令或 PowerShell 中操作。以下工作在那里。您的环境可能需要一个小的语法洒来执行下面的 SO 帖子的“更多信息”链接将说明其中的一些。在 git 与脚本或批处理中创建别名意味着无论您使用什么 shell,别名都可用。

    git config --global alias.equal '!git branch --remotes --list --all -vv' 
    

    将使您成为通过 git equal 别名进行相等检查的快捷方式。equal 可以是别名。{anyAvailable}。 More Info.

    【讨论】:

      【解决方案4】:

      要将位于 GitHub 上名为 branch 的分支的文件与同一存储库上的 master 进行比较,您可以使用 git diff

      git diff origin/branch origin/master
      

      以下将用于比较两个分支之间的提交

      git log --left-right --graph --cherry-pick --oneline origin/branch...origin/master
      

      正如我在上面的评论中提到的,两个分支可能有相同的文件但不同的提交。

      【讨论】:

      • 这看起来很有希望。它会自动远程检查还是我应该先获取?
      • 必须先做一个git fetch,因为比较将在远程分支的本地副本上进行。
      • 因为听起来他对细节不感兴趣——你可以使用git diff --name-only作为第一个例子。
      • 看看this SO article,里面塞满了这样的东西。您的问题似乎不同,不会重复。
      【解决方案5】:

      比较提交哈希

      如果要检查两个分支是否完全等价,只需比较提交哈希即可:

      -> git branch -v
        master                       0ccca51 Commencing the awesome
                                     ^^^^^^^
      
      -> git fetch
      -> git branch -v -r
        origin/master                0ccca51 Commencing the awesome
                                     ^^^^^^^
        origin/other                 0ccca51 Commencing the awesome
                                     ^^^^^^^
      

      如果提交哈希匹配 - 分支既不领先也不落后,它们完全相同。

      【讨论】:

        猜你喜欢
        • 2021-11-23
        • 1970-01-01
        • 2017-08-06
        • 1970-01-01
        • 2023-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多