Zmień stary komunikat dotyczący zmiany w Git


148

Próbowałem edytować stary komunikat dotyczący zmiany, jak wyjaśniono tutaj .

Chodzi o to, że teraz, kiedy próbuję uruchomić rebase -i HEAD~5, mówi interactive rebase already started.

Więc próbuję: git rebase --continueale mam ten błąd:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Jakieś pomysły?

Odpowiedzi:


134

To mówi:

Kiedy zapiszesz i wyjdziesz z edytora, przewinie cię on z powrotem do ostatniego zatwierdzenia na tej liście i upuści cię w wierszu poleceń z następującym komunikatem:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

To nie znaczy:

Wpisz ponownie git rebase -i HEAD~3

Staraj się nie pisać git rebase -i HEAD~3przy wychodzeniu z edytora i powinno działać dobrze.
(w przeciwnym razie w twojej konkretnej sytuacji git rebase -i --abortmoże być potrzebny, aby zresetować wszystko i pozwolić ci spróbować ponownie)


Jak wspomina Dave Vogt w komentarzach, git rebase --continuechodzi o przejście do następnego zadania w procesie zmiany bazy, po poprawieniu pierwszego zatwierdzenia .

Ponadto, Gregg Lind wspomina w swej odpowiedzi rewordpoleceń zgit rebase :

Zastępując polecenie „wybierz” poleceniem „edytuj”, możesz nakazać git rebasezatrzymanie po zastosowaniu tego zatwierdzenia, aby móc edytować pliki i / lub komunikat o zatwierdzeniu, zmienić zatwierdzenie i kontynuować zmianę bazy.

Jeśli chcesz po prostu edytować komunikat o zatwierdzeniu dla zatwierdzenia, zamień polecenie „ pick” na polecenie „ reword od Git1.6.6 (styczeń 2010) .

Robi to samo ' edit' podczas interaktywnego ponownego bazowania, z wyjątkiem tego , że pozwala tylko edytować komunikat zatwierdzenia bez zwracania kontroli do powłoki . Jest to niezwykle przydatne.
Obecnie, jeśli chcesz wyczyścić swoje wiadomości w zmianach, musisz:

$ git rebase -i next

Następnie ustaw wszystkie zatwierdzenia na „edytuj”. Następnie na każdym:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Użycie „ reword” zamiast „ edit” pozwala pominąć wywołania git-commitigit-rebase .


2
Również git rebase --continueprzechodzi do następnego zadania w procesie podścielanie, po tym, jak zmienione pierwszy popełnić.
Dave Vogt

1
Dodanie linku do artykułu wiki na githubie w celu zmiany wiadomości o zmianach
Joy

75

Jak zasugerował Gregg Lind, możesz użyć polecenia reword, aby otrzymać monit, aby zmienić tylko komunikat o zatwierdzeniu (i pozostawić zatwierdzenie nienaruszone w przeciwnym razie):

git rebase -i HEAD~n

Oto nlista ostatnich n zatwierdzeń.

Na przykład, jeśli używasz git rebase -i HEAD~4, możesz zobaczyć coś takiego:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Teraz zastąpi wydłubać z przeredagować dla zatwierdzeń chcesz edytować wiadomości z:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Wyjdź z edytora po zapisaniu pliku, a następnie zostaniesz poproszony o edycję komunikatów dla zatwierdzeń, które zaznaczyłeś jako przeredagowanie , w jednym pliku na wiadomość. Zauważ, że to byłoby znacznie prostsze wystarczy zmienić popełnienia wiadomości, kiedy otrzymuje picksię reword, ale robi to nie ma znaczenia.

Dowiedz się więcej na stronie GitHub dotyczącej zmiany komunikatu o zmianach .


Bardzo dobrze wyjaśnione. Dzięki: D
Shubham Jain

Dzięki @ShubhamJain Cieszę się, że moja odpowiedź była przydatna
Punit Vara

Zrobiłem to, a następnie zatwierdzenia z innych oddziałów pojawiają się w moim oddziale
Reza

@Reza, mogłeś coś schrzanić. Spróbuj tego w innym repozytorium. To rozwiązanie działa idealnie
Punit Vara

Ta odpowiedź jest lepsza niż zaakceptowana, ponieważ jest krótka i prosta.
M. Nunisa

56

FWIW, git rebase Interactive ma teraz opcję „przeredagowania”, co sprawia, że ​​jest to znacznie mniej bolesne!


3
Kiedy używasz reword, dlaczego git nie pozwala po prostu edytować komunikatów o zmianach w tym pliku z listą zatwierdzeń? Zamiast tego uruchomi edytor z jednym plikiem komunikatu o zmianach w każdym rewordwierszu. To jest po prostu niepotrzebne. Nawet jeśli inne działania niż picklub rewordwymagają uruchamiania poleceń zewnętrznych, rewordnie będą tego wymagać.
Dan Dascalescu

11

Chciałem tylko zapewnić inną opcję do tego. W moim przypadku zwykle pracuję nad swoimi indywidualnymi oddziałami, a następnie łączę się w master, a indywidualne commity, które wykonuję w moim lokalnym, nie są tak ważne.

Ze względu na hak git, który sprawdza odpowiedni numer biletu w Jira, ale rozróżnia wielkość liter, uniemożliwiono mi wypchnięcie kodu. Ponadto zatwierdzenie zostało wykonane dawno temu i nie chciałem liczyć, ile zatwierdzeń wróci do rebase.

Więc to, co zrobiłem, to utworzenie nowej gałęzi z najnowszego mastera i zmiażdżenie wszystkich zatwierdzeń z gałęzi problemowej do jednego zatwierdzenia w nowej gałęzi. Było mi łatwiej i myślę, że warto mieć to tutaj jako odniesienie w przyszłości.

Od ostatniego mistrza:

git checkout -b new-branch

Następnie

git merge --squash problem-branch
git commit -m "new message" 

Referencja: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch


1
Twoja odpowiedź naprawdę uratowała mi dzień :). Walczyłem rebase -ijakieś 2 godziny i bez sukcesu. Moje zatwierdzenie było za 18 zatwierdzeniami, więc możesz sobie wyobrazić. To był prostszy i wygodniejszy sposób, jaki mogłem znaleźć bez konieczności używania rebase. Dziękuję przyjacielu!
Carlos Parra

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.