Powinieneś użyć indeksu. Po wykonaniu mieszanego resetu („ git reset HEAD ^”) dodaj pierwszy zestaw zmian do indeksu, a następnie zatwierdź je. Następnie dokonaj reszty.
Możesz użyć „ git add ”, aby umieścić wszystkie zmiany dokonane w pliku w indeksie. Jeśli nie chcesz stopniować wszystkich modyfikacji dokonanych w pliku, tylko niektóre z nich, możesz użyć „git add -p”.
Zobaczmy przykład. Załóżmy, że miałem plik o nazwie mój_plik, który zawiera następujący tekst:
something
something else
something again
Zmodyfikowałem go w ostatnim zatwierdzeniu, aby teraz wyglądał tak:
1
something
something else
something again
2
Teraz decyduję, że chcę podzielić go na dwie części i chcę, aby wstawienie pierwszego wiersza było w pierwszym zatwierdzeniu, a wstawienie ostatniego wiersza w drugim zatwierdzeniu.
Najpierw wracam do nadrzędnego HEAD, ale chcę zachować zmiany w systemie plików, więc używam „git reset” bez argumentów (co spowoduje tak zwany „mieszany” reset):
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
Teraz używam „git add -p”, aby dodać zmiany, które chcę zatwierdzić do indeksu (= wykonuję je). „git add -p” to interaktywne narzędzie, które pyta cię, jakie zmiany w pliku powinny dodać do indeksu.
$ git add -p myfile
diff --git a/myfile b/myfile
index 93db4cb..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,5 @@
+1
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,s,e,?]? s # split this section into two!
Split into 2 hunks.
@@ -1,3 +1,4 @@
+1
something
something else
something again
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y # yes, I want to stage this
@@ -1,3 +2,4 @@
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,K,g,e,?]? n # no, I don't want to stage this
Następnie dokonuję pierwszej zmiany:
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
Teraz mogę zatwierdzić wszystkie pozostałe zmiany (mianowicie cyfrę „2” wstawioną w ostatnim wierszu):
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
Sprawdźmy dziennik, aby zobaczyć, jakie mamy zobowiązania:
$ git log -p -n2 | cat
Commit 5e284e652f5e05a47ad8883d9f59ed9817be59d8
Author: ...
Date: ...
Added last line
Diff --git a/myfile b/myfile
Index f9e1a67..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -2,3 +2,4 @@
something
something else
something again
+2
Commit cef3d4e0298dd5d279a911440bb72d39410e7898
Author: ...
Date: ...
Added first line
Diff --git a/myfile b/myfile
Index 93db4cb..f9e1a67 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,4 @@
+1
something
something else
something again
git reset [--patch|-p] <commit>
, którego możesz użyć, aby zaoszczędzić ci kłopotów z koniecznościągit add -p
zresetowania. Czy mam rację? Korzystanie z git 1.7.9.5.Cele:
splitme
) na dwa.Plan:
splitme
.splitme
.Kroki rebase (1 i 7) można pominąć, jeśli
splitme
jest to ostatni zatwierdzenie.Gdybym chciał, aby podzielone pliki zostały zatwierdzone jako pierwsze, ponownie dokonałbym zmiany bazy -i i zmieniłbym kolejność
źródło
git reset HEAD^
był brakującym elementem układanki. Działa również dobrze-p
. Dzięki!-- $files
argumentgit reset
. Po przejściu ścieżekgit reset
przywraca te pliki do stanu przywołanego zatwierdzenia, ale nie zmienia żadnych zatwierdzeń. Jeśli opuścisz ścieżki, wówczas „stracisz” zatwierdzenie, które chcesz zmienić w następnym kroku.git reset HEAD^ -- .
. Niezwykle zaskakujące, nie jest to dokładnie zachowaniegit reset HEAD^
.Aby zmienić bieżące zatwierdzenie na dwa zatwierdzenia, możesz wykonać następujące czynności.
Zarówno:
Cofa to ostatnie zatwierdzenie, ale pozostawia wszystko wyreżyserowane. Następnie możesz wycofać scenę z niektórych plików:
Opcjonalnie przywróć części tych plików:
Dokonaj nowego pierwszego zatwierdzenia:
Etap i zatwierdzanie pozostałych zmian w drugim zatwierdzeniu:
Lub:
Cofnij i odetnij wszystkie zmiany od ostatniego zatwierdzenia:
Selektywnie przeprowadzaj pierwszą rundę zmian:
Popełnić:
Zatwierdź resztę zmian:
(W obu krokach, jeśli cofnąłeś zatwierdzenie, które dodało nowy plik i chcesz dodać to do drugiego zatwierdzenia, musisz ręcznie dodać go, ponieważ
commit -a
tylko etapy zmiany w już śledzonych plikach).źródło
Uruchom
git gui
, wybierz przycisk „Zmień ostatnie zatwierdzenie” i odznacz scenę (Zatwierdź> Odstąp od zatwierdzenia lub Ctrl- U) zmiany, których nie chcesz wprowadzać w pierwszym zatwierdzeniu. Myślę, że to najłatwiejszy sposób, aby to zrobić.Inną rzeczą, którą możesz zrobić, jest wybranie zmiany bez zatwierdzania (
git cherry-pick -n
), a następnie ręcznie lub zgit gui
wybranymi żądanymi zmianami przed zatwierdzeniem.źródło
--hard zabija twoje zmiany.
źródło
Dziwię się, że nikt nie zasugerował
git cherry-pick -n forum
. Spowoduje to wprowadzenie zmian w stosunku do ostatniegoforum
zatwierdzenia, ale nie zatwierdzenie ich - możesz następniereset
usunąć niepotrzebne zmiany i zatwierdzić to, co chcesz zachować.źródło
Metoda podwójnego cofania-squasha
git checkout HEAD~1 -- files with unwanted changes
agit commit
. Jeżeli nie, to pliki z mieszanymi zmianami mogą być częściowo wystawiłgit reset file
igit add -p file
jako etap pośredni.) Nazywają to powracają .git revert HEAD
- Dokonaj kolejnego zatwierdzenia, które doda niepożądane zmiany. To jest podwójne cofnięciegit rebase -i HEAD~3
). To zatwierdzenie staje się teraz wolne od niepożądanych zmian, ponieważ są one w drugim zatwierdzeniu.Korzyści
źródło
Ponieważ wybierasz wiśnie, możesz:
cherry-pick
z--no-commit
dodaną opcją.reset
i użyjadd --patch
,add --edit
lub po prostuadd
na scenie, co chcesz zachować.commit
zainscenizowane zmiany.--reuse-message=<old-commit-ref>
lub--reedit-message=<old-commit-ref>
opcje docommit
polecenia.reset --hard
.Innym sposobem, zachowując lub edytując oryginalny komunikat zatwierdzenia:
cherry-pick
oryginalne zatwierdzenie jak zwykle.add
aby wprowadzić odwrócenie.commit --amend
aby dokonać odwrócenia zatwierdzonego wyboru.źródło
To może być kolejne rozwiązanie przeznaczone dla przypadków, w których istnieje ogromne zatwierdzenie i niewielka ilość plików musi zostać przeniesiona do nowego zatwierdzenia. Działa to, jeśli zestaw
<path>
plików ma zostać wyodrębniony z ostatniego zatwierdzenia w HEAD i wszystkie przeniesione do nowego zatwierdzenia. Jeśli potrzeba wielu zatwierdzeń, można zastosować inne rozwiązania.Najpierw wykonaj poprawki do obszarów etapowych i niestacjonarnych, które będą zawierać zmiany, aby przywrócić kod odpowiednio przed modyfikacją i po modyfikacji:
Aby zrozumieć, co się stanie (strzałka i komentarze nie są częścią polecenia):
Cofnij
<path>
zmiany w ostatnim zatwierdzeniu:Utwórz nowy zatwierdzenie ze
<path>
zmianami:Powoduje to utworzenie nowego zatwierdzenia zawierającego zmiany wyodrębnione z ostatniego zatwierdzenia.
źródło