如何检查两个分支是否是"偶数"?

时间:2015-08-13 08:15:49

标签: git github git-branch

GitHub网页界面有一个很好的功能,告诉我一个分支是否与master分支一致。

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

以下是GitHub网页界面的截图,供有关此功能的人士使用:

enter image description here

enter image description here

5 个答案:

答案 0 :(得分:12)

GitHub术语

  

分支A和分支B是偶数。

是GitHub的用语

  

分支A和分支B指向相同的提交。

这两个分支是否均匀?

如果您只对感兴趣两个分支是否均匀,没有任何其他细节(例如提交计数),那么脚本友好的方式就是简单地测试其提示的SHA为了平等:

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

运行此命令后,如果$?0为偶数,则<ref1>的值为<ref2>,否则为1。因为此命令仅涉及管道Git命令git-rev-parse,所以可以安全地以编程方式使用它。

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

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

  

foo是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]

然后,在定义一个调用上面脚本的名为areeven的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

答案 1 :(得分:8)

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

git diff origin/branch origin/master

以下内容将比较两个分支之间的提交

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

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

答案 2 :(得分:2)

比较提交哈希值

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

call_user_func_array('MyCompany\\Controller\\' . $parameter['_controller'], ['array', 'of', 'common', 'dependencies']);

如果提交哈希匹配 - 分支既不在前面也不在后面,它们完全相同。

答案 3 :(得分: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) ] 测试“确实开发的 散列是否与功能的散列匹配?”。
  • && git checkout develop 仅在真实陈述为 是的。
  • || : 确保整个命令将返回 true 以便 foreach 命令不会在分支不同时终止。

答案 4 :(得分:0)

您可以使用product_cat检查本地和远程所有分支的相等性,这将向您显示所有分支及其位置。在我的仓库中,您看到的都是@ 1ba393b

git branch --remotes --list --all -vv

git branch --remotes --list --all -vv

正如其他人暗示的那样,您可以将其转换为git别名。我在Windows命令或PowerShell中不太使用bash。以下工作在那里。您的环境可能需要少量语法才能执行指向更多信息的“更多信息”链接,下面的内容将与其中的一些人谈谈。在git vs脚本或批处理中创建别名意味着无论使用什么shell,别名都可用。

* 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 config --global alias.equal '!git branch --remotes --list --all -vv' 别名进行相等性检查的快捷方式。等于可以是别名。{anyAvailable}。 More Info.

hth