/ / Jak zarządzać łączeniem i zmianą w git? - git, merge, rebase

Jak zarządzać łączeniem i rebase w git? - git, merge, rebase

Osiągam cel, by zmienić bazę. To ma dla mnie sens. Zasadniczo mam gałąź z funkcjami, nad którą pracuję i jestem gotowy do umieszczenia jej w gałęzi głównej, zrobiłbym rebase, żeby zgnieść wszystkie moje zatwierdzenia w jeden czysty, tak aby był łatwo zintegrowany z mistrzem bez wszystkich nieporządna historia.

Oto, co robiliśmy.

  1. Utwórz gałąź funkcji
  2. Dodaj paczkę commitów podczas budowania funkcji
  3. Okresowo łącz gałąź główną z gałęzią operacji (aby uniknąć bolesnego scalenia w dół drogi)
  4. Gdy wszystko zostanie zrobione, połącz oddział funkcji z mistrzem

Problem, który widzę, jest okresowypołączenie wzorca w gałąź funkcji powoduje problemy przy ponownym wprowadzaniu, ponieważ teraz mam kilka kontrolek głównych gałęzi wymieszanych wśród moich funkcji sprawdzania.

Jaki jest właściwy przepływ pracy? Gdzie do gry wchodzą następujące komendy:

  • git rebase -i Head ^ #
  • git rebase master
  • git merge
  • git-rerere
  • git reset --hard HEAD ^

Odpowiedzi:

5 dla odpowiedzi № 1

Powinieneś scalać do / z mistrza tylko raz, nakoniec życia oddziału. Idea gałęzi funkcji / tematu polega na tym, że zawiera tylko zmiany dotyczące tej funkcji; tracisz to, gdy wielokrotnie wchodzisz do mistrza. (Możesz przeczytać, co Junio ​​Hamano, opiekun git, mówi o gałęziach.)

Możesz zrobić "praktykę" scalenia, którą wyrzucisz i użyjesz git-rerere aby Git automatycznie nagrywał twoje rezolucje dotyczące scalania, aby można je było ponownie wykorzystać, gdy naprawdę jesteś gotowy do scalenia. Widzieć http://www.kernel.org/pub/software/scm/git/docs/git-rerere.html dla tła i samouczka. To jest naprawdę fajne, ponieważ pozwala ci wykonywać pracę scalenia, nie angażując go w żaden sposób jawnie, a następnie odzyskać tę pracę "magicznie", kiedy naprawdę jesteś gotowy, aby stworzyć scalenie. Zamiast jednego wielkiego, bolesnego scalenia na końcu, możesz zrobić kilka mniejszych, miejmy nadzieję, prostszych, pośrednich "praktyk", scalających po drodze. Z grubsza mówiąc:

# Enable rerere
git config --global rerere.enabled 1
# Start a feature branch
git checkout -b feature
# Hack hack hack
git commit
git commit
# Practice merge
git merge master
# ...then throw the merge commit away, the work is saved by rerere
git reset --hard HEAD^
# Hack hack hack
git commit
# Really merge to master, reusing any saved work from rerere
git checkout master
git merge feature
git branch -d feature

Zobacz też http://progit.org/2010/03/08/rerere.html dla innego samouczka.

Możesz także okresowo odnawiać swoją gałąź tematów nad wzorcem, a następnie po prostu scalać na końcu.

Aby poradzić sobie z taką sytuacją, jak ta, w której obecnie się znajdujesz, z odgałęzieniem tematycznym (powiedzmy nazwanym feature), który ma serię fuzji z głównych mieszanychprzy różnych zatwierdzeniach w toku, najłatwiejszym rozwiązaniem byłoby wykonanie zgniecionego scalenia w celu utworzenia "scalonego" drzewa roboczego, a następnie utworzenie nowego zatwierdzenia (lub serii zatwierdzeń) dla głównej. Na przykład:

git checkout master
git merge --squash feature
git commit

Spowoduje to wygenerowanie pojedynczego zatwierdzenia, które reprezentuje stan drzewa w nagłówku elementu, połączone z wzorcem.

Oczywiście możesz także po prostu wykonać regularne scalanie master za tę zmianę, pozostawiając bałagan w historii feature obecne i po prostu pracuj czysto w przyszłości. np. po prostu

git checkout master
git merge feature

i ruszaj dalej.


3 dla odpowiedzi № 2

Jeśli masz zamiar dokonać reorganizacji (co proponuję cido), a następnie nigdy nie łączą się z mistrzem. Przepływ pracy opartej na rebase opiera się na założeniu, że gałąź tematyczna składa się ze ścieżki od wzorca do nowej funkcji i nic poza tym: kiedy mistrz porusza się do przodu, to twoje zmiany zmierzają w kierunku nowa funkcja porusza się wraz z nim.

Kiedy jesteś gotowy do wprowadzenia zmian w master, masz dwie główne opcje:

  1. Zmierzaj po raz ostatni przeciwko mistrzowi, a potem zróbnormalne szybkie przewijanie do przodu, które zasadniczo powoduje przeniesienie wszystkich twoich oddziałów do mistrza, jeden po drugim, co pozwala zachować bardziej szczegółową historię, ale jeśli pośrednie zatwierdzenia zepsuły kompilację, możesz spróbować ją zmiażdżyć. Interaktywny rebase (-i) może pomóc ustaw te zatwierdzenia.

  2. Użyj komendy merge --squash, aby wykonać pojedyncze zatwierdzenie w master, które zawiera wszystkie zmiany gałęzi.


0 dla odpowiedzi № 3

Jeśli i tak zamierzasz ponownie utworzyć oddział, po prostu zmieniaj jego bazę, kiedy chcesz "scalić" zmiany. Nie musisz zmieniać podstawy + squasha, dopóki nie będziesz gotowy do "scalenia" tej gałęzi z mistrzem.


0 dla odpowiedzi nr 4

Wierzę, że krótka odpowiedź brzmi:

posługiwać się git merge --squash gdyby:

jeśli masz oddział funkcji i ciągnieszz innej gałęzi do gałęzi podczas pracy, na przykład, przełączasz się do funkcji i uruchamiasz okresowo master git, aby połączyć się z gałęzią master. Lub ciągniesz lub popychasz tę gałąź do innych lub do centralnego repo, jak github.

posługiwać się git rebase gdyby:

jeśli masz gałąź funkcji, której nie naciskasz ani nie przyciągasz do innych, i nie scalasz innej gałęzi okresowo, jak opisano powyżej