2013-09-24 15 views
8

Rano wszystkich, Powiedzmy mam serię zobowiązuje się następująco:wykluczyć pojedynczy popełnić z "git diff"

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

wiem, że mogę używać

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

produkować łatkę uaktualnić system z abc000 do def555.

Ale co jeśli chciałbym (z powodów nudy, aby dostać się do) wykluczyć def333 z łatki - jak mogę to zrobić? Zauważ, że nie chcę przywracać def333, ale nie chcę, żeby łatka zawierała to zatwierdzenie.

Dzięki

Odpowiedz

1

powiedziałbym utworzyć nowy oddział, wiśnia-wybrać zobowiązuje trzeba i potem zrobić diff

7

Właściwie wszystkiegit diff s są popełnić-parami: powyższe porównuje drzewa/pliki w abc000 w porównaniu z tymi w def555. Jeśli na przykład def333 zmienia dir/file ale istnieją żadne zmiany dir/file między abc000 i def555 (na przykład zmiana def333 jest anulowana przez coś po drodze), że nie może zobaczyć dir/file tam w ogóle.

Generalnie jednak zmiany dokonane w def333 będzie zmieniły dir/file w sposób, który pokazuje się przy porównywaniu wersji w abc000 przeciwko jednej w def555. Będziesz więc prawdopodobnie zobaczyć tę zmianę.

Najłatwiej dostać Diff, który pokazuje „co def555 będzie wyglądać jeśli def333 zostały przywrócone” jest nie tylko to: tworzenie drzewa (tymczasowo) z oddziału zmiany cofnięte. Aby to zrobić z rzeczywistą nazwaną gałęzią, możesz zrobić coś takiego:

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 

Co zrobić, jeśli nie chcesz odgałęzienia temp? To trywialne: po prostu nie rób tego. Zdobądź "odłączoną głowicę" jak powyżej, wykonaj przywrócenie, jak wyżej, a następnie git checkout somebranch. Nie ma żadnej tymczasowej gałęzi do usunięcia, z wyjątkiem nienazwanego, który git ostrzeże cię, że odchodzisz ... właśnie tego chciałeś.

+1

Możesz także użyć 'revert --no-commit', wtedy nie potrzebujesz wcale gałęzi (lub odłączonej głowy) i niczego nie zostawisz. – Bergi

+0

@Bergi: true (chociaż będziesz musiał "git reset --hard" wyczyścić drzewo robocze po zakończeniu). – torek

3

Nie można dokonać git diff i wykluczyć jednego lub więcej zatwierdzeń. Musisz utworzyć nowy oddział, przywrócić niepożądane zatwierdzenia, a następnie zmienić i utworzyć poprawkę:

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. 

p.s. Nie chciałem zbytnio rzeźnić odpowiedzi na torze, więc napisałem nowy, który uważam za bardziej zwięzły.

0

Możesz spróbować użyć git rebase -i, a następnie usunąć zatwierdzenie, którego nie potrzebujesz. Innym sposobem jest wybór najbardziej potrzebnych kreacji w innej gałęzi.

Powiązane problemy