git格式补丁:如何让它忽略已经合并的提交?

git格式补丁:如何让它忽略已经合并的提交?,git,merge,commit,patch,Git,Merge,Commit,Patch,我正在研究并创建了一个名为“perl-d-add-tests-2”的分支,用于做一些更改,在这里我提交了一些提交。我向上游提交了这些提交,并将它们应用到“blead”(perl开发的主要分支)中。我从上游存储库中提取,并将“git合并”从blead合并到“perl-d-add-tests-2”,现在我再次尝试在那里运行“git格式补丁blead”,结果如下: shlomif@telaviv1:~/Download/unpack/perl/p5/git/perl$ git st # On bran

我正在研究并创建了一个名为“perl-d-add-tests-2”的分支,用于做一些更改,在这里我提交了一些提交。我向上游提交了这些提交,并将它们应用到“blead”(perl开发的主要分支)中。我从上游存储库中提取,并将“git合并”从blead合并到“perl-d-add-tests-2”,现在我再次尝试在那里运行“git格式补丁blead”,结果如下:

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格式补丁”仍然会生成已经应用的提交。WTF


如何防止“git格式补丁”这样做?我只想要唯一的更改,以前当它发生时,我被告知打开另一个分支并从那里“git cherry pick”提交,但显然这个解决方案无法扩展,因为它会使我的存储库中充斥着分支。

一个简单的选项是,指定您想要的提交,但不包括较旧的提交,已经应用的。引用提交的一般语法可以在
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
)分支。唯一可能导致问题的方法是,您下游的其他存储库依赖于已删除或重命名的分支。但在一般情况下,没有人会从本地功能分支中提取功能,并计划在准备就绪后向上游提交,因此无需担心。因此,如果你觉得挑选樱桃的建议不错,你可以这样做,并删除旧版本的功能分支