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



早上全部,假设我有一系列提交,如下所示:

  • ABC000
  • def111
  • ABC222
  • def333
  • ABC444
  • def555

我知道我可以使用

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

生成修补程序以将系统从 ABC000 升级到 Def555。

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

谢谢

实际上所有git diff都是成对提交的:上面比较了abc000中的树/文件与def555中的树/文件。 例如,如果def333更改dir/fileabc000def555之间没有更改dir/file(例如,def333的变化被沿途的某些东西抵消(,您可能根本看不到dir/file

但是,一般来说,def333中所做的更改会改变dir/file,在比较abc000版本中的版本与def555中的版本时显示该更改。 所以你可能会看到这种变化。

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

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

无法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.

附言我不想过多地屠宰托雷克的回答,所以我发布了一个新的,我认为更简洁。

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

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

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

我发现的最有效和最简单的方法是首先使用 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

最新更新