15

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

  • abc000
  • 定义111
  • abc222
  • 定义333
  • abc444
  • 定义555

我知道我可以使用

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

制作补丁以将系统从 abc000 升级到 def555。

但是,如果我想(出于无聊的原因)从补丁中排除def333 怎么办?我该怎么做呢?请注意,我不想恢复 def333,只是我不希望补丁包含此提交。

谢谢

4

5 回答 5

9

实际上所有 git diffs 都是成对提交的:上面将树/文件abc000def555. 例如,如果def333发生变化但和之间dir/file没有变化(例如,变化被沿途的某些东西抵消了)你可能根本看不到那里。dir/fileabc000def555def333dir/file

但是,一般而言,在将 in 版本与 .in 版本进行比较时,所做的更改会有所def333改变。所以你可能会看到这种变化。dir/fileabc000def555

获得显示“还原后def555会是什么样子”的差异的最简单方法def333就是这样做:创建一棵树(在临时分支上)并还原更改。要使用实际的命名分支来执行此操作,您可能会执行以下操作:

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 会警告您将留下的未命名分支......这正是您想要的。

于 2013-09-24T09:18:24.780 回答
4

不可能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.

ps我不想过多地破坏torek的答案,所以我发布了一个我认为更简洁的新答案。

于 2013-11-11T21:17:12.110 回答
2

我会说你创建一个新分支,挑选你需要的提交,然后做 diff

于 2013-09-24T09:08:54.790 回答
1

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

于 2013-11-19T05:49:30.957 回答
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
于 2021-04-15T11:45:56.920 回答