Jak zmienić zatwierdzenie bez zmiany komunikatu zatwierdzenia (ponowne użycie poprzedniego)?

657

Czy istnieje sposób na zmianę zatwierdzenia bez wyskakiwania vi(lub twojego $EDITOR) z opcją modyfikacji wiadomości zatwierdzenia, ale po prostu ponownego użycia poprzedniej wiadomości?

Sridhar Sarnobat
źródło
6
Głosowałem za własnym pytaniem po tym, jak dowiedziałem się, jak bardzo zło się poprawia.
Sridhar Sarnobat,
28
Tak długo, jak przestrzegasz pewnych zasad (takich jak nie zmienianie czegoś, co już zostało popchnięte), nie ma powodu, dla którego poprawianie musi być złe.
paullb
3
Zmiany zobowiązań nie powinny być wykorzystywane do przerywanego wykonywania pracy podczas jednej logicznej zmiany. W tym celu powinieneś zatwierdzić lokalnie poprawnie, a następnie zgnieść historię zatwierdzeń po zakończeniu (@ Sridhar-Sarnobat)
DBCerigo
3
Całkowicie się zgadzam @DBCerigo. Jedyną sytuacją, w której uznaję zmianę za przydatną, jest to, że zapomniałem wprowadzić plik do poprzedniego zatwierdzenia (np. Ponieważ jest nowy i dlatego nie uruchamia się automatycznie po uruchomieniu git commit -a) i chcę zatwierdzić go z mocą wsteczną.
Sridhar Sarnobat
1
Kolejna zmiana jest przydatna, nawet jeśli zdajesz sobie sprawę z niebezpieczeństw związanych ze zmianą historii, jeśli jesteś niezadowolony z ostatniej wiadomości zatwierdzenia i chcesz przeredagować ją bez konieczności zmiany bazy.
Sridhar Sarnobat

Odpowiedzi:

1011

Od wersji git 1.7.9 możesz także używać git commit --amend --no-edit aby uzyskać swój wynik.

Zauważ, że nie będzie to obejmować metadanych z drugiego zatwierdzenia, takich jak znacznik czasu, który może, ale nie musi być dla ciebie ważny.

Shaggie
źródło
42
Możesz także ułatwić ustawienie domyślne na flagę --no-edit, dodając alias: „popraw = zatwierdz -a --amend - no-edit”
Jherico
1
@Jherico Sugeruję usunięcie -a.
Wykonuj
120

git commit -C HEAD --amendzrobi co chcesz. -COpcja pobiera metadane z innego popełnić.

Andy Ross
źródło
15
Żeby dodać odpowiedź Andy'ego. Jeśli robisz to często, możesz ustawić dla niego alias git config --global alias.amend 'commit --amend -C HEAD'. Następnie możesz użyć go git amendjako skrótu.
mikej
9
No dalej, nie bądź leniwy, uaktualnij git i użyj wbudowanego polecenia sugerowanego przez Shaggle! Plus jeden dla opcji -C.
Dimitris Baltas,
4
Nie tylko znacznik czasu, ale także informacje o autorze!
user1338062,
3
@RyanCastner Rzeczywiście, komentarz, do którego się odnosisz, pochodzi z 2013 roku. W wersji git, którą aktualnie uruchomiłem --amend, nawet bez żadnej innej opcji, zachowuje datę autora (ale zmienia datę zatwierdzenia). W związku z tym usunąłem mój stary komentarz.
Ruben Verborgh
2
W rzeczywistości ta odpowiedź jest cenna w inny sposób, nawet jeśli nie jest to odpowiedź zaakceptowana. W przeciwieństwie do innych odpowiedzi, nie musisz używać —amend. Możesz utworzyć nowe zatwierdzenie, ale użyć tej samej wiadomości co poprzednie zatwierdzenie. Może to nie wydawać się przydatne, ale domyślnie komunikat zatwierdzenia, gdy —message=“Work in progress (untested)”
zapisuję
67

Inną (głupią) możliwością jest git commit --amend <<< :wqposiadanie vi (m) as $EDITOR.

galva
źródło
39
Nawet jeśli nie jest to konieczne w tym przypadku użycia, nie zdawałem sobie sprawy, że możesz utworzyć potok do vima. To otwiera intrygujące możliwości. Świetna wskazówka.
Sridhar Sarnobat
6
... <<< ZZmoże jeszcze mniej pisać;)
Ruslan
6
.. i jeszcze mniej - ... <<< :x:)
skwisgaar
3
Nie wydaje mi się, żeby to było głupie. Jest to świetny sposób na poprawę przepływu pracy dla każdego polecenia, które otwiera vi.
B, 7
12
potrójne kątowniki. to coś nowego.
oligofren
16

Aby rozszerzyć zaakceptowaną odpowiedź, możesz również:

git commit --amend --no-edit -a

aby dodać aktualnie zmienione pliki.

Rambatino
źródło
11

Użycie zaakceptowanej odpowiedzi do utworzenia aliasu

 oops = "!f(){ \
    git add -A; \
    if [ \"$1\" == '' ]; then \
        git commit --amend --no-edit; \
    else \
        git commit --amend \"$@\"; \
    fi;\
}; f"

to możesz zrobić

git oops

i doda wszystko i poprawi za pomocą tego samego komunikatu

lub

git oops -m "new message"

zmienić, zastępując wiadomość

aljgom
źródło