从“git diff”中排除单个提交

18

大家早上好, 假设我有一系列如下的提交:

  • abc000
  • def111
  • abc222
  • def333
  • abc444
  • def555

我知道可以使用

$ git diff -c --binary abc000..def555 > /tmp/abc000_def555.patch

生产一个补丁,将系统从abc000升级到def555。

但是如果我想要(由于一些无聊的原因),排除 def333 怎么办?请注意,我并不想撤销def333,只是不想让这个补丁包含这个提交。

谢谢

5个回答

11

实际上,所有的git diff都是基于提交对的比较:以上比较了abc000中的树/文件与def555中的树/文件。例如,如果def333更改dir/file,但在abc000def555之间没有对dir/file进行任何更改(例如,def333中的更改被路径中的其他更改抵消),则可能根本看不到dir/file

然而,通常情况下,def333中的更改会以一种在将abc000版本与def555版本进行比较时显示出更改的方式改变dir/file。因此,您可能会看到该更改。

获取显示“如果撤消def333def555将会是什么样子”的差异最简单的方法是这样做:创建一个树(在临时分支上)并将更改撤消。要在实际命名的分支上执行此操作,您可以执行以下操作:

git checkout def555 # by ID, so that you get a "detached HEAD"
git checkout -b temp-branch
git revert --no-edit def333
git diff [options] abc000
git checkout somebranch; git branch -D temp-branch

如果你不想要一个临时分支怎么办?好办:不创建一个即可。像上面一样获取“分离的 HEAD”,执行如上所述的还原操作,然后git checkout somebranch。没有临时分支需要删除,除了git会警告你留下不带名称的那个分支……这正是你想要的。


1
你也可以使用 revert --no-commit,这样你就不需要分支(或分离的 HEAD)了,也不会留下任何东西。 - Bergi
@Bergi: 是的(不过完成后你需要执行 git reset --hard 来清理工作树)。 - torek

7

无法使用 git diff 排除一个或多个提交。您需要创建一个新分支,撤销不想要的提交,然后对其进行差异比较并生成补丁:

git checkout --branch <branch-name>-diff-branch // Create a throwaway branch.
git revert <unwanted-sha> // Get rid of the unwanted commit. Do this as many times as necessary, you cannot revert multiple SHAs at once.
git diff > new.patch // Create your new patch.
git checkout - // Checkout previous branch, nice trick eh?!
git branch --delete --force <branch-name>-diff-branch // Delete the throwaway branch.

顺便说一句,我不想对Torek的答案进行太多修改,所以我发布了一个新的答案,我认为这个答案更加简洁。


2
我建议你创建一个新分支,挑选需要的提交记录,然后执行差异比较操作。

1
你可以尝试使用git rebase -i命令,然后删除不需要的提交。另一种方法是在不同的分支上挑选所需的提交。

0

虽然这是一个老问题,但我需要这样做来直观地检查两个提交之间的差异,并且我想排除一些提交。

我发现最有效和简单的方法是首先使用git-format-patch命令在专用目录中生成所有提交的补丁文件;然后使用一个命令查找并删除那些包含我想要删除的提交编号的文件。最后,我将所有剩余的补丁文件连接成一个单独的文件,这就是OP所要求的。

在Bash的Linux系统上,您可以执行以下操作:

git format-patch --full-index <start-commit>..<end-commit>
mkdir all_patches
mv *.patch all_patches/
cd all_patches/
rm -rf `egrep -lsr "commit1-to-exclude|commit2-to-exclude|commit3-to-exclude" . `
cat * >> final.diff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接