Pytanie Zatwierdź tylko część pliku w Git


Kiedy wprowadzam zmiany do pliku w Git, w jaki sposób 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?


2242
2017-07-06 02:25


pochodzenie




Odpowiedzi:


Możesz użyć git add --patch <filename> (lub -p w skrócie), a git zacznie rozkładać plik na to, co uważa za sensowne "bryły" (fragmenty pliku). Następnie poprosi Cię o to pytanie:

Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Oto opis każdej opcji:

  • y pokaż ten przystojniak dla następnego zatwierdzenia
  • n nie wystawiaj tego przystanku na następne zatwierdzenie
  • q porzucić; nie wystawiaj tego przystojniaka ani żadnego z pozostałych porcji
  • za pokaż to przystojniak i wszystkie późniejsze porcje w pliku
  • re nie umieszczaj tego przystojniaka ani żadnej z późniejszych porcji w pliku
  • sol wybierz przystawkę, aby przejść do
  • / szukaj przystojniaka pasującego do podanego wyrażenia regularnego
  • jot zostaw to przystojniak niezdecydowanym, patrz następny niezdecydowany przystojniak
  • jot zostaw to przystojniak niezdecydowanym, patrz następny przystojniak
  • k pozostaw ten niezdarny przystojniak, patrz poprzedni niezdecydowany przystojniak
  • K pozostaw ten niezdarny przystojniak, patrz poprzedni przystojniak
  • s Podziel obecny kawałek na mniejsze kawałki
  • mi ręcznie edytuj aktualny przystojniak
  • ? wydrukuj pomoc przystojniaka

Jeśli plik nie znajduje się jeszcze w repozytorium, możesz to zrobić git add -N <filename>. Potem możesz kontynuować git add -p <filename>.

Następnie możesz użyć:
git diff --staged aby sprawdzić, czy wystawiłeś poprawne zmiany
git reset -p aby odsłaniać pomyłkowo dodane porcje
git commit -v aby wyświetlić zatwierdzenie podczas edycji komunikatu zatwierdzenia.

Zauważ, że to znacznie różni się od git format-patch polecenie, którego celem jest parsowanie danych zatwierdzenia na .patch akta.

Odniesienie do przyszłości: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


2939
2017-07-06 11:49



Przydałoby się to zauważyć -p/--patch jest skrótem do akcji łatki wewnątrz -i/--interactive polecenie, które inicjuje użyteczne Tryb interaktywny. - tutuDajuju
> Co się stanie, jeśli ten plik jest już wystawiony na próbę? Pokaże tylko zmiany niezajęte. Taki sam jak git diff robi. - Eugen Konkov
Jak mogę ręcznie edytować bieżący portyk? Nie wiem, co zrobić po wpisaniu e. - Hunsu
Po naciśnięciu e, Możesz edytować przystawkę ręcznie, zastępując + lub - przez # - veksen
robi s już nie istnieje? - tam5


Możesz użyć git add --interactive lub git add -p <plik>, i wtedy git commit (nie  git commit -a); widzieć Tryb interaktywny w git-add manpage lub po prostu postępuj zgodnie z instrukcjami.

Współczesny Git ma również git commit --interactive (i git commit --patch, który jest skrótem do opcji poprawki w interaktywnym zatwierdzeniu).

Jeśli wolisz robić to z GUI, możesz użyć git-gui. Możesz po prostu oznaczyć 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ę.


216
2017-07-06 02:41



Co ciekawe, witryna windows.github.com obsługiwała częściowe zatwierdzenia plików, ale wydaje się, że niedawno ją upuściła. - Juri
@Juri Myślę, że wsparcie dla częściowych zatwierdzeń plików jest z powrotem. - Ela782
@ Ela782 oh..Tak, masz rację. Za wskazanie tego. - Juri
@Juri Nie ma za co. Właściwie nigdy nie zauważyłem, że było tam wcześniej - widziałem to w zeszłym tygodniu i pomyślałem "no, co za niesamowita nowa funkcja"! :-) - Ela782
W dzisiejszych czasach windows.github.com przekierowuje na przemianowany GitHub Desktop, który jest ładniejszy niż Git GUI i obsługuje częściowe zatwierdzenia ... ale nie obsługuje podpisywania commitów. Westchnienie. - hacksalot


git gui zapewnia tę funkcjonalność w widoku różnic. Kliknij prawym przyciskiem myszy wiersz (y), który Cię interesuje i powinieneś zobaczyć pozycję menu "Stwórz ten wiersz, by zatwierdzić".


115
2017-09-25 20:45



w przypadku złożonych łat to zwykle jest to dla mnie najszybsze podejście. - hochl
Jest to bardzo wydajny i intuicyjny sposób dodawania zmian w obszarze przemieszczania w drobnoziarnisty sposób. Można również wybrać wiele linii i wszystkie zmiany w tym wyborze zostaną dodane. - jox


Wierzę w to git add -e myfile to najprostszy sposób (przynajmniej moje preferencje), ponieważ po prostu otwiera edytor tekstowy i pozwala wybrać, którą linię chcesz ustawić i która linia nie. Odnośnie poleceń edycji:

dodana zawartość:

Dodana zawartość jest reprezentowana przez linie zaczynające się na "+". Możesz zapobiec przemieszczaniu linii dodawania, usuwając je.

usunięta treść:

Usunięte treści są reprezentowane przez linie zaczynające się na "-". Możesz zapobiec ich przeniesieniu poprzez konwersję "-" na "" (spacja).

zmodyfikowana treść:

Zmodyfikowana zawartość jest reprezentowana przez linie "-" (usuwanie starej treści), a następnie "+" (dodawanie zawartości zastępczej). Możesz zapobiec wprowadzaniu modyfikacji przez konwersję "-" linii na "" i usunięcie "+"              kwestia. Pamiętaj, że modyfikowanie tylko połowy pary może wprowadzić mylące zmiany w indeksie.

Wszystkie szczegóły dotyczące git add są dostępne na git --help add 


55
2018-02-23 10:37



Byłoby to bardziej użyteczne, gdyby istniało jasne wyjaśnienie, gdzie właściwie wybrać te linie (tj. Faktyczne polecenia do wprowadzenia). Nie mogłem znaleźć żadnego w dokumentacji. Czy możesz dodać referencję? - Alex
Dla tych, którzy nie lubią opcji stenograficznych, -ejest --edit. - Kolyunya
@Alex Cytaty odniesienia dodane przezFrancjaBanana pochodzą z sekcji EDYCJA PATCHÓW w git --help add - Randall
Jest to jedyna odpowiedź (wymagająca tylko gita), która rozwiązuje problem dodawania / usuwania linii, gdy nie można zmniejszyć porcji z s w interaktywnym trybie poprawki. - cdosborn
Niestety, nie chcę tworzyć nowego pytania, ale jak używać symboli wieloznacznych podczas uruchamiania tego polecenia? Próbowałem go z git add -e - ** / * Activity.java, ale to nie zadziałało. Jednak git diff - ** / * Activity.java działa. Wygląda na to, że opcja -e wymaga specjalnej obsługi w tym przypadku. - ka3ak


Jeśli używasz vima, możesz wypróbować doskonałą wtyczkę o nazwie zbieg.

Możesz zobaczyć różnicę pliku między kopią roboczą a indeksem przy pomocy :Gdiff, a następnie dodaj linie lub bryły do ​​indeksu za pomocą klasycznych poleceń vim diff, takich jak dp. Zapisz zmiany w indeksie i zatwierdz z :Gcommit, i jesteś skończony.

Bardzo dobre wstępne screencasty tutaj (patrz szczególnie. część 2).


41
2017-08-12 13:32



Dziękuję bardzo za te linki. Dokładnie to, czego potrzebuję. Szczególnie :diffget/:diffput w trybie wizualnym, gdzie mogę wybrać określone linie, które chcę zresetować / zatwierdzić. Tak więc, upewnij się jeszcze raz: vim jest niesamowity. - goodniceweb


Zdecydowanie polecam używanie SourceTree z Atlassian. (To nic nie kosztuje). To sprawia, że ​​jest to banalne. Możesz szybko i łatwo przesyłać poszczególne porcje kodu lub poszczególne linie kodu.

enter image description here


26
2017-12-05 17:29



Zgadzam się, że SourceTree jest dobrym narzędziem do tego celu, ponieważ zapewnia bardziej precyzyjną kontrolę niż to, co jest możliwe za pośrednictwem wiersza poleceń.
@ cupcake Sprzeczałbym się, widząc, że SourceTree prawdopodobnie używa tych plików wykonywalnych git z wiersza poleceń, z natury zawsze będzie można wykonać te same (lub więcej) drobnoziarniste akcje za pomocą "wiersza poleceń". - tutuDajuju
Bez względu na drobnoziarnisty Argument, który bardzo polecam SourceTree jako umieszczanie porcji i poszczególnych linii jest bardzo proste: i.imgur.com/85bNu4C.png - Michael Freeman
@tutuDajuju W tym przypadku nie jestem pewien, czy to prawda. SourceTree ma możliwość wybrania, które fragmenty są na etapie linia po linii. Nie musisz wystawiać całego przystojniaka; możesz ustawić 2 linie pośrodku przystojniaka. Nie mam pojęcia, jak to się robi. (W tej chwili staram się obejść problem związany z niezdolnością SourceTree do rozmieszczenia poszczególnych wierszy dla niepotkanego pliku.) Wylądowałem tutaj, szukając obejścia, ale okazało się, że ten git najwyraźniej nie oferuje zdolności line-by-line W każdym razie nie w prosty sposób.) - jpmc26
Możesz użyć --patch (jak sugerują inne odpowiedzi) i dziel się przystojniakiem, aż będziesz mógł ustawić odpowiednie wiersze. Istnieje również wiele innych wrapperów i rozszerzeń, które zapewniają interfejs użytkownika (zazwyczaj w postaci pliku różnicowego), który pozwala apply łatka z wybranych linii; takie jak wbudowane git gui i git-meld-index. Po prostu mówiąc, drzewo źródłowe nie jest takie wspaniałe (dawny użytkownik) - tutuDajuju


Warto zauważyć, że do korzystania git add --patch dla nowy plik musisz najpierw dodać plik do indeksu za pomocą git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14