Pytanie Jak modyfikować istniejące, nieusunięte zatwierdzenia?


Napisałem niewłaściwą wiadomość zatwierdzenia. Ewentualnie zapomniałem dołączyć kilka plików.

Jak mogę zmienić komunikat / pliki commit? Zatwierdzenie jeszcze nie zostało zepchnięte.


7680
2017-10-07 15:44


pochodzenie


Dla tych, którzy są trochę nowi w gitarze: punkt Laurie dotyczący tego, że jeszcze nie pchnął, jest ważny. Podobnie jak w przypadku zmiany, zmienia się historia. Jeśli ktoś sklonował / wyciągnął z twojego repozytu pomiędzy historią oryginalną i przepisaną, nie będzie w stanie wyciągnąć po przepisaniu (dla tej gałęzi). - Pat Notz


Odpowiedzi:


Zmienianie najnowszej wiadomości zatwierdzenia

git commit --amend

otworzy twój edytor, umożliwiając zmianę komunikatu zatwierdzenia ostatniego zatwierdzenia. Ponadto możesz ustawić komunikat zatwierdzenia bezpośrednio w wierszu poleceń za pomocą:

git commit --amend -m "New commit message"

... może to jednak spowodować, że komunikaty zatwierdzania wielowierszowego lub drobne poprawki będą bardziej uciążliwe.

Upewnij się, że nie masz żadnych zmian w kopii roboczej wystawiany na scenie zanim to zrobisz, albo oni też się zaangażują. (Niezarejestrowany zmiany nie zostaną zatwierdzone.)

Zmienianie komunikatu zatwierdzenia, które już zostało przesłane do zdalnego oddziału

Jeśli już przekazałeś swój commit do odległego oddziału, to będziesz trzeba zmusić przepchnąć commit z:

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

Ostrzeżenie: naciśnięcie przycisku force spowoduje nadpisanie gałęzi zdalnej stanem lokalnym. Jeśli w oddziale zdalnym istnieją zatwierdzenia, których nie posiadasz w swoim lokalnym oddziale, ty będzie stracić te zobowiązania.

Ostrzeżenie: zachowaj ostrożność w kwestii poprawek, które już udostępniasz innym osobom. Zmieniające się zobowiązuje zasadniczo przepisuje mają inne SHA Identyfikatory, które stanowią problem, jeśli inne osoby mają kopie starego zatwierdzenia, które przepisałeś. Każdy, kto ma kopię starego zatwierdzenia, musi zsynchronizować swoją pracę z nowo napisanym zatwierdzeniem, co czasem może być trudne, więc upewnij się, że koordynujesz pracę z innymi przy próbie przepisania historii udostępnionych commitów lub po prostu unikaj przepisywania wspólnych zatwierdzeń całkowicie.


Użyj interaktywnego rebase

Inną opcją jest użycie interaktywnego rebase.
Pozwala to edytować dowolną wiadomość, którą chcesz zaktualizować, nawet jeśli nie jest to najnowsza wiadomość.

Aby zrobić git squasha, wykonaj następujące kroki:

// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X

Gdy już zgniatasz swój atak - wybierz e/r do edycji wiadomości

enter image description here

Ważna uwaga na temat Interactive rebase

Kiedy używasz git rebase -i HEAD~X Tam może być jeszcze niż X popełnia. Git "zbierze" wszystkie zatwierdzenia w ostatnim X Zobowiązuje się i jeśli nastąpiło scalenie gdzieś pomiędzy tym zasięgiem, zobaczysz także wszystkie zatwierdzenia, więc wynikiem będzie X +.

Dobra wskazówka:

Jeśli musisz zrobić to dla więcej niż jednej gałęzi i możesz napotkać konflikty podczas zmiany treści, skonfiguruj git rerere i niech git automatycznie rozwiąże te konflikty.


Dokumentacja


14802
2018-02-08 04:26



jednak git commit --amend nie jest tak potężny jak git rebase -i. - Jeffrey Jose
@jeffjose, to zdecydowanie nie musi być. Również, git commit --amend może naprawić główne zatwierdzenie (a?). - strager
Jeśli już popchnąłeś, po prostu ponownie naciśnij: git push -f origin branchname - hughes
@hughes nie jest git push -f trochę niebezpieczne, jeśli inne osoby używają tego samego repozytorium? - Armand
Jeśli nie chcesz przepisywać całego komunikatu zatwierdzenia, przejdź do git commit --amend -c HEAD. Spowoduje to otwarcie edytora wypełnionego wcześniejszym komunikatem o zatwierdzeniu, aby można było go zmienić. - Sam


git commit --amend -m "your new message"

2415
2017-10-07 19:52



Zrobiłem git commit --amend -m "New message", ale przejście do Github wygenerowało "Scalenie zdalnych zmian przed ponownym naciśnięciem". Po wykonaniu polecenia pull ,amend i push ponownie nowa wiadomość nie pojawi się. Zamiast tego mam "master gałęzi gałęzi" github.com:[myrepo] " - Dave Everitt
@DaveEveritt najprawdopodobniej popchnąłeś swój commit upstream, zanim spróbujesz go naprawić. - Thorbjørn Ravn Andersen
@Kyralessa nie jest prawdą. W bashu możesz łatwo tworzyć komunikaty multiline commit, nie zamykając cytatu, dopóki nie skończysz (trafiając na końcu każdej linii w cudzysłowie). - hobs
Nie rozumiem, jak odpowiedź, która wygląda jak główna idea odpowiedzi napisanej dwa lata temu, a także przyjęta odpowiedź dostaje tak wiele głosów. Dziwne. (nic jednak nie jest z odpowiedzią) - happy coder
@AmalMurali, cóż. Chodzi mi nie tyle o popularność pytania, ani o użyteczność odpowiedzi. Ale ta konkretna odpowiedź nie jest najstarszą odpowiedzią, ani nie daje więcej wglądu w zaakceptowaną odpowiedź. Wydaje się być kopią sekcji zaakceptowanej odpowiedzi. To był mój punkt widzenia. TWOJE ZDROWIE! - happy coder


Jeśli zatwierdzenie, które chcesz naprawić, nie jest najnowszym:

  1. git rebase --interactive $parent_of_flawed_commit

    Jeśli chcesz naprawić kilka wadliwych zatwierdzeń, przekaż rodzicowi najstarszego z nich.

  2. Pojawi się redaktor z listą wszystkich zatwierdzeń od tej, którą dałeś.

    1. Zmiana pick do reword (lub na starych wersjach Git, na edit) przed wszelkimi zobowiązaniami, które chcesz naprawić.
    2. Po zapisaniu, Git będzie odtwarzać wymienione zatwierdzenia.
       

  3. Dla każdego zatwierdzenia, które chcesz przeredagować, Git przeniesie Cię z powrotem do twojego edytora. Dla każdego zatwierdzenia, które chcesz edytować, Git wrzuca cię do muszli. Jeśli jesteś w powłoce:

    1. Zmień zatwierdzenie w dowolny sposób.
    2. git commit --amend
    3. git rebase --continue

Większość tej sekwencji zostanie objaśniona w zależności od wyników poszczególnych poleceń. To bardzo proste, nie musisz go zapamiętywać - pamiętaj o tym git rebase --interactive pozwala poprawiać zatwierdzenia bez względu na to, jak dawno temu były.


Zauważ, że nie będziesz chciał zmieniać już zatwierdzonych cięć. A może tak, ale w takim przypadku będziesz musiał bardzo uważać, aby komunikować się ze wszystkimi, którzy mogli wyciągnąć twoje zobowiązania i wykonali pracę nad nimi. Jak mogę odzyskać / ponownie zsynchronizować, gdy ktoś popchnie bazę danych lub reset do opublikowanej gałęzi?


2297
2017-08-15 21:20



Czy można zmienić komunikat pierwszego zatwierdzenia (który nie ma rodzica)? - 13ren
Jest to wspomniane w jednej z pozostałych odpowiedzi, ale zapiszę to tutaj. Od git 1.6.6 można używać reword zamiast pick aby edytować komunikat dziennika. - MitMaro
Nawiasem mówiąc, $parent_of_flawed_commit jest równa $flawed_commit^. - Peeja
Nigdy nie rób tego (ani nie zmieniaj w ogóle), jeśli już wypchnąłeś upstream! - Daniel Rinser
Posługiwać się -p (--preserve-merges) jeśli nastąpiło scalenie po błędnym zatwierdzeniu. - ahven


Aby zmienić poprzednie zatwierdzenie, wprowadź żądane zmiany i wykonaj te zmiany, a następnie uruchom

git commit --amend

Spowoduje to otwarcie pliku w edytorze tekstu reprezentującym nowy komunikat zatwierdzenia. Zaczyna się wypełniać tekst ze starej wiadomości zatwierdzenia. Zmień komunikat zatwierdzania, jak chcesz, a następnie zapisz plik i zamknij edytor, aby zakończyć.

Aby zmienić poprzednie zatwierdzenie i zachować ten sam komunikat dziennika, uruchom

git commit --amend -C HEAD

Aby naprawić poprzednie zatwierdzenie, usuwając je całkowicie, uruchom

git reset --hard HEAD^

Jeśli chcesz edytować więcej niż jeden komunikat zatwierdzenia, uruchom

git rebase -i HEAD~commit_count

(Zastąpić commit_count z liczbą zatwierdzeń, które chcesz edytować.) To polecenie uruchamia twój edytor. Oznacz pierwszy commit (ten, który chcesz zmienić) jako "edytuj" zamiast "wybierz", a następnie zapisz i wyjdź z edytora. Wprowadź zmianę, którą chcesz zatwierdzić, a następnie uruchom

git commit --amend
git rebase --continue

Uwaga: Możesz "dokonać zmiany, którą chcesz" także z edytora otwartego przez git commit --amend


750
2018-06-06 21:16



git rebase -i HEAD~commit_count pozwoli Ci również zmienić komunikaty zatwierdzania z wielu wybranych przez Ciebie zatwierdzeń. Zaznacz wybrane zmiany jako "reword" zamiast "pick". - Joe
Co zrobić, jeśli nie chcesz dokonać ponownego wyboru? Chcesz tylko zmienić starszą wiadomość? - SuperUberDuper
git reset --hard unicestwia niezatwierdzone zmiany. Proszę wymienić --hard z --soft. - eel ghEEz


Jak już wspomniano, git commit --amend jest sposobem na zastąpienie ostatniego zatwierdzenia. Jedna uwaga: jeśli chcesz również nadpisać pliki, polecenie będzie

git commit -a --amend -m "My new commit message"

381
2017-09-01 20:35



A jeśli nie chcesz dodawać wszystkiego, możesz to zrobić git add file.ext to po prostu git commit --amend - MalcolmOcean


Możesz również użyć git filter-branch za to.

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

To nie jest tak łatwe, jak trywialne git commit --amend, ale jest to szczególnie przydatne, jeśli masz już połączenia po błędnym komunikacie o zatwierdzeniu.

Zauważ, że to spróbuje przepisać KAŻDY commit pomiędzy HEAD i wadliwe zatwierdzenie, więc powinieneś wybrać swoje msg-filter polecenie bardzo mądre ;-)


346
2018-01-10 14:23



Czy istnieje wersja tego, która nie zmienia zatwierdzenia, jeśli regex niczego nie znajdzie? - sjakubowski
AFAIK filter-branch --msg-filter będzie generował nowe zatwierdzenia w każdym przypadku. Można jednak sprawdzić w msg-filter, czy sed udało się i użyć tych informacji, gdy kończy się działanie gałęzi filtru, aby zresetować drzewo do refs / original. - Mark
@DavidHogue Jest to prawdziwe tylko w przypadku użycia metody branch-branch. Identyfikatory zatwierdzenia po zmodyfikowanym zatwierdzeniu nie zmieniają się, jeśli korzystasz z interaktywnego rebase. - Mark
@ Mark Tak, oni muszą, muszą. Odliczenia są zależne od poprzednich zatwierdzeń. Gdyby się nie zmieniły, git byłby bezużyteczny. - Miles Rout
Potrzebujesz $flawed_commit^..HEAD, nie $flawed_commit..HEAD. jak podaje strona man: "Polecenie będzie przepisywać tylko dodatnie referencje wspomniane w linii poleceń (np. Jeśli przełączysz a..b, tylko b zostanie przepisane).» - Ángel


Wolę w ten sposób.

git commit --amend -c <commit ID>

W przeciwnym razie pojawi się nowe zatwierdzenie z nowym identyfikatorem zatwierdzenia


306
2017-11-08 03:51



Dla mnie, użycie powyższego polecenia powoduje utworzenie nowego zatwierdzenia z nowym identyfikatorem zatwierdzenia oraz dodatkowym zatwierdzeniem, które mówi "gałąź scalania" jako domyślny komunikat zatwierdzenia. - Jan
Zmieniam zawsze tworzy nowe zatwierdzenie z nowym identyfikatorem zatwierdzenia. Identyfikator zatwierdzenia to skrót SHA zawartości zatwierdzenia, w tym komunikat zatwierdzenia i sygnatury czasowe utworzone / zatwierdzone. Jest to funkcja Git, która, poza kolizjami hash, zapewnia, że ​​dwa zatwierdzenia z tym samym identyfikatorem są dokładnie tym samym zatwierdzeniem, z dokładnie taką samą zawartością, historią i tak dalej. - Emil Lundberg
Zgadzam się z Emilem. Dodatkowo, czytając dokumenty - wydaje się, że wszystkie "-c" mówią gitowi, że wiadomość commit jest używana jako domyślna / szablon dla twojego nowego commitu. Naprawdę już to robi "-c <commit ID>" domyślnie , więc nie trzeba go określać. - Gal
The -c robi kilka rzeczy. Domyślnie używa starej wiadomości, ale kopiuje również informacje o autorze (osoba i czas). -C robi to samo, oprócz tego, że nie prosi o edycję wiadomości. - Joseph K. Strauss
Podobnie jak @SantanuDey, to nie działało dla mnie. mam fatal: Option -m cannot be combined with -c/-C/-F/--fixup. - Andrew Grimm


Jeśli używasz narzędzia Git GUI, znajduje się przycisk o nazwie zmień ostatnie zatwierdzenie. Kliknij ten przycisk, a następnie wyświetli twoje ostatnie pliki zatwierdzenia i wiadomość. Po prostu zredaguj tę wiadomość i możesz ją zatwierdzić za pomocą nowego komunikatu zatwierdzenia.

Lub użyj tego polecenia z konsoli / terminalu:

git commit -a --amend -m "My new commit message"

304
2018-01-22 17:23