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?

 2312
Author: Community, 2009-07-06

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 zmian
git reset -p na unstage omyłkowo dodał hunks
git 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

 3022
Author: mac,
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ść.

 219
Author: Jakub Narębski,
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".

 116
Author: Ionuț G. Stan,
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

 61
Author: theFreedomBanana,
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 ).

 41
Author: François,
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.

Tutaj wpisz opis obrazka

 26
Author: Bob Stein,
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
 20
Author: user1338062,
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.

 17
Author: jdsumsion,
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.

 12
Author: Mark van Lent,
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.

 8
Author: derhoch,
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.

 7
Author: srgstm,
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

Tutaj wpisz opis obrazka

 7
Author: Holger Brandl,
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.

 6
Author: c0ffeeartc,
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.

 4
Author: jasongregori,
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.

 4
Author: Fr0sT,
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

 2
Author: zut,
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ś.

 2
Author: Croad Langshan,
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.

 1
Author: Samuel Lampa,
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).

 1
Author: Ioannis Filippidis,
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:

Tutaj wpisz opis obrazka

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.

 1
Author: Beto Aveiga,
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
 0
Author: Anvesh Yalamarthy,
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.

 0
Author: AndiDog,
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