2013-09-24 46 views
8

早上,所有的单个提交, 比方说,我有一系列提交如下:排除从 “git的差异”

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

我知道我可以使用

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

产生补丁的系统从abc000到def555升级。

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

感谢

回答

1

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

7

其实所有git diff s为承诺,成对:上面的比较abc000中的树木/文件与def555中的树木/文件相比较。例如如果def333改变dir/file但也有abc000def555之间dir/file没有改变(例如,在def333的变化是由沿途的东西取消了),你可能看不到dir/file在那里。

在一般情况下,尽管在def333所做的更改都将在abc000对一个在def555比较版本时显示出来的方式加以改变dir/file。所以你会大概看到这种变化。

最简单的方法获取显示“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 

,如果你不希望一个临时分支是什么?那么,这是微不足道的:只是不要创建一个。如上获得“分离的头部”,如上所述进行恢复,然后git checkout somebranch。没有临时分支可以删除,除了那个未命名的分支,git会警告你离开后面......这正是你想要的。

+1

你也可以使用'revert --no-commit',那么你根本就不需要一个分支(或分离的头部),并且什么也不留下。 – Bergi

+0

@Bergi:true(尽管你一旦完成就需要'git reset --hard'来清理工作树)。 – torek

3

这是不可能的git diff并排除一个或多个提交。你必须做一个新的分支,恢复了不必要的提交,然后diff的它,打个补丁:

git checkout -b <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的回答太多,所以我发布了一个我认为更简洁的新文章。

0

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