GitHub网页界面有一个很好的功能,告诉我一个分支是否与master
分支一致。
是否有与此功能等效的命令行?我使用多个存储库,我正在寻找快速查看分支是否均匀或需要注意的方法。
以下是GitHub网页界面的截图,供有关此功能的人士使用:
答案 0 :(得分:12)
分支
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