2013-09-24 6 views
8

Morgen alle, Lassen Sie uns sagen, dass ich eine Reihe von Commits haben wie folgt:ein einzelnes Commit von einem "git diff"

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

Ich weiß, ich

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

einen Patch zu erzeugen, verwenden kann, ein System von abc000 zu def555 zu aktualisieren.

Aber was, wenn ich wollte (aus Gründen zu langweilig zu bekommen) auszuschließen def333 aus dem Patch - wie kann ich das tun? Beachten Sie, dass ich def333 nicht zurücksetzen möchte, es ist nur so, dass ich nicht möchte, dass der Patch dieses Commit enthält.

Dank

Antwort

1

Ich würde sagen, Sie einen neuen Zweig erstellen, die Commits kirsch holen Sie brauchen, und tun dann das DIFF

7

Eigentlich allegit diff s sind Festschreibungspaarweise: die oben vergleicht die Bäume/Dateien in abc000 gegen die in def555. Wenn zum Beispiel def333 ändert dir/file aber es gibt keine Änderungen an dir/file zwischen abc000 und def555 (beispielsweise die Veränderung der def333 wird durch etwas auf dem Weg aufgehoben) nicht dir/file dort überhaupt sehen könnte.

Im Allgemeinen aber in def333 vorgenommenen Änderungen dir/file in einer Art und Weise verändert haben, die bis zeigt, wenn in abc000 gegen die in def555 die Version zu vergleichen. So werden Sie wahrscheinlich diese Änderung sehen.

Der einfachste Weg, um ein Diff zu erhalten, das zeigt "wie def555 würde aussehen, wenn def333 wurden zurückgesetzt" ist genau das: Erstellen Sie einen Baum (auf einem temporären Zweig) mit der Änderung zurückgesetzt. Um es zu tun mit einem tatsächlichen Namen Zweig, könnten Sie so etwas tun:

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 

Was passiert, wenn Sie nicht über einen temporären Zweig wollen? Nun, das ist trivial: Erschaffe einfach keinen. Holen Sie sich eine „frei stehende HEAD“ wie oben, führen Sie den Revert, wie oben, und dann git checkout somebranch. Es gibt keinen temporären Zweig zu löschen, mit Ausnahme der namentlich nicht eine, die git warnt, dass Sie hinter verlassen ... was genau das, was Sie wollten.

+1

Sie könnten auch 'revert --no-commit' verwenden, dann würden Sie überhaupt keine Verzweigung (oder gelösten Kopf) benötigen und nichts zurücklassen. – Bergi

+0

@Bergi: true (obwohl du dann 'git reset --hard' brauchst, um den Arbeitsbaum zu säubern, wenn du fertig bist). – torek

3

Es ist nicht möglich, git diff und ein oder mehr Commits auszuschließen. Sie müssen einen neuen Zweig erstellen, die unerwünschten Commits rückgängig machen, dann die Unterschiede rückgängig machen und ein Patch erstellen:

p.s. Ich wollte Toreks Antwort nicht zu sehr metzeln, also schrieb ich eine neue, die meiner Meinung nach prägnanter ist.

0

Sie könnten versuchen, Git Rebase -i und dann die Commit, die Sie nicht benötigen, zu löschen. Eine andere Möglichkeit besteht darin, die Commits auszuwählen, die Sie in einem anderen Zweig benötigen.