git format-patch:如何让它忽略已经合并的提交?

时间:2011-12-10 08:33:20

标签: git merge commit patch

我正在研究my copy of the perl repository on github并创建了一个名为“perl-d-add-tests-2”的分支,用于进行一些更改,我提交了一些提交。我在上游提交了这些提交,并将它们应用于“blead”(主要的perl开发分支)。我从上游存储库中取出,并从blead进行了“git merge”到“perl-d-add-tests-2”,现在我又尝试在那里运行“git format-patch blead”,这里发生了什么:< / p>

shlomif@telaviv1:~/Download/unpack/perl/p5/git/perl$ git st
# On branch perl-d-add-tests-2
nothing to commit (working directory clean)
shlomif@telaviv1:~/Download/unpack/perl/p5/git/perl$ git diff blead | cat
shlomif@telaviv1:~/Download/unpack/perl/p5/git/perl$ git format-patch blead
0001-Made-c-line_num-working-again.patch
shlomif@telaviv1:~/Download/unpack/perl/p5/git/perl$ 

可以看出,“git format-patch”仍然会生成已经应用的提交。 WTF?

如何防止“git format-patch”这样做?我只想要进行独特的更改,之前当它发生时,我被告知打开另一个分支并从那里“git cherry-pick”提交,但显然这个解决方案无法扩展,因为它会丢弃我的存储库中的分支。

1 个答案:

答案 0 :(得分:2)

一个简单的选择是以不包含较旧的已经应用的方式指定您想要的提交。引用提交的一般语法可以在git help rev-parse中找到;在这种情况下,例如,说“我当前分支上的最后5次提交”看起来像

git format-patch HEAD~5

另一种可能性是针对当前perl-d-add-tests-2分支重新定位blead功能分支。 IIRC,您在此分支上的早期工作在应用于blead时被意外压缩为单个提交,因此在这种情况下,您可能需要进行比预期更多的手动清理。如果你想尝试这种方法,我建议在一次性分支上进行,所以如果情况不好,你不会丢失任何东西。

# pull in upstream changes:
git checkout blead
git pull

# create and switch to a new branch "tmp":
git checkout -b tmp perl-d-add-tests-2

# rebuild this branch against your current "blead" branch:
git rebase blead

如果您喜欢结果,可以使用临时分支代替功能分支:

# delete current feature branch:
git branch -d perl-d-add-tests-2

# rename the temporary branch back to the feature branch's name
git branch -m tmp perl-d-add-tests-2

# switch to the recreated feature branch:
git checkout perl-d-add-tests-2

# generate patches against blead:
git format-patch blead

请注意,在git rebase blead步骤中,您还可以使用-i选项,以交互方式指定要重新应用到blead当前提示的提交。这将打开你的$EDITOR提交重新申请的议程;如果你沿着这条路走下去,你可能想要明确删除那个已经应用于上游blead的议程中的提交。

最后,你说为此创建一个新的分支无法扩展,因为你会使用不需要的分支丢弃你的存储库。但是,Git很高兴您可以随时重命名(git branch -m)或删除(git branch -d)分支。唯一可能导致问题的方法是,您下游的其他存储库是否依赖于已删除或重命名的分支。但是,在一个本地功能分支的常见情况下,没有人会从中获取,并且您计划在准备就绪时向上游提交,没有什么可担心的。因此,如果挑选樱桃的建议听起来不错,那么您可以这样做,并删除功能分支的旧版本。