Jak dodać plik do poprzedniego zatwierdzenia?

86

W ciągu ostatniej godziny zmodyfikowałem pliki

A
ATest
B
BTest

Aby upewnić się, że moje komunikaty dotyczące zmian są zgodne z rzeczywistą zmianą, zatwierdzone Az opisem. Niestety nie uwzględniłem ATesttego zobowiązania.

Tymczasem nadal nie są zaangażowane Bi BTest.

Jaki jest najlepszy sposób postępowania w tym momencie? Chciałbym:

  1. Cofnąć poprzednie zatwierdzenie bez wpływu na moje aktualnie niezatwierdzone pliki?
  2. Dodać kolejny plik o tym samym opisie do poprzedniego zatwierdzenia?
James Raitsev
źródło
Myślę, że 2 powinno być normalnym sposobem. Jaki jest z tym problem?
Adrian Shum

Odpowiedzi:

145

Aby dodać nowy plik do poprzedniego zatwierdzenia:

$ git add new-file
$ git commit --amend

Możesz użyć, git commit --amend --no-editjeśli nie chcesz zmieniać komunikatu o zatwierdzeniu.

William Pursell
źródło
3
Dziękuję Ci. Z ciekawości, jeśli sha1 zatwierdzenia byłby znany, a zatwierdzenie nie było „ostatnim”, jak można by było zmienić to zatwierdzenie?
James Raitsev
6
@Jam Powiedziałbym, że bardzo się postaraj, aby tego nie robić ;-) Ale jeśli musisz, jednym ze sposobów (nie jesteś pewien, czy jest najlepszy) jest zatwierdzenie nowego pliku jako własnego zatwierdzenia, a następnie użycie git rebase -ido zmiany kolejności zatwierdzeń i scalenia zatwierdzenie nowego pliku z innym zatwierdzeniem. To może być istotne dla osobnego pytania.
David Z
3
Robiąc git rebase -itak, jak sugeruje @DavidZ, wszystko, co musisz zrobić, to przesunąć nowy zatwierdzenie nieco poniżej tego, z którym chcesz go połączyć, i zmienić słowo nowego zatwierdzenia na squashzamiastpick
MM
Co się stanie, jeśli wystawię wiele plików, ale chcę dodać tylko jeden do zmienionego zatwierdzenia?
dfrankow
Usuń ze sceny wszystkie przygotowane pliki (np. git reset), Następnie przygotuj ten, który chcesz dodać, zmień zatwierdzenie, a następnie ponownie przygotuj wszystkie pliki.
William Pursell
54

Oto zabawny schemat blokowy 1, który jest również zaskakująco przydatny: podaje prawidłowe zalecenia zarówno dla pierwotnego pytania, jak i dla poprawionego „A co, jeśli nie było to ostatnie zatwierdzenie?” pytanie.

Ładny schemat blokowy Git

1 Zaczerpnięte z http://justinhileman.info/article/git-pretty/

amaloy
źródło
13

Dodaj plik do poprzedniego zatwierdzenia

Jeśli już wypchnąłeś gałąź, nad którą pracujesz, najpierw zapoznaj się ze stronami podręcznika . W szczególności proszę zwrócić uwagę:

Rebasing (lub jakakolwiek inna forma przepisywania) gałęzi, na której pracowali inni, jest złym pomysłem: każdy późniejszy jest zmuszony do ręcznego naprawiania swojej historii.

Jeśli jednak nie przepchnąłeś swojej gałęzi, przygotuj się na wejście w niebezpieczną strefę .

Znajdź skrót zatwierdzenia

Po pierwsze, musisz znać skrót zatwierdzenia zatwierdzenia, do którego chcesz dodać. Pokazuje to git log. W rzeczywistości chcesz określić zatwierdzenie przed tym, do którego chcesz dodać. (Możesz myśleć o tym jako o indeksie początkowym fragmentu zatwierdzeń, które chcesz zmienić). Możesz upewnić się, że masz właściwy zatwierdzenie, uruchamiając git log -1 HEAD~n. Gdzie „n” jest liczbą całkowitą, którą zwiększasz, aż uzyskasz właściwy zatwierdzenie. Albo możesz liczyć, naprawdę nie.

Ale jeśli liczysz, przynajmniej potwierdź, że masz właściwe zobowiązanie z git log -1 HEAD~5lub cokolwiek to było. NIE powinieneś widzieć zatwierdzenia, do którego chcesz dodać.

NIEBEZPIECZEŃSTWO , heh

Teraz jesteś gotowy do biegu git rebase -i HEAD~5. Albo czymkolwiek jest twój hash. Spowoduje to wyświetlenie ulubionego edytora tekstu i pliku do edycji. Plik jest listą zadań do wykonania dla polecenia rebase. Komentarze w pliku informują o dostępnych opcjach. Po prostu znajdź wiersz z zatwierdzeniem, do którego chcesz dodać, iw tym wierszu zmień „wybierz” na „edytuj”. Teraz zapisz i zamknij plik.

Rebase zatrzyma się, gdy osiągnie zatwierdzenie, które kazałeś mu edytować. Uruchom a, git statusaby zobaczyć dodatkowe informacje, które zawiera. Umieść swoje pliki na scenie, aby dodać je do zatwierdzenia za pomocą git add .lub jakichkolwiek innych nazw plików.

Następnie zrób git commit --amend. Zmieni to zatwierdzenie, które wybrałeś do edycji.

Wreszcie biegnij git rebase --continue.

Jeśli masz wątpliwości, w systemie Linux możesz dowiedzieć się więcej, czytając dokumentację wyjściową man git-rebaselub git --help rebase.

BaseZen
źródło
3
Odnośnie „znajdź skrót zatwierdzenia”. Nie ma potrzeby liczenia. Po prostu użyj, git logaby znaleźć swoje zatwierdzenie i skopiuj jego hash, a następnie użyj, git rebase -i hash^aby ponownie bazować na zatwierdzeniu poprzedzającym twoje.
Viktor