Łączenie wielu commitów przed naciśnięciem w Git [duplicate]

To pytanie ma już odpowiedź tutaj:

Mam kilka commitów w moim lokalnym repozytorium, które są podobne tematycznie. Chciałbym połączyć je w jeden commit przed przeniesieniem do pilota. Jak to zrobić? Myślę, że rebase robi to, ale nie mogę zrozumieć doktorów.

Author: muudscope, 2011-08-04

8 answers

To, co chcesz zrobić, jest określane jako "zgniatanie" w git. Istnieje wiele opcji, gdy robisz to (zbyt wiele?) ale jeśli chcesz połączyć wszystkie swoje nieużywane commity w jeden commit, zrób to:

git rebase -i origin/master

Spowoduje to wyświetlenie edytora tekstu (-i jest "interaktywny") z plikiem, który wygląda tak:

pick 16b5fcc Code in, tests not passing
pick c964dea Getting closer
pick 06cf8ee Something changed
pick 396b4a3 Tests pass
pick 9be7fdb Better comments
pick 7dba9cb All done

Zmień wszystkie pick na squash (lub s) z wyjątkiem pierwszego:

pick 16b5fcc Code in, tests not passing
squash c964dea Getting closer
squash 06cf8ee Something changed
squash 396b4a3 Tests pass
squash 9be7fdb Better comments
squash 7dba9cb All done

Zapisz plik i wyjdź z edytora. Następnie kolejny edytor tekstu otworzy się, aby umożliwić Ci połączenie komunikatów commitów ze wszystkich commitów w jedną dużą wiadomość commit.

Voila! Wygooglowanie "Git squashing" da ci wyjaśnienie wszystkich innych dostępnych opcji.
 496
Author: Leopd,
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-08-25 21:28:50

Jeśli masz partie commitów i chcesz wycisnąć tylko ostatnie x commity, znajdź identyfikator commita, od którego chcesz zacząć zgniatać i wykonaj

git rebase -i <that_commit_id>

Następnie postępuj zgodnie z opisem w odpowiedzi, zmieniając wszystkie pickna squashes z wyjątkiem pierwszego.

 57
Author: Noich,
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-01-22 09:28:35

Jest tu sporo działających odpowiedzi, ale znalazłem to najłatwiejsze. To polecenie otworzy Edytor, w którym możesz po prostu zastąpić pick przez squash, aby usunąć/połączyć je w jeden

git rebase -i HEAD~4

Gdzie, 4 jest liczbą commitów, które chcesz zgnieść w jeden. To jest wyjaśnione tutaj, jak również.

 26
Author: vikas027,
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
2016-10-05 23:16:09

Możesz to zrobić za pomocą git rebase -i, przekazując rewizję, której chcesz użyć jako'root':

git rebase -i origin/master

Otworzy okno edytora pokazujące wszystkie commity wprowadzone po ostatnim commicie w origin/master. Możesz odrzucić commity, podzielić commity na pojedyncze commity lub edytować poprzednie commity.

Istnieje kilka zasobów, które prawdopodobnie mogą wyjaśnić to w lepszy sposób i pokazać inne przykłady:

Http://book.git-scm.com/4_interactive_rebasing.html

I

Http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

To pierwsze dwie dobre strony, które mogłem znaleźć.

 24
Author: Justin Weiss,
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
2011-08-04 00:08:57

Wymyśliłem

#!/bin/sh

message=`git log --format=%B origin..HEAD | sort | uniq | grep -v '^$'`
git reset --soft origin
git commit -m "$message"

Łączy, sortuje, unifikuje i usuwa puste linie z komunikatu commit. Używam tego do lokalnych zmian na github wiki (używając Golluma)

 10
Author: ruediste,
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-27 20:55:56

A moim sposobem na squashing wielokrotne push jest (być może wcisnąłeś do swojej gałęzi wiele commitów i teraz chcesz wykonać pull request i nie chcesz zaśmiecać ich wieloma commitami, które już wypchnąłeś). Sposób, w jaki to robię (żadna inna prostsza opcja, o ile mogę powiedzieć, nie jest).

  1. Utwórz nową gałąź ze względu na squash (gałąź z oryginalnej gałęzi, do której chcesz pobrać żądanie).
  2. popchnij nowo utworzoną gałąź.
  3. Merge branch with commits (already pchnięty) do nowego oddziału.
  4. Rebase nowa gałąź i squash.
  5. wypchnij nową gałąź.
  6. Utwórz nowe żądanie pull dla nowej gałęzi, która ma teraz pojedynczy commit.

Przykład:

git checkout from_branch_you_wish_to_pull_request_to
git checkout -b new_branch_will_have_single_squashed_commit
git push -u new_branch_will_have_single_squashed_commit
git merge older_branch_with_all_those_multiple_commits
git rebase -i (here you squash)
git push origin new_branch_will_have_single_squashed_commit

Możesz teraz pobrać żądanie do from_branch_you_wish_to_pull_request_to

 5
Author: Tomer Ben David,
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-11-15 12:21:44

Możesz squashować (dołączyć) commity za pomocą interaktywnej Rebase. Jest całkiem fajny film na YouTube, który pokazuje, jak to zrobić w linii poleceń lub za pomocą SmartGit :

Jeśli jesteś już użytkownikiem SmartGit, możesz wybrać wszystkie wychodzące commity (przytrzymując klawisz Ctrl) i otworzyć menu kontekstowe (kliknij prawym przyciskiem myszy), aby usunąć swoje commity.

Jest bardzo wygodny:

Tutaj wpisz opis obrazka

Jest też bardzo ładny tutorial z Atlassian który pokazuje jak to działa:

 4
Author: Benny Neugebauer,
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-11-10 17:01:07

Prawdopodobnie chcesz użyć interaktywnego Rebasingu , który jest szczegółowo opisany w tym linku.

Możesz znaleźć inne dobre zasoby, jeśli szukasz "Git rebase interactive".

 1
Author: Greg Hewgill,
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-10-26 10:03:04