Jak używać git merge -- squash?

Mam zdalny serwer Git, oto scenariusz, który chcę wykonać:

  • Dla każdego błędu/funkcji tworzę inną gałąź Git

  • Wciąż zatwierdzam mój kod w tej gałęzi Git z nie-oficjalnymi wiadomościami Git

  • W górnym repozytorium musimy wykonać jeden commit dla jednego błędu z oficjalną wiadomością Git

Więc jak Mogę scalić moją gałąź do zdalnej gałęzi, aby dostali tylko jeden commit dla wszystkich moich check-in (nawet chcę podaj komunikat commit)?

Author: naXa, 2011-03-15

6 answers

Powiedz, że Twoja gałąź Naprawy Błędów nazywa się bugfix i chcesz połączyć ją z master:

git checkout master
git merge --squash bugfix
git commit

Pobierze wszystkie commity z gałęzi bugfix, podzieli je na 1 commit i połączy z Twoją gałęzią master.


Wyjaśnienie :

git checkout master

Przełącza się na Twoją master gałąź.

git merge --squash bugfix

Pobiera wszystkie commity z gałęzi bugfix i łączy ją z bieżącą gałęzią.

git commit

Tworzy pojedynczy commit z połączonego zmiany.

Pominięcie parametru -m pozwala zmodyfikować wersję roboczą komunikatu zatwierdzającego zawierającego każdą wiadomość ze squashed commit przed sfinalizowaniem commita.

 1340
Author: abyx,
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-04-24 16:23:18

Chcesz połączyć z opcją squash. Jeśli chcesz to zrobić z jedną gałęzią na raz.

git merge --squash feature1

Jeśli chcesz scalić wszystkie gałęzie w tym samym czasie co pojedyncze commity, najpierw zmieniaj interakcję i squashuj każdą funkcję, a następnie merguj octopus:

git checkout feature1
git rebase -i master

Połącz w jeden commit, a następnie powtórz dla innych funkcji.

git checkout master
git merge feature1 feature2 feature3 ...
To ostatnie połączenie jest "ośmiornicą", ponieważ łączy wiele gałęzi na raz.

Hope this helps

 88
Author: Adam Dymitruk,
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
2013-08-15 15:07:12

To, co w końcu mi to wyjaśniło, to komentarz pokazujący, że:

git checkout main
git merge --squash feature

Jest odpowiednikiem robienia:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

Kiedy chcę połączyć gałąź funkcji z 105 (!! nie chcę git rebase -i origin/master, ponieważ muszę oddzielnie rozwiązywać konflikty scalania dla każdego z pośrednich commitów (a przynajmniej tych, których git sam nie potrafi rozgryźć). Użycie git merge --squash daje mi pożądany wynik pojedynczego commita do scalania cała gałąź funkcji. I muszę tylko zrobić co najwyżej jedno ręczne rozwiązywanie konfliktów.

 84
Author: dankohn,
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
2014-08-19 15:59:21

Jeśli masz już git merge bugfix na main, możesz zmiażdżyć commit merge w jeden za pomocą:

git reset --soft HEAD^1
git commit
 20
Author: qwertzguy,
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
2015-03-13 17:50:29

Połącz newFeature gałąź do master z niestandardowym commitem:

git merge --squash newFeature && git commit -m 'Your custom commit message';

Jeśli zamiast tego zrobisz

git merge --squash newFeature && git commit

Otrzymasz komunikat commit, który będzie zawierał wszystkie commity gałęzi newFeature, które możesz dostosować.

 6
Author: Vagelis Prokopiou,
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-03-17 11:10:32

For Git

Utwórz nową funkcję

Via Terminal / Shell:

git checkout origin/feature/<featurename>
git merge --squash origin/feature/<featurename>

To nie zatwierdza go, pozwala najpierw go przejrzeć.

Następnie zatwierdź i zakończ funkcję z nowej gałęzi i usuń/zignoruj starą (tę, na której napisałeś).

 0
Author: Demian Berisford-Maynard,
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-12 15:14:14