Czy absolutnie konieczna jest praca nad kilkoma błędami jednocześnie? I przez „od razu” mam na myśli „edytowanie plików pod kątem wielu błędów jednocześnie”. Ponieważ chyba, że jest to absolutnie potrzebne, pracuję tylko nad jednym błędem na raz w twoim środowisku. W ten sposób możesz korzystać z lokalnych oddziałów i bazy danych, co uważam za znacznie łatwiejsze niż zarządzanie złożoną skrytką / sceną.
Powiedzmy, że master jest w zatwierdzeniu B. Teraz pracuj nad błędem nr 1.
git checkout -b bug1
Teraz jesteś na gałęzi bug1. Wprowadź zmiany, zatwierdź, poczekaj na sprawdzenie kodu. Jest to lokalne, więc nie wpływasz na nikogo innego i powinno być łatwo zrobić łatkę z git diffs.
A-B < master
\
C < bug1
Teraz pracujesz nad bug2. Idź z powrotem do opanowania z git checkout master
. Utworzyć nowy oddział, git checkout -b bug2
. Wprowadź zmiany, zatwierdź, poczekaj na sprawdzenie kodu.
D < bug2
/
A-B < master
\
C < bug1
Udawajmy, że ktoś inny popełnia E & F na masterie, gdy czekasz na recenzję.
D < bug2
/
A-B-E-F < master
\
C < bug1
Po zatwierdzeniu kodu możesz zmienić jego podstawę w celu opanowania, wykonując następujące czynności:
git checkout bug1
git rebase master
git checkout master
git merge bug1
Spowoduje to:
D < bug2
/
A-B-E-F-C' < master, bug1
Następnie możesz wcisnąć, usunąć lokalny oddział bug1 i gotowe. Jeden błąd na raz w twoim obszarze roboczym, ale przy użyciu lokalnych oddziałów twoje repozytorium może obsłużyć wiele błędów. I to pozwala uniknąć skomplikowanego tańca scenicznego / skrytkowego.
Odpowiedz na pytanie ctote w komentarzach:
Cóż, możesz wrócić do ukrywania każdego błędu i pracować tylko z jednym błędem na raz. Przynajmniej oszczędza to problemu z inscenizacją. Ale po wypróbowaniu tego osobiście uważam to za kłopotliwe. Skrytki są nieco niechlujne na wykresie git log. A co ważniejsze, jeśli coś spieprzysz, nie możesz cofnąć. Jeśli masz brudny katalog roboczy i wyskakujesz skrytkę, nie możesz „cofnąć” tego popu. Znacznie trudniej jest zepsuć już istniejące zatwierdzenia.
Więc git rebase -i
.
Po zmianie podstawy jednej gałęzi na drugą możesz to zrobić interaktywnie (flaga -i). Kiedy to zrobisz, możesz wybrać, co chcesz zrobić z każdym zatwierdzeniem. Pro Git to niesamowita książka, która jest również dostępna online w formacie HTML i ma fajną sekcję na temat zmiany bazy i squashingu:
http://git-scm.com/book/ch6-4.html
Dla wygody ukradnę ich przykład. Udawaj, że masz następującą historię zatwierdzeń i chcesz zmienić bazę i zgnieść błąd1 na master:
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
Oto, co zobaczysz podczas pisania git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Aby zmiksować wszystkie zatwierdzenia gałęzi w jednym zatwierdzeniu, zachowaj pierwszy zatwierdzenie jako „pick” i zamień wszystkie kolejne wpisy „pick” na „squash” lub po prostu „s”. Otrzymasz również możliwość zmiany komunikatu zatwierdzenia.
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
Więc tak, zgniatanie jest trochę uciążliwe, ale nadal zalecałbym to nad intensywnym używaniem skrytek.