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



我正在处理我在github上的perl存储库的副本,并创建了一个名为"perl-d-add-tests-2"的分支来做一些更改,在那里我已经提交了一些提交。我在上游提交了这些提交,它们被应用到"lead"(主要的perl开发分支)中。我从上游存储库中提取,并从"git合并"到"perl-d-add-tests-2",现在我又试着在那里运行"git format-patch lead",下面是发生的事情:

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 help rev-parse中找到;在这种情况下,例如,说"我当前分支上的最后5次提交"看起来像

git format-patch HEAD~5

另一种可能性是根据当前的blead分支重新设置perl-d-add-tests-2特征分支。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)分支。唯一可能导致问题的情况是,您的下游其他存储库依赖于已删除或重命名的分支。但是对于没有人从本地特性分支中提取,并且您计划在准备好后提交到上游的常见情况,没有什么可担心的。所以,如果这个建议听起来不错,你可以这样做,并删除旧版本的特性分支。

最新更新