15

おはようございます、次のような一連のコミットがあるとしましょう。

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

私は私が使用できることを知っています

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

システムを abc000 から def555 にアップグレードするためのパッチを作成します。

しかし、(入り込むのが退屈な理由で) def333 をパッチから除外したい場合はどうすればよいでしょうか? どうすればよいでしょうか? def333 を元に戻したくはないことに注意してください。パッチにこのコミットを組み込みたくないというだけです。

ありがとう

4

5 に答える 5

9

実際、すべて git diffの はコミット ペア単位です。上記は のツリー/ファイルと のツリー/ファイルを比較していabc000ますdef555。たとえば、変更されたが、 との間にdef333変更dir/fileがない場合(たとえば、 の変更が途中でキャンセルされた場合) 、そこにはまったく表示されない可能性があります。dir/fileabc000def555def333dir/file

ただし、一般に、 で行われた変更は、 のバージョンと のバージョンを比較したときに表示される方法で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 diff1 つ以上のコミットを除外することはできません。新しいブランチを作成し、不要なコミットを元に戻し、それを比較してパッチを作成する必要があります。

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 に答える