早上全部,假设我有一系列提交,如下所示:
- 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/file
但abc000
和def555
之间没有更改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