2015-07-13 1 views
6

Kiedy prowadzę dochodzenie w sprawie błędu, czasami nie pracuję ostrożnie, szczególnie gdy przekopuję kilka gałęzi z wieloma zatwierdzeniami.Jak wyeliminować niepotrzebne skrypty w repozytorium Git?

Mam nadzieję, że gdy już skończę, scalam wynik roboczy z moim oddziałem głównym z git merge yeah_i_got_it. Oto co mój repozytorium może wyglądać w takich sytuacjach:

v There is a bug here 
A---B---C----------------------------------------------F (master) 
    \            /
     o---o---o--o--o (bug)      /
       \         /
       o---o--o--o (oups_this_way_better)/
        \  v Clean a bit  /
         o---D---E------------------o (yeah_i_got_it)  
         ^  
          Solved the bug here 

Ostatecznie Spodziewam się zachować tylko niektóre istotne rewizje na koniec dnia:

A--B--C--D--F (master) 

Jeśli chodzi o resztę, to jest po prostu śmieci i nie potrzebuję tego. Jaki jest najlepszy sposób na uporanie się z tym nieprzyjemnym przepływem pracy?

Ponieważ Git zachowuje wszystko, nawet po usunięciu wszystkich gałęzi ze śmieciami, użyteczną opcją dla Git byłoby nadanie ważnej flagi przy każdym zatwierdzeniu, aby pomóc mi wyczyścić moje repozytorium po biegu. W moich repozytoriach mogę zidentyfikować bezużyteczne commity, commity, które mogą być przydatne pewnego dnia, zobowiązuje, które z pewnością będą przydatne i, co najważniejsze, bardzo ważne zobowiązania, które muszę zachować wraz z ich oddziałami.

Pozbycie się niepotrzebnych zobowiązań zwykle zajmuje mi dużo czasu. Będę musiał przejrzeć mój log z powrotem, zidentyfikować te, które chcę wyeliminować i wykonać pracę bez żadnego błędu.

Więc moje pytanie brzmi:

Jak prawidłowo wyeliminować tymczasowe zobowiązuje i gałęzie z moich repozytoriów Git definitywnie?

Oto kilka przypadkowych myśli:

  • Moja pracy jest po prostu złe, nigdy nie powinna pracować w taki sposób.
  • Wystarczy dodać prefiks do każdego komentarza tymczasowego, takiego jak "śmieci" lub "śmieci".
  • Rozwiązanie rodzimy Git mogą istnieć które mogą mi pomóc, aby wykonać zadanie jak git rebase-and-clean yeah_i_got_it --keep D
+3

można zgnieść wszystkie swoje „śmieci” zobowiązuje się w jeden commit. Potencjalnie lepiej, można wybrać wiśnia zobowiązuje które chcesz. –

+0

”... Jestem czasami nie działa ostrożnie ... "Napraw to, a większość powiązanych problemów zniknie ... – twalberg

Odpowiedz

2

Sposób na zrobienie tego, o co prosisz, to sprawdzenie mastera w C, a następnie zrobienie git merge --squash yeah_i_got_it. Spowoduje to zwinięcie całej gałęzi w jedno zatwierdzenie.

Innym sposobem byłoby rebase-interaktywne zatwierdzenia, z git rebase -i master z oddziału yeah_i_got_it. W interaktywnym rebase można oznaczyć E jako "fixup". Jeśli komunikat zatwierdzenia rozpoczął się od "fixup!" i masz ustawione odpowiednie opcje konfiguracji git, a następnie oznaczenie zostanie wykonane automatycznie.

Uwaga: mówisz, że chcesz A-B-C-D-F, ale myślę, że właściwie chcesz tylko A-B-C-D. Nie ma potrzeby zatwierdzania "F".

0

The repo's current situation (full of garbage commits)

można zgnieść wszystkie te zobowiązuje się jednym z zatwierdzeń, które trzeba. użyciu

git rebase -i <your first garbage commit id>

During a rebase operation Wypełnij rebase, rozwiązać, jeśli istnieją problemy scalania.

+0

Czy możesz rozwinąć swoją odpowiedź, jak to zrobić? – doelleri

1

Przed scaleniem do głównego resetu wszystkie twoje zatwierdzenia (ponieważ większość z nich i tak jest bezużyteczna).

git reset $(git merge-base --fork-point master) 

Następnie dodaj swoje zmiany do indeksu w spójny sposób. Oznacza to, że należy dodać zmiany, aby każda zmiana mogła być opisana w jednym wierszu. W ten sposób nie potrzebujesz wielu wbudowanych komentarzy, ale raczej polegaj na komentarzu zatwierdzenia.

Zmiany mogą być dodawane linia po linii, w razie potrzeby stosując

git add -p 

Po zakończeniu przebazować na suwak (jeśli Master przeniesiony), a następnie łączy się, (I wolą nie szybko- do przodu łączą się pokazać, jak mistrz faktycznie zmieniło.

git rebase master 
git checkout master 
git merge --no-ff @{-1} 
+0

Yay do resetowania i dodawania! – jthill