2010-09-15 11 views
57

Próbuję dowiedzieć się, jak skutecznie używać Git i zastanawiam się, jak powinienem (dobra praktyka/złą praktyką?) Rozwiązać następujący przypadek:Move popełnia od matrycy na gałęzi za pomocą git

powiedzieć, że mają następujący łańcuch zatwierdzeń master:

  • początkowe popełnienia
  • Commit 1
  • Commit 2
  • Commit 3

Potem zdaję sobie sprawę, że to, co zostało zrobione w dwóch ostatnich zgłoszeniach, jest całkowicie błędne i muszę ponownie zacząć od Commit 1. Pytania:

  • Jak mam to zrobić?
  • Czy mogę przenieść Commit 2 i 3 do osobnej gałęzi, aby zachować na przyszłość (powiedzmy, że nie były wcale takie złe) i kontynuować pracę z Commit 1 na master?

Odpowiedz

70
git branch tmp   # mark the current commit with a tmp branch 
git reset --hard Commit1 # revert to Commit1 

SO odpowiedzieć "What's the difference between 'git reset' and 'git checkout' in git?" jest dość pouczający dla tego rodzaju operacji

alt text

git reset --hard HEAD~2 zrobi to samo (bez konieczności odzyskać SHA1 dla Commit1 najpierw).

Od Commit2 i Commit3 są nadal odniesienia przez Git ref (tutaj oddziału), można nadal do nich wrócić w dowolnym momencie (git checkout tmp).


Właściwie Darien wspomina w komentarzach (dotyczących ruchu Commit2 i Commit3 do innego oddziału):

Przypadkowo zaangażowana w złym oddziale, to niech mi go przenieść, czy:

git checkout correctbranch 
git rebase tmp 
git branch -d tmp 

Działa tutaj, ponieważ początkowa gałąź została zresetowana do Commit1, co oznacza, że ​​git rebase tmp odtworzy każdy commit po Commit1 (a więc tutaj Commit2 i Commit3) do nowego "correctbranch".

+0

Dzięki! Po prostu obserwacja: W gitk gałąź tmp się nie pokazuje. Czy nie powinno tak być, ponieważ Commit1 jest wspólny dla obu oddziałów? – Paul

+5

@Paul: czy próbowałeś "' gitk - all' "? – VonC