早上好, 假设我有一系列提交如下:
我知道我可以使用
$ git diff -c --binary abc000..def555 > /tmp/abc000_def555.patch
生成一个补丁,将系统从abc000升级到def555。
但是,如果我想(因为理由变得沉闷)从补丁中排除 def333怎么办?我该怎么做?请注意,我不想还原def333,只是因为我不希望补丁包含此提交。
由于
答案 0 :(得分:8)
实际上所有 git diff
都是提交对的:上面将abc000
中的树/文件与def555
中的树/文件进行比较。如果例如def333
更改了dir/file
,但dir/file
和abc000
之间的def555
没有变更(例如def333
的更改已取消一路走来的东西)你可能根本看不到dir/file
。
但一般情况下,def333
中所做的更改会以dir/file
中的版本与abc000
中的版本进行比较时显示的方式改变def555
。所以你可能会看到这种变化。
获取差异的最简单方法是显示“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会警告你要留下......这正是你想要的。
答案 1 :(得分: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.
P.S。我不想过多地屠杀torek的答案,所以我发布了一个我觉得更简洁的新答案。
答案 2 :(得分:2)
我会说你创建了一个新的分支,挑选你需要的提交,然后做差异
答案 3 :(得分:1)
你可以尝试使用git rebase -i然后删除你不需要的提交。另一种方法是在不同的分支上挑选你需要的提交。
答案 4 :(得分: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