Jak zmienić istniejące, неопущенные commit?

napisałem złą rzecz w komunikacie zatwierdzenia. Ponadto, zapomniałem dodać jakieś pliki.

Jak mogę zmienić komunikat commit/pliki? Blokada jeszcze nie został naciśnięty.


zmiana ostatniego komunikatu zatwierdzenia

git commit --amend

otworzy się edytor, który pozwala zmienić komunikat commit ostatniego commita. Ponadto, można ustawić komunikat bezpośrednio w wierszu polecenia:

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

...może to jednak zrobić wielowierszowe wiadomości lub nieco bardziej kłopotliwe, aby wejść.

upewnij się, że nie ma żadnych zmian kopia postawił przed tym lub nie też będzie wydany. (Unstaged zmiany nie zostaną zatwierdzone.)

zmiana komunikatu zatwierdzenia, które już kliknięciu na zdalną gałąź

jeśli już spowodowała, że jego zatwierdzenie do zdalnej gałęzi, to będziesz trzeba zmusić nacisnąć blokadę Z:

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

ostrzeżenie: przymusowe naciśnięcie spowoduje nadpisanie zdalną gałąź ze stanem lokalnego. Jeśli nie ma blokady zdalna gałąź, której nie ma w lokalnej gałęzi, stracić tych, którzy łamią.

ostrzeżenie: należy zachować ostrożność ze zmianą commits, które już podzielili się z innymi ludźmi. wprowadzanie zmian dokonuje zasadniczo przepisuje ich, aby mieć różne sha IDs, co stwarza problem, jeśli inni ludzie mają kopie starego zatwierdzenia, które przepisał. Każdy, kto ma kopię starej zatwierdzenia, powinien będzie synchronizować ich praca z twojej niedawno переписанной blokadą, która czasami może być trudne, więc upewnij się, że координируете z innymi podczas próby przerobienia wspólną historię, zatwierdzenia lub po prostu uniknąć przepisywania wspólnych zatwierdzeń.


korzystać z interaktywnych relokacji

inny wariant-korzystać z interaktywnych relokacji.
To pozwala ci edytować dowolną wiadomość, którą chcesz zaktualizować, nawet jeśli nie jest to ostatni post.

do tego, aby zrobić git squash, postępuj zgodnie z tym kroki:

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

jak tylko scrunch swoje commity-wybierz e/r do edycji wiadomości

enter image description here

ważne o interaktywnej ребазе

podczas korzystania z git rebase -i HEAD~XX popełnia. Git będzie "zebrać" wszystkie commity w ostatnim X commits i jeśli było scalenie gdzieś między tym zakresie, zobaczysz wszystkie commity, więc wynik będzie być X+.

dobra rada:

jeśli musisz zrobić to dla więcej niż jednej gałęzi, i można zmierzyć się z konfliktami w przypadku zmiany zawartości, należy skonfigurować git rerere i niech git rozwiąże te konflikty automatycznie dla ciebie.


gorąca końcówka

git commit amend in one go

możesz także napisać małą funkcję bash, aby po prostu zmienić ostatni post git commit i nacisnąć go na pilota. Pomaga mi cały czas. To miejsce funkcja, należy umieścić ją w swój .bashrc lub podobnego .zshrc plik, a następnie ponownie uruchom terminal.

# USAGE: gamend "Your New Commit Msg"
function gamend() {
    git commit --amend -m "[email protected]"
    git push --force
}

dokumentacja


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

podczas blokady, którą chcesz naprawić, nie ostatni:

  1. git rebase --interactive $parent_of_flawed_commit

    jeśli chcesz naprawić kilka błędnych commits przekazać rodzicom najstarszego z nich.

  2. pojawi się edytor z listą wszystkich commits, począwszy od tego, który dałeś.

    1. edytuj pickreword (lub w starszych wersjach Git, to edit) przed wszelkimi zatwierdzeniami, które chcesz naprawić.
    2. po zapisaniu, Git będzie odtwarzać wymienione zmiany.

  3. dla każdego commita, który chcesz edytuj, Git zabierze cię z powrotem do twojego edytora. Dla każdego zatwierdzenia chcesz edit, PIP rzuca cię w zlewie. Jeśli jesteś w powłoce:

    1. zmień blokadę w dowolny sposób.
    2. git commit --amend
    3. git rebase --continue

duża część tej sekwencji wyjaśnij ci wyjście różnych zespołów, jak idziesz. To jest bardzo proste, nie trzeba zapamiętywać to-po prostu pamiętaj, że git rebase --interactive pozwala właściwie sprawia, że niezależnie od tego, jak dawno temu były.


zauważ, że nie chcesz zmieniać commity, które już przeprowadziliśmy. Lub może być u ciebie, ale w tym przypadku trzeba zachować wielką ostrożność, aby komunikować się ze wszystkimi, którzy mogą wyciągnąć popełnia i pracy nad nimi. jak ja naprawić/wykonać ponowną synchronizację po tym, jak ktoś pcha rebase lub reset w opublikowanym oddział?


aby zmienić poprzednią utrwalenie, wprowadź odpowiednie zmiany, a następnie wykonaj te zmiany, a następnie uruchom

git commit --amend

otworzy się plik w edytorze tekstu, który reprezentuje nową wiadomość zatwierdzenia. Zaczyna się od wypełnienia tekstem ze starego wiadomości zatwierdzenia. Zmienić komunikat commit, jak chcesz, a następnie zapisz plik i zamknij edytor, aby zakończyć.

aby zmienić poprzednią utrwalenie i zapisz ten sam komunikat dziennika, uruchom

git commit --amend -C HEAD

aby naprawić poprzednie ustalić, usunięcie go w całości, run

git reset --hard HEAD^

jeśli chcesz edytować więcej niż jednego komunikatu zatwierdzenia, uruchom

git rebase -i HEAD~commit_count

(zamiast commit_count Z ilością commits, które chcesz edytować.) Uruchamia edytor. Zaznacz pierwszą blokadę (tę, którą chcesz zmienić) jak "edytuj" zamiast "wybierz", a następnie zapisz i zamknij edytor. Wprowadź zmiany, które chcesz zablokować, a następnie uruchom

git commit --amend
git rebase --continue

Uwaga: możesz dokonać zmiany chcesz" również z edytora, otwartego git commit --amend


Jak już wspomniano, git commit --amend - to sposób na zastąpienie ostatniego zatwierdzenia. Jedna uwaga: jeśli chcesz również zastąp pliki zespół

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

można również użyć git filter-branch do tego.

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

To nie jest tak proste, jak тривиальную git commit --amend, ale jest to szczególnie przydatne, jeśli masz już pewne korespondencji seryjnej, po błędnego komunikatu zatwierdzenia.

zauważ, że to spróbuje przepisać każdą blokadę między HEAD i wadliwe ustalenie, więc musisz wybrać swój msg-filter zespół jest bardzo mądra ; -)


Ja wole ten sposób.

git commit --amend -c <commit ID>

w przeciwnym razie będzie nowa blokada z nowym identyfikatorem zatwierdzenia


Jeśli używasz narzędzia Git GUI, znajduje się przycisk z nazwą amend last commit. Kliknij na ten przycisk, a następnie pokaże swoje najnowsze pliki zatwierdzenia i komunikat. Po prostu edytuj wiadomość, a możesz zablokować go z nowym komunikatem zatwierdzenia.

lub użyj tego polecenia z konsoli/terminala:

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

można użyć PIP relokacji. Na przykład, jeśli chcesz zmienić back do mocowania bbc643cd, uruchom

$ git rebase bbc643cd^ --interactive

w domyślnym Edytorze zmień "wybierz", "edit", w wierszu, blokadę, którą chcesz zmienić. Wprowadź zmiany, a następnie wykonaj je za pomocą

$ git add <filepattern>

teraz możesz używać

$ git commit --amend

zmień blokadę, a następnie

$ git rebase --continue

aby powrócić do poprzedniego zatwierdzenia głowy.


  1. jeśli chcesz zmienić tylko ostatni komunikat zatwierdzenia, wykonaj:

    git commit --amend
    

    doprowadzi to do tekstowego exitor i pozwoli ci zmienić ostatni post zatwierdzenia.

  2. jeśli chcesz zmienić ostatnie 3 wiadomości, lub jakieś wiadomości do linki, oferty HEAD~3:

    git rebase -i HEAD~3
    

Jeśli chcesz zmienić stare komunikat zatwierdzenia w wielu gałęzi (czyli blokada z błędną informacją jest obecny w wielu gałęziach), można użyć:

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Git tworzy katalog tymczasowy do przepisywania i dodatkowy backup starych linków w refs/original/.

  • -f będzie zapewniać wykonanie operacji. Jest to konieczne, jeśli katalog tymczasowy jest już obecny lub jeśli już posiadasz linki znajdujące się w refs/original. Jeśli nie, możesz zresetować ta flaga.

  • -- oddziela parametry gałęzi filtra od ustawień wersji.

  • --all upewnij się, że wszystkie oddziały a tagi jest zastępowany.

z powodu tworzenia kopii zapasowych twoich starych linków można łatwo wrócić do stanu przed wykonaniem polecenia.

powiedz, że chcesz przywróć swojego mistrza i uzyskaj dostęp do niego w branch old_master:

git checkout -b old_master refs/original/refs/heads/master

użyj

git commit --amend

aby to zrozumieć szczegółowo, świetny post 4. Przepisywanie Historii Git. Mówi też o jeśli nie używać git commit --amend.


edytuj

masz kilka opcji tutaj. Możesz zrobić

git commit --amend

na razie to twój ostatni commit.

interaktywne relokacji

w przeciwnym razie, jeśli to nie jest twój ostatni commit, można zrobić interaktywny relokacji,

git rebase -i [branched_from] [hash before commit]

następnie wewnątrz interaktywnej relokacji po prostu dodać edytować, aby to zrobić. Kiedy on się pojawi, zrób git commit --amend i zmienić komunikat commit. Jeśli chcesz wrócić do tego punktu mocowania, można również korzystać z git reflog i po prostu usunąć tę blokadę. Wtedy po prostu robisz git commit ponownie.


Jeśli używasz Git GUI, można zmienić ostatnią blokadę, która nie zostanie naciśnięty:

Commit/Amend Last Commit

jeśli jest to twój ostatni commit, po prostu edytuj blokada:

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

przez -o (--only flaga), aby upewnić się, że można zmienić tylko commit)


Jeśli to ukryta blokada, użyj niesamowite interaktywne relokacji:

git rebase -i @~9   # Show the last 9 commits in a text editor

znajdź blokadę, którą chcesz zmienić pickr (reword), a także zapisać i zamknąć plik. Gotowe!



miniaturowy Vim poradnik (lub, jak przenieść tylko 8 klawiszy 3jcwr EscZZ):

  • uruchom vimtutor jeśli masz czas
  • hjkl pasują do klawisza nawigacji cytat:
  • wszystkie drużyny mogą mieć przedrostek "zakres", np. 3j przesuwa się w dół 3 wiersze
  • i aby wejść w tryb wstawiania - tekst, który należy wpisać, pojawi się w pliku
  • Esc lub Ctrlc, aby wyjść z trybu wstawiania i wrócić do "normalnego" trybu
  • u w anulować
  • Ctrlr powtórzyć
  • dd,dw,dl usuń wiersz, słowo lub literę, odpowiednio
  • cc,cw,cl zmień wiersz, słowo lub literę odpowiednio (tak samo jak ddi)
  • yy, yw,yl kopiuj ("janka") wiersz, słowo lub literę, odpowiednio
  • p lub P wstaw po lub przed bieżącą pozycją, odpowiednio
  • :w Enter save (zapisz) plik
  • :q! Enter rzucić palenie bez zapisywanie
  • :wq Enter lub ZZ zapisz i wyjdź

jeśli edytujesz tekst dużo, to przełącz się na układ klawiatury Dvoraka, naucz dotykowy typu i poznaj vim. czy warto w to wysiłku? tak.



ProTip™: nie bój się eksperymentować z" niebezpiecznymi " zespołami, które przepisują historię* - Git nie usuwa swoje commity w ciągu 90 dni domyślnie; można je znaleźć w reflog:

$ git reset @~3   # go back 3 commits
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~3
2c52489 [email protected]{1}: commit: more changes
4a5246d [email protected]{2}: commit: make important changes
e8571e4 [email protected]{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

*uważaj się za takimi parametrami, jak --hard a --force chociaż oni mogą rzucać dane.
* poza tym, nie przepisz historię w dowolnych gałęziach, z którymi współpracujecie.


używam Git GUI tyle, ile mogę, i to daje możliwość, aby zmienić ostatnie zatwierdzenie:

Tick that box

a git rebase -i origin/masterTo dobra mantra, która zawsze będzie przedstawić państwu zmiany, które zrobiłeś na master, i daje możliwość modyfikować, usuwać, zmieniać kolejność lub squasha. Nie trzeba najpierw dostać haszysz.


Wow, tak wiele sposobów, aby to zrobić.

jeszcze jeden sposób, aby to zrobić-usunąć ostatnią blokadę, ale zachować ją zmienić, aby nie straciły swoją pracę. Następnie można zrobić jeszcze jedną blokadę z korygującym wiadomość. Będzie to wyglądać mniej więcej tak:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Ja zawsze robię to, jeśli zapominam dodać plik lub wprowadzić zmiany.

pamiętaj określenie --soft zamiast --hard, w przeciwnym razie możesz stracić tę blokadę całkowicie.


jeśli chcesz po prostu zmienić ostatni commit użyć:

git commit --amend

lub

git commit --amend -m 'one line message'

ale jeśli chcesz edytować kilka commits z rzędu, należy użyć rebasing:

git rebase -i <hash of one commit before the wrong commit>

git rebase editing

w pliku, podobnej do przedstawionej powyżej, napisz edit / e lub jedną z innych opcji i kliknij przycisk save i exit.

teraz będziesz na pierwszym złym zatwierdzenia. Wprowadź zmiany w plikach i automatycznie zostaną zorganizowane dla ciebie. Typ

git commit --amend

zapisz i wyjdź z niego i wpisz

git rebase --continue 

aby przejść do następnego wyboru, dopóki nie skończysz ze wszystkimi swoimi wyborami.

zauważ, że te rzeczy zmieniają wszystkie swoje хеши SHA po tego konkretnego zatwierdzenia.


dla tych, którzy szukają Windows i Mac GUI, aby pomóc w edycji starych wiadomości (tzn. nie tylko ostatni post), polecam SourceTree. Kroki, aby podążać poniżej.

SourceTree interactive rebase

dla commits, które jeszcze nie zostały usunięte na pilota:

  1. upewnij się, że zanotowali lub ukrył wszystkie bieżące zmiany (tzn. nie ma plików, które są wymienione na karcie "Stan pliku") - to nie będzie działać inaczej.
  2. w zakładce "Historia / Historia" kliknij prawym przyciskiem myszy wpis z przyległym linią na wykresie poniżej commit(Y), które chcesz zmienić, i wybierz "przenieś dzieci interaktywne..."
  3. zaznacz cały wiersz dla komunikatu zatwierdzenia, którą chcesz zmienić (czyli kliknij na "wiadomość" kolumna).
  4. Kliknij przycisk" Edytuj wiadomość".
  5. edytuj posty pojawi się okno dialogowe, a następnie kliknij przycisk OK.
  6. powtórz czynności 3-4, jeśli istnieją inne wiadomości, aby zmienić.
  7. kliknij przycisk OK:relokacja rozpocznie się. Jeśli wszystko jest dobrze, wyjście zakończy się pomyślnie zakończony".

...Lub... dla commits, które już zostały wciśnięte:

postępuj zgodnie z instrukcjami wyświetlanymi odpowiedź, które są podobne do opisanego powyżej, ale wymagają więcej polecenie z wiersza polecenia force push the branch-przeczytaj i zastosuj odpowiednią ostrożność!


jeśli chcesz tylko zmienić swój ostatni post, należy użyć --only flaga lub jej skrót -ocommit --amend:

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

to gwarantuje, że przypadkowo nie ulepsza swoje utrwalanie za pomocą stopniowej materiału. Oczywiście, lepiej mieć odpowiedni $EDITOR konfiguracji. Następnie można zostawić -m option out, i git będzie wstępnie wypełnić komunikat zatwierdzenia ze starym. W ten sposób, można go łatwo edytować.


zaktualizuj ostatnia niewłaściwym komunikat zatwierdzenia nową wiadomość zatwierdzenia w jednym wierszu:

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

lub spróbuj git reset, jak pokazano poniżej:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# it will reset you last commit. Now, you
# can re-commit it with new commit message.

korzystanie reset do podziału commits na mniejsze commit

git reset może pomóc rozbić jedną blokadę na kilka zatwierdzeń:

# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

tutaj można z powodzeniem rozbił swój ostatni commit na dwa commit.


na to pytanie istnieje wiele odpowiedzi, ale żaden z nich nie wyjaśnia bardzo szczegółowo, jak zmienić stare wiadomości mocowania za pomocą VIM. Utknąłem, starając się zrobić to sam, więc tu szczegółowo napiszę, jak ja to zrobiłem specjalnie dla osób, które nie mają doświadczenia w VIM!

chciałem zmienić swoje pięć ostatnich commits, które ja już kliknąłem na serwer. Jest to dość niebezpieczne, bo jeśli już ktoś wyciągnął z tego można zrobić poprzez zmiany wysyłanie wiadomości. Jednak, kiedy pracujesz nad swoim małym gałęzią i pewność, że nikt jej nie wyciągnął, możesz zmienić ją w następujący sposób:

załóżmy, że chcesz zmienić swoje pięć ostatnich commits, a następnie wpisać w terminalu:

git rebase -i HEAD~5 *Gdzie 5 to liczba wiadomości, które chcesz zmienić. (dlatego, jeśli chcesz zmienić 10-cioma na ostatnią blokadę, wprowadź 10)

ta drużyna zabierze cię w VIM, gdzie można "edytować" swoją historię zatwierdzenia. Wy zobacz swoje ostatnie 5 commits górze w następujący sposób:

pick <commit hash> commit message

zamiast pick trzeba pisać reword. Można to zrobić w VIM, wprowadzając i to sprawia, że można przejść w tryb wstawiania. (Widać, że jesteś w trybie wstawiania słowo INSERT na dole) dla commits, które chcesz zmienić, wpisz reword zamiast pick

następnie trzeba zapisać i wyjść z tego ekranu, można to zrobić, najpierw przechodząc w "tryb poleceń", naciskając esc przycisk. (można sprawdzić, że jesteś w trybie poleceń, jeśli słowo INSERT dole zniknęło), to można wpisać polecenia, wpisując : polecenie zapisz i wyjdź -wq. Dlatego, jeśli wpiszesz :wq jesteś na dobrej drodze.

następnie VIM będzie przeglądać każdy komunikat zatwierdzenia, który chcesz zmienić, tutaj rzeczywiście można zmienić wiadomości zatwierdzenia. Możesz to zrobić, przechodząc w tryb wstawiania, zmieniając się komunikat zatwierdzenia, przechodząc w tryb poleceń, a następnie zapisz i zamknij. Zrób to 5 razy, i nie będzie VIM!

wtedy, jeśli już pchali swoje błędy o nieprawidłowym commit, trzeba git push --force je zastąpić. Zapamiętaj git push --force bardzo niebezpieczna rzecz, więc upewnij się, że nikt nie wyciągnął z serwera, tak jak kliknąłeś błędy o nieprawidłowym commit!

teraz zmieniły swoje wiadomości!

(jak widzisz, nie jestem tak doświadczony w VIM, więc jeśli użyłem niewłaściwego "żargon", aby wyjaśnić, co się dzieje, nie wahaj się poprawiać ja!)


dodałem alias reci,recmrecommit (amend) wszystko, co teraz mogę zrobić to z git recm lub git recm -m .

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

można użyć git rebase-reword

jest On przeznaczony dla każdej edycji zatwierdzenia (nie tylko ostatniego) tak samo jak commit --amend

$ git rebase-reword <commit-or-refname>

On nazwany na cześć działania na rebase interactive do zmiany zatwierdzenia: "reword". Patrz!--10-->ten post a człowiek -sekcja tryb interaktywny-

przykłady:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

rozumiem, że nacisnął utrwalenie z erratą. Aby anulować, zrobiłem następujący:

git commit --amend -m "T-1000, advanced prototype"
git push --force

ostrzeżenie: wymuś naciśnięcie twoich zmian nadpisze zdalną gałąź z twojej lokalnej sieci. Upewnij się, że nie zamierzasz przepisać wszystko, co chcesz zachować. Należy także uważać z wymuszonym naciskając zmienionej (переписанной) zatwierdzenia, jeśli ktoś jeszcze podziela gałąź z tobą, bo im trzeba będzie przepisać swoją własną historię, jeśli mają stara kopia zatwierdzenia, którą właśnie przepisał.


podoba mi się korzystać z następujących czynności:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

jeśli nie kliknąłeś kod na zdalną gałąź (GitHub/Bitbucket) można zmienić ich zatwierdzenia w wierszu polecenia, jak pokazano poniżej.

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

jeśli pracujesz nad daną gałęzią, wykonaj następujące czynności:

git commit --amend -m "BRANCH-NAME: new message"

jeśli już kliknąłeś kod z niewłaściwym wiadomość, i trzeba być ostrożnym przy zmianie wiadomości. Czyli po zmianie wiadomości zatwierdzenia i ponownej próby jego naciśnięciu masz problemy. Do zrób jego gładka, wykonaj następujące kroki.

proszę, przeczytaj mój cały odpowiedź, zanim to zrobisz.

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

ważne: gdy używasz force push bezpośrednio, można zmierzyć się z problemami kodu, nad którymi pracują inni deweloperzy w tej samej gałęzi. Dlatego, aby uniknąć tych konfliktów, trzeba wyciągnąć kod z jego gałęzi, zanim zrobisz siła nacisku:

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

jest To najlepsza praktyka przy zmianie zablokować komunikat, jeśli już zostanie naciśnięty.