2011-12-10 41 views
1

我正在研究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”,这里是发生了什么事情:git format-patch:我怎样才能让它忽略已经合并的提交?

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

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

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

回答

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)分支。唯一可能导致问题的方式是,如果您下游的其他存储库取决于已删除或重命名的分支。但是在通常情况下,一个地方特色分支是没有人从中抽出的,当你准备向上游提交时,没有什么可担心的。因此,如果樱桃采摘的建议听起来不错,那么可以这样做,并删除旧版本的功能分支。

相关问题