Jak uniknąć piekła typu merge-commit w GitHub / BitBucket

101

Kończymy z wieloma takimi zatwierdzeniami w naszym repozytorium:

Merge branch 'master' of bitbucket.org:user/repo

Dzieje się tak za każdym razem, gdy programista synchronizuje swój lokalny fork z repozytorium najwyższego poziomu.

Czy w ogóle można uniknąć zaśmiecania całego dziennika repozytorium przez to piekło łączenia i zatwierdzania? Czy można ich w jakiś sposób uniknąć, inicjując żądania ściągnięcia?

Wiem, że mogę wykonać git rebase, jeśli jest to zrobione tylko na mojej lokalnej maszynie wirtualnej, czy jest jakaś równoważność w interfejsie użytkownika GitHub / BitBucket?

Jak wy to robicie?

Niklas9
źródło

Odpowiedzi:

136

Przebuduj gałęzie elementów przed połączeniem

Jeśli chcesz uniknąć scalania zatwierdzeń, musisz upewnić się, że wszystkie zatwierdzenia są szybkie do przodu. Robisz to, upewniając się, że gałąź funkcji ponownie bazuje na twojej linii rozwoju przed scaleniem, jak poniżej:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase ma również wiele flag, w tym interaktywne ponowne bazowanie za pomocą -iflagi, ale możesz tego nie potrzebować, jeśli zachowujesz tak proste, jak to możliwe i chcesz zachować całą historię gałęzi po scaleniu.

Użyj --ff-onlyflagi

Oprócz zmiany bazy, użycie --ff-onlyflagi zapewni, że dozwolone są tylko zatwierdzenia szybkiego przewijania do przodu. Zatwierdzenie nie zostanie wykonane, jeśli byłoby to zatwierdzenie scalające. Strona podręcznika git-merge (1) mówi:

- tylko ff

Odmawiaj scalenia i wyjdź ze statusem niezerowym, chyba że bieżący HEAD jest już aktualny lub scalenie można rozwiązać jako przyspieszenie do przodu.

Todd A. Jacobs
źródło
1
To świetna odpowiedź. Używam rebase tak często, jak to możliwe. Nie wiedziałem jednak o fladze --ff-only. Całkiem fajne!
Leo Correa
3
Dzięki za porady dotyczące rebase i --ff-only. Jednak, jak powiedziałem w moim pytaniu, jak mogę to zrobić w interfejsie użytkownika GitHub / BitBucket?
Niklas9
3
@Niklas Jestem prawie pewien, że będziesz musiał skorzystać z CLI, aby robić, co chcesz. GitHub nie ujawnia pełnej mocy Git; tylko podzbiór jego funkcji oraz kilka dodatkowych wartości graficznych i społecznościowych. Powodzenia!
Todd A. Jacobs
3
Jedną rzeczą, na którą należy zwrócić uwagę w tym procesie, jest to, że przed scaleniem gałęzi tematu (feature / foo) z powrotem do mastera, lepiej git pull origin master (jeśli używasz zdalnego), aby upewnić się, że główna gałąź jest aktualna . Jeśli znaleziono aktualizacje, pamiętaj, aby ponownie umieścić wzorzec w gałęzi tematycznej przed scaleniem go z powrotem do głównego.
chikamichi
19
@CodeGnome nie nazywaj tego „uciekaniem się” do CLI ... w rzeczywistości powinieneś ostrzegać przed „uciekaniem się” do interfejsu użytkownika!
Droogans,
9

„Todd A. Jacobs” wspomniany już „rebase” jest tutaj koncepcją. To jest po prostu bardziej szczegółowy sposób robienia rzeczy.

Powiedzmy, że jesteś na gałęzi głównej

$ git branch
  * master

Chcesz naprawić, więc stwórz „fixbranch”, który jest rozgałęziony od mastera

$ git checkout -b fixbranch

Może pracowałbyś kilka dni w tej gałęzi i miał kilka zmian.

Dzień, w którym chciałeś przekazać swoje zatwierdzenia do centralnego repozytorium głównego! Checkout master i uzyskaj najnowsze zmiany z centralnego repozytorium głównego

$ git checkout master
$ git pull origin master

Przebuduj swój fixbranch z głównym, aby mieć czystą historię i rozwiązywać konflikty, jeśli występują, w samym lokalnym repozytorium.

$ git checkout fixbranch
$ git rebase master

Teraz fixbranch jest zaktualizowany do głównego mastera, pozwól mi połączyć fixbranch z master branch

 $ git checkout master
 $ git merge fixbranch

Skończyłem! pozwól, że popchnę lokalnego mistrza do głównego mistrza

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Kondal Kolipaka
źródło
Doceniam tę odpowiedź.
lasec0203