W git, jaka jest różnica między merge --squash i rebase?

Jestem nowy w git i staram się zrozumieć różnicę między squash i rebase. Jak rozumiem, podczas rebazy wykonujesz squasha.

Author: GiH, 2010-03-11

3 answers

Zarówno git merge --squash jak i git rebase --interactive mogą stworzyć" zgnieciony " commit.
Ale służą innym celom.

Wytworzy zgnieciony commit na gałęzi docelowej, bez zaznaczania relacji merge.
(Uwaga: nie tworzy commita od razu: potrzebujesz dodatkowego git commit -m "squash branch")
Jest to przydatne, jeśli chcesz całkowicie wyrzucić gałąź źródłową, idąc z (schematu pobranego z więc pytanie):

 git checkout stable

      X                   stable
     /                   
a---b---c---d---e---f---g tmp

Do:

git merge --squash tmp
git commit -m "squash tmp"

      X-------------------G stable
     /                   
a---b---c---d---e---f---g tmp

A następnie usunięcie tmp gałęzi.

Powtarza niektóre lub wszystkie commity na nowej bazie, pozwalając na squash (lub ostatnio "fix up", zobacz to więc pytanie), przechodząc bezpośrednio do:

git checkout tmp
git rebase -i stable

      stable
      X-------------------G tmp
     /                     
a---b

Jeśli zdecydujesz się zmiażdżyć wszystkie commity tmp (ale w przeciwieństwie do merge --squash, możesz odtworzyć niektóre, A zmiażdżyć inne).

Więc różnice są:

  • merge nie dotyka Twojej gałęzi źródłowej (tmp tutaj) i tworzy pojedynczy commit tam, gdzie chcesz.
  • rebase pozwala przejść na tę samą gałąź źródłową (nadal tmp) z:
    • nowa baza
    • a cleaner history
 291
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:15

Merge squash łączy drzewo (sekwencję commitów) w jeden commit. Oznacza to, że squashuje wszystkie zmiany dokonane w N commity w jeden commit.

Rebasing to ponowne bazowanie, czyli wybór nowej bazy (commit nadrzędny) dla drzewa. Może termin mercurial na to jest bardziej jasny: nazywają to przeszczepem, ponieważ chodzi o to, że: wybranie nowego podłoża (commit rodzic, korzeń) dla drzewa.

Wykonując interaktywną rebase, masz możliwość albo squash, pick, Edytuj lub Pomiń zmiany, które zamierzasz zmienić.

Mam nadzieję, że to było jasne!

 69
Author: Mauricio Scheffer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-11 18:15:41

Merge commity: zachowuje wszystkie commity w Twojej gałęzi i przeplata je z commitami w gałęzi bazowej Tutaj wpisz opis obrazka

Merge Squash: zachowuje zmiany, ale pomija poszczególne commity z historii Tutaj wpisz opis obrazka

Rebase: przenosi całą gałąź feature do początku na końcu gałęzi master, skutecznie włączając wszystkie nowe commity w master

Tutaj wpisz opis obrazka

Więcej o tutaj

 64
Author: Md Ayub Ali Sarker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-31 13:34:59