Zatwierdź tylko część pliku w Git
Kiedy wprowadzam zmiany do pliku w Git, Jak mogę zatwierdzić tylko niektóre zmiany?
Na przykład, Jak mogę zatwierdzić tylko 15 linii z 30 linii, które zostały zmienione w pliku?
22 answers
Możesz użyć git add --patch <filename>
(lub -p
w skrócie), a git zacznie rozkładać Twój plik na sensowne "kawałki" (części pliku). Następnie zapyta Cię o to pytanie:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Oto opis każdej opcji:
- y Ustaw ten przystojniak na następny commit
- n nie wystawiaj tego kawałka na następny commit
- Q quit; do not stage this hunk or any of the remains hunks
- A Ustaw ten przystojniak i wszystkie późniejsze przystojniaki w pliku
- d nie wystawiaj tego przystojniaka ani żadnego z późniejszych przystojniaków w pliku
- g select a hunk to go to
- / Szukaj przystojniaka pasującego do podanego wyrażenia regularnego
- J zostaw ten przystojniak niezdecydowany, Zobacz następny niezdecydowany przystojniak
- J Zostaw tego przystojniaka niezdecydowanego, zobacz następnego przystojniaka
- K Zostaw tego przystojniaka niezdecydowanego, zobacz poprzedni niezdecydowany przystojniak
- K zostaw ten przystojniak niezdecydowany, Zobacz poprzedni przystojniak
- S podziel bieżący przystojniak na mniejsze przystojniaki
- e ręcznie edytuj bieżący plik
- ? Drukuj pomoc
Jeśli plik nie znajduje się jeszcze w repozytorium, możesz najpierw wykonać git add -N <filename>
. Następnie możesz kontynuować git add -p <filename>
.
Potem możesz użyć:git diff --staged
aby sprawdzić, czy dokonałeś poprawnych zmiangit reset -p
na unstage omyłkowo dodał hunksgit commit -v
aby wyświetlić commit podczas edycji komunikatu commit.
Uwaga jest to znacznie inne polecenie niż git format-patch
, którego celem jest parsowanie danych zatwierdzeń do pliku .patch
.
Odniesienie do przyszłości: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-01 06:23:38
Możesz użyć git add --interactive
LUB git add -p <file>
, a następnie git commit
(Nie git commit -a
); Zobacz Tryb interaktywny W git-add strona Man, lub po prostu wykonaj instrukcje.
Nowoczesny Git posiada również git commit --interactive
(oraz git commit --patch
, które są skrótem do opcji patch w commicie interaktywnym).
Jeśli wolisz robić to z GUI, możesz użyć git-gui. Możesz po prostu oznaczyć kawałki, które chcesz umieścić w commicie. Osobiście uważam, że jest to łatwiejsze niż użycie git add -i
. Inne GUI git, takie jak QGit lub GitX, może również mieć tę funkcjonalność.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-24 11:37:48
Git gui udostępnia tę funkcjonalność w widoku diff. Wystarczy kliknąć prawym przyciskiem myszy interesującą Cię linię I powinieneś zobaczyć pozycję menu "etapuj tę linię do zatwierdzenia".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 11:56:00
Uważam, że {[0] } jest najprostszym sposobem (przynajmniej moim preferencjom), ponieważ po prostu otwiera edytor tekstu i pozwala wybrać, który wiersz chcesz ustawić, a który nie. Odnośnie poleceń edycji:
Dodana treść:
Dodana zawartość jest reprezentowana przez linie zaczynające się od "+". Możesz zapobiec wstawianiu kolejnych linii dodawania, usuwając je.
Usunięta treść:
Usunięta zawartość jest reprezentowana przez linie zaczynające się od "-". Możesz zapobiegaj ich usuwaniu, konwertując " - " na "" (spację).
Zmodyfikowana treść:
Zmodyfikowana zawartość jest reprezentowana przez linie " - "(usunięcie starej zawartości), a następnie linie " + " (dodanie zastępczej zawartości). Możesz zapobiec inscenizacji modyfikacji, konwertując linie " - " na ""i usuwając" +" linie. Uważaj, że modyfikacja tylko połowy pary może wprowadzić mylące zmiany do indeksu.
Każdy szczegół o git add
są dostępne na git --help add
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-29 13:41:03
Jeśli używasz Vima, możesz spróbować doskonałej wtyczki o nazwie fugitive.
Możesz zobaczyć różnicę między kopią roboczą a indeksem za pomocą :Gdiff
, a następnie dodać wiersze lub fragmenty do indeksu za pomocą klasycznych poleceń vim diff, takich jak dp
. Zapisz modyfikacje w indeksie i zatwierdź za pomocą :Gcommit
i gotowe.
Bardzo dobre screencasty wprowadzające tutaj (patrz esp. część 2 ).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-23 10:37:39
Zdecydowanie polecam użycie SourceTree z Atlassian. (Jest bezpłatny.) Czyni to banalnym. Możesz szybko i łatwo skonfigurować poszczególne fragmenty kodu lub poszczególne linie kodu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-01 15:49:07
Warto zauważyć, że aby użyć git add --patch
dla nowego pliku należy najpierw dodać plik do indeksu za pomocą git add --intent-to-add
:
git add -N file
git add -p file
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-05 17:29:10
Kiedy mam dużo zmian i w końcu stworzę kilka commitów z tych zmian, chcę tymczasowo zapisać swój punkt startowy przed przeprowadzeniem zmian.
Tak:
$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop
Dlaczego odpowiadam na to, co zwykle robię, z wyjątkiem tego, że czasami jest wiele zmian i mogę powiedzieć, że mogę popełnić błąd podczas inscenizacji rzeczy, i chcę popełnionego stanu, do którego mogę wrócić na drugie przejście.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-06 22:14:36
Jeśli używasz Emacsa, spójrz na Magit , który zapewnia interfejs git dla Emacsa. Obsługuje staging hunks (części plików) całkiem dobrze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-29 08:01:54
Podobnie jak odpowiedź jdsumsion, możesz także schować swoją bieżącą pracę, ale następnie użyć difftoola, takiego jak meld, aby pobrać wybrane zmiany ze schowka. W ten sposób można nawet edytować kawałki ręcznie bardzo łatwo, co jest trochę bolesne, gdy w git add -p
:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
Użycie metody stash daje Ci możliwość przetestowania, czy Twój kod nadal działa, zanim go zatwierdzisz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-07 13:25:35
Dla tych, którzy używają Git Extensions :
W oknie zatwierdzania wybierz plik, który chcesz częściowo zatwierdzić, a następnie wybierz tekst, który chcesz zatwierdzić W prawym okienku, a następnie kliknij prawym przyciskiem myszy na zaznaczeniu i wybierz "Stage selected lines" z menu kontekstowego.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-27 09:52:10
Intellij IDEA (i chyba wszystkie inne produkty z tej serii) posiada wbudowaną obsługę częściowych commitów od wersji 2018. 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-28 07:06:05
Vim-gitgutter plugin może tworzyć hunksy bez opuszczania edytora vim przy użyciu
:GitGutterStageHunk
Oprócz tego, zapewnia inne fajne funkcje, takie jak Kolumna znaku diff, jak w niektórych nowoczesnych IDE
If only part of hunk should be inscenized vim-fugitive
:Gdiff
Umożliwia wizualny wybór zakresu, a następnie :'<,'>diffput
lub :'<,'>diffget
, aby ustawić/cofnąć poszczególne zmiany linii.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-09 23:46:34
Wypróbowałem git add -p filename.x
, ale na Macu znalazłem gitx ( http://gitx.frim.nl/ lub https://github.com/pieter/gitx ), aby łatwiej było popełnić dokładnie te linie, które chciałem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-15 23:43:36
Z TortoiseGit:
Kliknij prawym przyciskiem myszy na pliku i użyj
Context Menu → Restore after commit
. Spowoduje to utworzenie kopii pliku w takim stanie, w jakim jest. Następnie możesz edytować plik, np. w TortoiseGitMerge i cofnąć wszystkie zmiany, których nie chcesz zatwierdzić. Po zapisaniu tych zmian Możesz zatwierdzić plik.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-06 16:16:02
Dla Emacsa istnieje również gitsum
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-12 21:52:10
Git-meld-index -- cytowanie ze strony:
Git-meld-index uruchamia meld -- lub inny git difftool (kdiff3, diffuse, itp.) -- aby umożliwić interaktywne wprowadzanie zmian do indeksu Gita (znanego również jako obszar postoju Gita).
Jest to podobne do funkcjonalności git add-p i git add --interactive. W niektórych przypadkach meld jest łatwiejsze / szybsze w użyciu niż git add-P. dzieje się tak dlatego, że meld pozwala na przykład:
- Zobacz więcej context
- Zobacz różnice wewnątrzliniowe
- Edytuj ręcznie i zobacz aktualizacje różnic "na żywo" (aktualizowane po każdym naciśnięciu klawisza)
- przejdź do zmiany bez mówienia "n" do każdej zmiany, którą chcesz pominąć
Użycie
W repozytorium git Uruchom:
git meld-index
Zobaczysz wyskakujące okienko meld (lub twój skonfigurowany git difftool) z:
LEFT : tymczasowy katalog zawierający pliki skopiowane z drzewa roboczego
Prawo : tymczasowe katalog z zawartością indeksu. Obejmuje to również pliki, które nie są jeszcze w indeksie, ale są zmodyfikowane lub nie ś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.
Kiedy skończysz, zamknij meld, a git-meld-index zaktualizuje indeks tak, aby pasował do zawartości katalogu tymczasowego po prawej stronie meld, który właśnie edytowałeś.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-04 20:26:43
Jako jedna odpowiedź powyżej pokazuje, możesz użyć
git add --patch filename.txt
Lub krótka forma
git add -p filename.txt
... ale dla plików już w repozytorium, jest, w s są o wiele lepiej używać flagi --patch bezpośrednio w Komendzie commit (jeśli używasz najnowszej wersji git):
git commit --patch filename.txt
... albo jeszcze raz krótka forma
git commit -p filename.txt
... a następnie używając wspomnianych kluczy (y / n itd.), do wybrania linii, które mają być dołączone do commita.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:25
Dla Atom, pakiet github zawiera interaktywną staging, w stylu git gui
. Skróty można znaleźć w dokumentacji pakietu .
Używanie atomu umożliwia pracę z motywem, który ma ciemne tło (domyślnie, git gui
ma białe tło).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-10 02:31:42
Dodanie poprzedniej odpowiedzi, jeśli wolisz używać 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, jak tak:
Jak wiadomo linie zaczynające się od +
są dodatkami, linie zaczynające się od -
są usunięciami. Więc:
- aby nie wystawiać dodawania, po prostu usuń ten wiersz.
- aby nie tworzyć usunięcia wystarczy zastąpić
-
ze spacją.
This is what git add -h
mówi o dodawaniu plików w ten sposób (łatanie plików):
Dodano treść Dodana zawartość jest reprezentowana przez linie zaczynające się od "+". Możesz usuń wszystkie linie dodawania, zapobiegając ich wstawianiu.
Usunięta treść: Usunięta zawartość jest reprezentowana przez linie zaczynające się od "-". Możesz zapobiegać ich usuwaniu poprzez konwersję " - " na " " miejsce).
Zmodyfikowana treść: Zmodyfikowana zawartość jest reprezentowana przez linie " - " (usunięcie starego zawartość), po których następuje linia " + " (dodanie zawartości zastępczej). Możesz zapobiec inscenizacji modyfikacji, konwertując linie " - " na "", oraz usuwanie linii"+". Uważaj, że modyfikując tylko połowę para może wprowadzić mylące zmiany do indeksu.
Uwaga: nie zmieniaj zawartość pliku, nie jest to dobre miejsce, aby to zrobić. Wystarczy zmienić operatory usuniętych lub dodanych linii.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 15:24:08
Jeśli jest na Windows
platformie, moim zdaniem {[1] } jest najlepszym narzędziem do stage
/commit
kilka linii z pliku unstaged
1.
- wybierz Plik z sekcji
unstagged Changes
- kliknij prawym przyciskiem myszy fragment kodu, który musi zostać wyświetlony
- Wybierz
Stage Hunk for commit
2. Linia mądra:
- wybierz Plik z sekcji
unstagged Changes
- Select the line / lines be inscenized
- Wybierz
Stage Lines for commit
3. Jeśli chcesz ustawić cały plik z wyjątkiem kilku linii:
- wybierz Plik z sekcji
unstagged Changes
- Naciśnij
Ctrl+T (Stage file to commit)
- wybrany plik przechodzi teraz do
Staged Changes
sekcji - Select the line / lines be inscenized
- Wybierz
UnStage Lines for commit
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 12:52:34
Git-cola jest świetnym GUI i ma również wbudowaną tę funkcję. Po prostu wybierz linie do etapu i naciśnij S . Jeśli nie zostanie dokonana selekcja, cały fragment jest wystawiany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-27 11:28:04