2017-07-30 89 views
2

在我的项目中有一个stable分支和一个dev分支。承诺从dev分支挑选到stable分支。git cherry:如何通过提交消息识别等价提交

为了筛选dev所有未提交合并到stable的提交,git cherry -v stable dev看起来是不错的选择。然而,通过差异,通常解决中cherry-pick合并冲突后改变标识等价:

等价测试是基于差异,删除空白 和行号之后。 git-cherry因此通过git-cherry-pick(1),git-am(1)或git-rebase(1)检测提交已被“复制”的提交。

我想知道是否有像git cherry一样的任何命令,但通过提交消息标识等效提交?

+0

如果你只是想清理'dev'分公司为了不具有多次提交反复变化,你可以做'git的变基stable'。当然,那么你必须清理所有的冲突。 –

+0

你有没有强迫推'dev'? – max630

+0

@ max630不是。 'dev'分支受gerrit保护。 – lz96

回答

1

似乎有做这个没有直接的方法,所以我写了一个简短的脚本:

#!/bin/bash 
git cherry -v stable dev | grep + | cut -d ' ' -f 3- > /tmp/unmerged 
xargs -a /tmp/unmerged -I{} git --no-pager log stable --pretty=oneline --grep {} | cut -d ' ' -f 2- > /tmp/cherry-picked 
diff /tmp/unmerged /tmp/cherry-picked 

说明

git cherry -v stable dev | grep + | cut -d ' ' -f 3- > /tmp/unmerged 写道承诺,只有在dev存在提交的信息科。这些提交包括那些已被挑选并更改为stable分支的提交,并且我们需要在下一步中过滤掉这些提交。

xargs -a /tmp/unmerged -I{} git --no-pager log stable --pretty=oneline --grep {} | cut -d ' ' -f 2- > /tmp/cherry-pickedstable中输出出现的消息(1)出现时具有相同的消息。换句话说,/tmp/cherry-picked存储所有被挑选并从dev更改为stable的提交。

最后,diff /tmp/unmerged /tmp/cherry-picked给出了在dev上的所有提交,其中在stable上没有发现具有相同提交消息的提交。

+0

依靠提交消息是脆弱的,使用'patch-id'是正确的方式,如果你想以'git cherry'的方式匹配提交' –

0

如果dev中的提交没有重定位,那么您可以使用git cherry-pick -x,明确标记源。没有自动使用这些信息,但有一些bash fu可以使用它。

0

您想使用patch-id。这是git cherry使用的机制。

要查找提交3642151运行的等效:

git show 3642151 | git patch-id

你应该得到一个符合两个散列;第一是patchid(电话 它PATCHID_FROM_ABOVE

git log -p | git patch-id | grep PATCHID_FROM_ABOVE

这应该给你的是对应于patchid所有提交的清单。

被盗来源:http://git.661346.n2.nabble.com/git-cherry-to-find-equivalent-commit-IDs-td3440883.html

+0

在'cherry-pick'期间解决冲突后,提交的差异可能会改变,这就是为什么在这种情况下'git cherry'或'git patch-id'不起作用。 – lz96

+0

你为什么问“我想知道有没有像git cherry一样的命令?”? –