Możesz użyć git checkout -p
, który pozwala wybrać pojedyncze porcje z różnicy między kopią roboczą a indeksem do przywrócenia. Podobnie, git add -p
pozwala wybrać porcje do dodania do indeksu i git reset -p
pozwala wybrać pojedyncze porcje z różnicy między indeksem a HEAD, aby wycofać się z indeksu.
$ git checkout -p file/to/partially/revert
# or ...
$ git checkout -p .
Jeśli chcesz wcześniej wykonać migawkę repozytorium git, aby zachować te zmiany przed ich przywróceniem, lubię to zrobić:
$ git stash; git stash apply
Jeśli używasz tego często, możesz użyć aliasu:
[alias]
checkpoint = !git stash; git stash apply
Przywracanie pojedynczych fragmentów lub wierszy może być jeszcze łatwiejsze, jeśli użyjesz dobrego trybu edytora lub wtyczki, która może zapewniać obsługę bezpośredniego wybierania wierszy do przywrócenia, co -p
może być czasami niezręczne w użyciu. Używam Magit , trybu Emacsa, który jest bardzo pomocny w pracy z Gitem. W Magit możesz uruchomić magit-status
, znaleźć różnice dla zmian, które chcesz cofnąć, wybrać linie, które chcesz cofnąć (lub po prostu umieścić kursor na fragmentach, które chcesz przywrócić, jeśli chcesz cofnąć porcję na raz zamiast wiersz na raz) i naciśnij, k
aby przywrócić te konkretne wiersze. Bardzo polecam Magit, jeśli używasz Emacsa.
git checkout
ma również-p
flagę, która robi dokładnie to, o co prosiłeś w jednym poleceniu. Przepraszamy za poprzedni złożony zestaw kroków; możesz po prostu użyćgit checkout -p
. Jeśli chodzi o zapisywanie rzeczy, przed zrobieniem czegoś potencjalnie destrukcyjnego często robięgit stash; git stash apply
(lub tworzę alias, który robi to jakogit checkpoint
lub coś), aby zapisać bieżące drzewo w skrytce, aby móc do niego wrócić, jeśli coś pójdzie nie tak.git commit -a -m "Backup Commit" --edit; git reset HEAD^
byłoby lepsze, bo wtedy nie zabrudziłoby mojego stanu skrytki, którego mogę użyć do czegoś innego. Następnie, jeśli masz SHA1, możesz go wybrać w ciągu następnych 30 dni. --Edit pozwala na dodanie informacji do komunikatu zatwierdzenia, aby pomóc w późniejszym znalezieniu SHA1, jeśli chcesz. Z drugiej strony zabrudziłoby to reflog git, więc myślę, że jest to kompromis oparty na tym, co robisz.git checkout -p
nie stosować poprawek do indeksu, a tylko je wystawiać?Następnie edytuj plik poprawki i usuń części, których nie chcesz cofnąć, a następnie:
źródło
patchfile
wygląda świetnie w vimie i naprawdę pomaga!git apply -R
zamiastpatch
(tylko po to, aby pozostać w sferze git lub w innym zdarzeniu, którepatch
nie jest dostępne)patch: **** malformed patch at line 41: @@ -428,9 +443,9 @@ you should place your code here."
Mógłbyś
Dla każdego pliku, który chcesz zresetować.
źródło
Co powiesz na
git add -p
aby dodać z powrotem tylko te zmiany, które chcesz, do indeksu.źródło
Kiedy uruchamiam „stan git”, wyświetla się:
Tak więc, aby anulować edycje niestacjonarne, każe mi uruchomić:
źródło
Odpowiedź Briana Campbella powoduje awarię mojego gita w wersji 1.9.2.msysgit.0 z nieznanych powodów, więc moje podejście polega na przygotowaniu fragmentów, które chcę zachować, odrzuceniu zmian w kopii roboczej, a następnie usunięciu sceny.
źródło
git stash -p
. Możesz to zrobićgit stash -p; git reset --hard; git stash pop
. W praktyce jest to to samo, co robisz, z wyjątkiem tego, że nie musisz pisać wiadomości o zatwierdzeniu.możesz to zrobić
git checkout
i nadać mu nazwy części, które chcesz cofnąć.źródło