Kiedy wprowadzam zmiany do pliku w Git, jak mogę zatwierdzić tylko niektóre zmiany?
Na przykład, jak mogę zatwierdzić tylko 15 wierszy z 30 wierszy, które zostały zmienione w pliku?
git
git-commit
freddiefujiwara
źródło
źródło
git gui
=git add -e
>git add -i -p
; pod względem wygody:git gui
>git add -i -p
>git add -e
. Tak: wybraćgit gui
, gdy masz dostęp do X. wybraćgit add -i -p
dla prostych rzeczy, a gdy nie masz lub chcesz używać X.git add -e
do kompleksowego inscenizacji bez X.Odpowiedzi:
Możesz użyć
git add --patch <filename>
(lub-p
w skrócie), a git zacznie rozkładać twój plik na coś, co według niego jest sensownym „kawałkiem” (części pliku). Następnie wyświetli się następujące pytanie:Oto opis każdej opcji:
Jeśli pliku nie ma jeszcze w repozytorium, możesz to zrobić najpierw
git add -N <filename>
. Następnie możesz kontynuowaćgit add -p <filename>
.Następnie możesz użyć:
git diff --staged
aby sprawdzić, czy wprowadzono prawidłowe zmianygit reset -p
na scenie błędnie dodali przystojniakigit commit -v
aby zobaczyć swoje zatwierdzenie podczas edycji wiadomości zatwierdzenia.Zauważ, że jest to coś zupełnie innego niż
git format-patch
polecenie, którego celem jest parsowanie zatwierdzonych danych do.patch
plików.Referencje na przyszłość: Git Tools - Interactive Staging
źródło
-p/--patch
jest to skrót do akcji łatania wewnątrz-i/--interactive
polecenia, które inicjuje przydatny tryb interaktywny .git diff
robi.e
, można edytować ręcznie, zastępując kawał+
lub-
przez#
git push
, powie to już aktualne. a jeśli to zrobię,git diff
zobaczę przystojniaków, o których mówiłemn
. jeśli to zrobię,git diff --staged
zobaczę zatwierdzenie, które chcę wcisnąć. Zakładając, że mogę wcisnąć przycisk zatwierdzenia, jak usunąć fragmenty, o których mówiłemno
?Możesz użyć
git add --interactive
lub , a następnie ( nie ); zobacz Tryb interaktywny na stronie git-add lub po prostu postępuj zgodnie z instrukcjami.git add -p <file>
git commit
git commit -a
Modern Git ma również
git commit --interactive
(igit commit --patch
, który jest skrótem do opcji łatki w interaktywnym zatwierdzeniu).Jeśli wolisz robić to z GUI, możesz użyć git-gui . Możesz po prostu zaznaczyć fragmenty, które chcesz uwzględnić w zatwierdzeniu. Osobiście uważam to za łatwiejsze niż używanie
git add -i
. Inne GUI Git, takie jak QGit lub GitX, również mogą mieć tę funkcję.źródło
git gui zapewnia tę funkcjonalność w widoku różnic. Kliknij prawym przyciskiem myszy interesującą Cię linię, a zobaczysz pozycję menu „etap tej linii do zatwierdzenia”.
źródło
gitk
, ale jest dołączony do Git Bash dla Windows; powinieneś mieć dla niego pozycję menu Start lub uruchomić ją za pomocą poleceniagit gui
. Jest też coś,stage this hunk
co jest prawdopodobnie bardziej przydatne niżstage this line
. Może być nowy, ponieważ ta odpowiedź została stworzona 10 lat temu.Uważam, że
git add -e myfile
jest to najłatwiejszy sposób (przynajmniej moje preferencje), ponieważ po prostu otwiera edytor tekstu i pozwala wybrać linię, którą chcesz wystawić, a która nie. Odnośnie poleceń edycji:dodana treść:
usunięta treść:
zmodyfikowana treść:
Wszystkie szczegóły dotyczące
git add
są dostępne nagit --help add
źródło
-e
jest--edit
.git --help add
s
w interaktywnym trybie łatki.git add -e
) * nie zmienia * zawartości pliku na dysku. Po prostu przenosi część zmian ze sceny niestacjonarnej na etapową (indeks).Jeśli używasz vima, możesz wypróbować doskonałą wtyczkę o nazwie fugitive .
Możesz zobaczyć różnicę pliku między kopią roboczą a indeksem
:Gdiff
, a następnie dodać do indeksu wiersze lub porcje za pomocą klasycznych poleceń vim diff, takich jakdp
. Zapisz zmiany w indeksie i zatwierdź za pomocą:Gcommit
, i gotowe.Bardzo dobre wprowadzające screencasty tutaj (patrz zwłaszcza część 2 ).
źródło
:diffget/:diffput
w trybie wizualnym, w którym mogę wybrać określone linie, które chcę zresetować / zatwierdzić. Upewnij się więc jeszcze raz: vim jest niesamowity.Zdecydowanie polecam korzystanie z SourceTree od Atlassian. (To nic nie kosztuje.) To sprawia, że jest to trywialne. Możesz szybko i łatwo ustawiać poszczególne fragmenty kodu lub poszczególne wiersze kodu.
źródło
Warto zauważyć, że do wykorzystania
git add --patch
dla nowego pliku trzeba najpierw dodać plik do indeksu zgit add --intent-to-add
:źródło
Kiedy wprowadzę wiele zmian i ostatecznie skończę tworzyć kilka zatwierdzeń na podstawie tych zmian, chcę tymczasowo zapisać swój punkt początkowy przed inscenizacją.
Lubię to:
Whymarrh odpowiada na to, co zwykle robię, z wyjątkiem tego, że czasami jest wiele zmian i mogę powiedzieć, że popełniam błąd podczas wystawiania różnych rzeczy, i chcę stanu, w którym mogę popaść na drugie przejście.
źródło
Jeśli używasz emacsa, spójrz na Magit , który zapewnia interfejs git dla emacsa. Całkiem dobrze obsługuje pomostowe fragmenty (części plików).
źródło
Intellij IDEA (i chyba wszystkie inne produkty z tej serii) ma wbudowaną obsługę częściowych zatwierdzeń od wersji v2018.1
źródło
Dla tych, którzy używają rozszerzeń Git :
W oknie Zatwierdź wybierz plik, który chcesz częściowo zatwierdzić, a następnie zaznacz tekst, który chcesz zatwierdzić, w prawym okienku, a następnie kliknij prawym przyciskiem myszy zaznaczenie i wybierz polecenie „Stwórz wybrane linie” z menu kontekstowego.
źródło
s
bardzo przydatny do szybkiego przemieszczania części plików do zatwierdzenia.Podobnie jak odpowiedź jdsumsion, możesz także ukryć swoją obecną pracę, ale następnie użyć narzędzia difftool, takiego jak meld, aby wyciągnąć wybrane zmiany ze schowka. W ten sposób możesz nawet edytować fragmenty ręcznie bardzo łatwo, co jest trochę uciążliwe, gdy
git add -p
:Zastosowanie metody ukrywania daje możliwość przetestowania, czy kod nadal działa, zanim go zatwierdzisz.
źródło
git commit --amend
, wydaje się, że nie możesz później wyskoczyć z ukrycia, czy jest na to sposób?Dodając poprzednią odpowiedź, jeśli wolisz korzystać z wiersza poleceń, wpisanie
git add -e myfile
daje Ci możliwość wyboru linii po linii, co chcesz zatwierdzić, ponieważ to polecenie otworzy edytor z różnicami, na przykład:Jak być może wiesz, linie zaczynające się od
+
są dodatkami, linie zaczynające się od są usuwane-
. Więc:-
go spacją.
Oto, co
git add -h
mówi o dodawaniu plików w ten sposób (łatanie plików):Uwaga: nie zmieniaj zawartości pliku, nie jest to dobre miejsce do zrobienia tego. Wystarczy zmienić operatorów usuniętych lub dodanych linii.
źródło
Wtyczka vim-gitgutter może tworzyć porcje bez opuszczania edytora vim
Oprócz tego zapewnia inne fajne funkcje, takie jak kolumna znaku różnicowego, jak w niektórych nowoczesnych IDE
Jeśli tylko część przystojniaka powinna być zainscenizowana zbiegiem
umożliwia wówczas wybór zasięgu wizualnego
:'<,'>diffput
lub:'<,'>diffget
stopniowanie / cofanie indywidualnych zmian linii.źródło
Próbowałem
git add -p filename.x
, ale na komputerze Mac znalazłem gitx ( http://gitx.frim.nl/ lub https://github.com/pieter/gitx ), aby łatwiej było zatwierdzić wiersze, które chciałem.źródło
Z TortoiseGit:
źródło
Minęło 10 lat, odkąd zadano to pytanie. I mam nadzieję, że ta odpowiedź będzie dla kogoś przydatna. Jak wspomniano w odpowiedzi tutaj , gdzie GUI nie jest opcją, rozszerzenie crecord Andrew Shadury pomaga wprowadzić okno ncurses, w którym możemy wybrać linie do zatwierdzenia.
Skonfiguruj rozszerzenie w następujący sposób:
cd na repozytorium git i wywołaj go w następujący sposób:
Spowoduje to wywołanie interfejsu ncurses, którego można używać, jak pokazano poniżej. Naciśnięcie następujących klawiszy w oknie ncurses spowoduje wykonanie pewnych czynności:
Screencast pokazujący przykładowe użycie
źródło
Dla użytkowników Atom pakiet github zawiera interaktywną inscenizację w stylu
git gui
. Skróty można znaleźć w dokumentacji pakietu .Korzystanie z Atom pozwala na pracę z motywem o ciemnym tle (domyślnie
git gui
ma białe tło).źródło
W przypadku emacsa istnieje również gitsum
źródło
git-meld-index - cytowanie ze strony:
git-meld-index uruchamia meld - lub dowolny inny git difftool (kdiff3, diffuse itp.) - aby umożliwić Ci interaktywne wprowadzanie zmian w indeksie git (znanym również jako obszar testowania git).
Jest to podobne do funkcji git add -p i git add --interactive. W niektórych przypadkach meld jest łatwiejszy / szybszy w użyciu niż git add -p. Jest tak, ponieważ meld pozwala na przykład:
Stosowanie
W repozytorium git uruchom:
Zobaczysz wyskakujące okno meld (lub skonfigurowanego git difftool) z:
LEWY : pliki tymczasowe zawierające katalog skopiowane z twojego drzewa roboczego
PRAWO : katalog tymczasowy z zawartością indeksu. Dotyczy to również plików, które nie są jeszcze w indeksie, ale zostały zmodyfikowane lub nie są śledzone w kopii roboczej - w tym przypadku zobaczysz zawartość pliku z HEAD.
Edytuj indeks (po prawej stronie), aż będzie szczęśliwy. Pamiętaj, aby zapisać w razie potrzeby.
Gdy skończysz, zamknij meld, a git-meld-index zaktualizuje indeks, aby pasował do zawartości katalogu tymczasowego po prawej stronie edytowanego właśnie meldu.
źródło
Jeśli jest na
Windows
platformie, moim zdaniemgit gui
jest bardzo dobrym narzędziem dostage
/commit
kilku wierszy zunstaged
pliku1. Hunk mądry:
unstagged Changes
sekcjiStage Hunk for commit
2. Linia mądra:
unstagged Changes
sekcjiStage Lines for commit
3. Jeśli chcesz ustawić cały plik poza kilkoma liniami:
unstagged Changes
sekcjiCtrl+T (Stage file to commit)
Staged Changes
sekcjiUnStage Lines for commit
źródło
Jak pokazuje jedna odpowiedź powyżej, możesz użyć
git add --patch filename.txt
lub krótki formularz
git add -p filename.txt
... ale w przypadku plików już znajdujących się w twoim repozytorium lepiej jest użyć opcji --patch bezpośrednio w poleceniu commit (jeśli używasz wystarczająco najnowszej wersji git):
git commit --patch filename.txt
... lub znowu skrócona forma
git commit -p filename.txt
... a następnie używając wspomnianych kluczy (t / n itd.), do wyboru wierszy, które mają być zawarte w zatwierdzeniu.
źródło
git add -p filename.txt
” poza tym, że jest mniej miejsca na błędy? Jeśli popsuniesz zmianę częściowego pliku, cofnięcie dodawania jest lepsze niż cofnięcie zatwierdzenia.git-cola jest świetnym GUI i ma również tę wbudowaną funkcję. Wystarczy wybrać linie na scenę i nacisnąć S. Jeśli nie zostanie dokonany wybór, cały przystojniak jest wystawiany.
źródło