Popravite samo dio datoteke u Git-u

Kada unesem promjene u datoteku u Git-u, kako mogu napraviti samo neke promjene?

Na primjer, kako mogu izvršiti samo 15 redaka od 30 redaka koji su promijenjeni u datoteci?

2394
06 июля '09 в 5:25 2009-07-06 05:25 freddiefujiwara je postavljen 6. srpnja u 5:25 am 2009-07-06 05:25
@ 22 odgovora

Možete koristiti git add --patch <filename> (ili - -p za kratko), a git će početi dijeliti vašu datoteku na ono što smatra razumnim "dijelovima" (dijelovi datoteke). Onda će vam reći ovo pitanje:

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

Evo opisa svake opcije:

  • y pripremite ovaj komad za sljedeću predaju
  • n ne stavljajte ovaj komad za sljedeću predaju
  • q izlaz; nemojte stavljati ovaj komad ili bilo koji od preostalih dijelova
  • a stavlja ovaj dio i sve naknadne fragmente u datoteku
  • d ne stavljajte ovaj blok ili bilo koji kasniji fragment u datoteku
  • g odaberite dio u koji želite otići
  • / traži za blok koji odgovara navedenom regularnom izrazu
  • j ostavite ovaj dio neriješen, pogledajte sljedeći nerazriješeni komad
  • Ostavi ovaj dio neriješen, vidi sljedeći komad
  • k ostavite ovaj komad neriješen, vidi prethodni dio neriješen
  • K ostavi ovaj dio neriješen, vidi prethodni dio
  • Podijelite tekući komad na manje fragmente
  • e ručno uredite trenutni blok
  • ? pomoć za ispis

Ako datoteka već nije u spremištu, najprije možete napraviti git add -N <filename> . Nakon toga možete nastaviti s git add -p <filename> .

Nakon toga možete koristiti:

  • git diff --staged kako biste bili sigurni da ste unijeli ispravne promjene
  • git reset -p za poništavanje pogrešno dodanih fragmenata
  • git commit -v za prikaz urezivanja tijekom uređivanja poruke urezivanja.

Napominjemo da se to jako razlikuje od naredbe git format-patch , koja ima za cilj analizirati .patch podatke .patch datoteka.

Veza s budućnošću: Git Tools - Interaktivna proizvodnja

3149
06 июля '09 в 5:36 2009-07-06 05:36 odgovor je dao cloudhead Srpanj 06 '09 u 5:36 2009-07-06 05:36

Možete koristiti git add --interactive ili git add -p <file> , a zatim git commit ( ne git commit -a ); pogledajte interaktivni način rada na stranici s git-add ili jednostavno slijedite upute.

Modern Git također ima git commit --interactive (i git commit --patch , koji je prečac do parametra zakrpe u interaktivnom predavanju).

border=0

Ako to želite učiniti iz GUI-ja, možete koristiti git-gui . Možete jednostavno označiti dijelove koje želite uključiti u urezivanje. Osobno mi je lakše nego koristiti git add -i . Drugi Git GUI-ji, kao što su QGit ili GitX, također mogu imati tu funkcionalnost.

223
06 июля '09 в 14:49 2009-07-06 14:49 odgovor je dao Jakub Narębski 6. srpnja u 14:49 2009-07-06 14:49

git gui pruža ovu funkcionalnost kao diff. Samo kliknite desnom tipkom na željenu liniju i vidjet ćete stavku izbornika "Ovaj redak za popravak".

118
06 июля '09 в 5:41 2009-07-06 05:41 Odgovor je dao Ionuț G. Stan 6. srpnja u 5:41 am 2009-07-06 05:41

Vjerujem da je git add -e myfile najjednostavniji način (barem moje postavke), jer jednostavno otvara uređivač teksta i omogućuje vam da odaberete koji redak želite izvršiti i koji redak ne želite. Što se tiče naredbi za uređivanje:

Dodani sadržaj:

Dodani sadržaj predstavlja redak koji počinje s "+". Izbrisanjem možete spriječiti stvaranje bilo kojeg dodatka.

udaljeni sadržaj:

Izbrisani sadržaj predstavljen je nizovima koji počinju s "-". Možete spriječiti njihovo brisanje pretvaranjem "-" u "" (razmak).

izmijenjeni sadržaj:

Izmijenjeni sadržaj predstavljen je crtama "-" (brisanje starog sadržaja), nakon čega slijede linije "+" (dodavanje sadržaja zamjene). Možete spriječiti instalaciju izmjene pretvaranjem nizova "-" u "" i uklanjanjem linija "+". Zapamtite da će promjena samo pola para dovesti do zbunjujućih promjena indeksa.

Svaka git add dostupna je na git --help add

64
25 сент. odgovor je daoFreedomBanana 25. rujna 2015-09-25 23:45 '15 u 23:45 2015-09-25 23:45

Ako koristite vim, možete isprobati veliki dodatak koji se zove bjegunac .

Možete vidjeti diff datoteku između radne kopije i indeksa s :Gdiff , a zatim dodajte redove ili stupce indeksu koristeći klasične vim diff naredbe, kao što je dp . Spremite promjene u indeks i kopirajte ga s :Gcommit i gotovi ste.

Vrlo dobar uvod ovdje (vidi 2. dio ).

42
23 февр. Odgovor je dao François 23. veljače. 2012-02-23 13:37 '12 u 1:37 pm 2012-02-23 13:37

Ja visoko preporučiti koristeći Atlassian je SourceTree . (To je besplatno.) To ga čini trivijalnim. Možete brzo i jednostavno stvoriti pojedinačne dijelove koda ili pojedine retke koda.

2019

29
12 авг. odgovor daje korisnik486646 12 aug. 2014-08-12 16:32 '14 u 16:32 2014-08-12 16:32

Važno je napomenuti da da biste koristili git add --patch za novu datoteku, prvo morate dodati datoteku u indeks pomoću git add --intent-to-add :

 git add -N file git add -p file 
22
05 дек. Odgovor daje korisnik1338062 05 prosinca. 2014-12-05 20:29 '14 u 20:29 2014-12-05 20:29

Kad imam puno promjena i na kraju stvorim nekoliko obveza iz promjena, želim privremeno spremiti moju početnu točku prije stvaranja stvari.

Evo ga:

 $ 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 

Whymarhov odgovor je ono što obično radim, osim činjenice da se ponekad događaju mnoge promjene, i mogu reći da mogu pogriješiti dok postavljam stvari, i želim da se neka država povuče u drugu propusnicu. ,

19
07 июня '13 в 1:14 2013-06-07 01:14 odgovor je dan jdsumsion 7. lipnja '13 u 1:14 2013-06-07 01:14

Ako koristite emacs, pogledajte Magit , koji daje git sučelje za emacs. Dobro podupire intermedijerne dijelove (dijelove datoteka).

12
08 июля '09 в 10:00 2009-07-08 10:00 Odgovor dao je Mark van Lent 08. srpnja u 10:00 2009-07-08 10:00

Kao i kod jdsumsion, također možete sakriti svoj trenutni rad, ali zatim pomoću difffoola, kao što je meld, povući odabrane promjene iz predmemorije. Tako možete čak i ručno urediti dijelove, što je malo bolno kada u git add -p :

 $ git stash -u $ git difftool -d -t meld stash $ git commit -a -m "some message" $ git stash pop 

Korištenje skrivene metode daje vam mogućnost da testirate je li vaš kod još uvijek pokrenut prije nego ga izvršite.

8
07 авг. odgovor dano derhoch 07 aug. 2013-08-07 16:25 '13 u 16:25 2013-08-07 16:25

Intellij IDEA (i vjerujem da su svi ostali proizvodi iz serije) izgradili podršku za djelomične obveze, od v2018.1

2019

28 марта '18 в 10:00 2018-03-28 10:00 Odgovor je dao Holger Brandl 28. ožujka 2010. u 10:00 sati 2018-03-28 10:00

Za one koji koriste Git proširenja :

U prozoru "Kopiraj" odaberite datoteku koju želite djelomično urezati, zatim odaberite tekst koji želite popraviti u desnom oknu, zatim kliknite desnom tipkom miša na odabir i odaberite "Generiraj odabrane linije" u kontekstnom izborniku.

7
27 июля '15 в 12:52 2015-07-27 12:52 odgovor je dao srgstm 27. srpnja '15 u 12:52 2015-07-27 12:52

Vim-gitgutter plugin može stvoriti komade bez napuštanja vim editora, koristeći

 :GitGutterStageHunk 

Osim toga, pruža i druge zanimljive značajke, kao što je stupac s drugim znakom, kao u nekim modernim IDE-ovima.

Ako se samo dio komadića dostavlja vim- bjegunac

 :Gdiff 

omogućuje vam da odaberete raspon vidljivog raspona, a zatim :'<,'>diffput ili :'<,'>diffget za promjenu / promjenu pojedinih linija.

6
09 янв. odgovor je dan c0ffeeartc 09 jan. 2015-01-09 20:11 '15 u 20:11 2015-01-09 20:11

Pokušao sam git add -p filename.x , ali na Macu sam otkrio da je gitx ( http://gitx.frim.nl/ ili https://github.com/pieter/gitx ) mnogo lakše napraviti upravo one linije koje sam htio ,

5
16 авг. odgovor dao jasongregori 16 kol. 2011-08-16 02:43 '11 u 2:43 2011-08-16 02:43

S TortoiseGit:

Desnom tipkom miša kliknite datoteku i koristite Context Menu → Restore after commit . To će stvoriti kopiju datoteke kakva jest. Zatim možete urediti datoteku, na primjer. TortoiseGitMerge i odbacite sve izmjene koje ne želite izvršiti. Nakon spremanja tih promjena, možete predati datoteku.

4
06 апр. odgovor je dano u Fr0sT 06 apr. 2015-04-06 19:16 '15 u 19:16 2015-04-06 19:16

git-meld-index - citiranje s web-lokacije:

git -meld-index pokreće meld - ili bilo koji drugi git diffftool (kdiff3, diffuse, itd.) - tako da možete interaktivno mijenjati promjene git indeksa (također poznatog kao git).

To je slično funkcionalnosti git add -p i git add --interactive. U nekim slučajevima, povezivanje je lakše / brže nego git add -p. To je zato što vam meld omogućuje, na primjer:

  • vidi više konteksta
  • vidi intralne razlike
  • uredite ga ručno i pogledajte "uživo" različita ažuriranja (ažurirana nakon svakog pritiska na tipku)
  • idite na promjenu, bez n za svaku promjenu koju želite preskočiti.

Upotreba

U repozitoriju git pokrenite:

 git meld-index 

Vidjet ćete da se meld (ili konfigurirani git diffftool) pojavljuje pored

LIJEVO : privremene datoteke imenika kopirane s radnog stabla

DESNO : privremeni imenik s sadržajem indeksa. To također uključuje datoteke koje još nisu u indeksu, ali su promijenjene ili nisu označene u radnoj kopiji - u ovom slučaju vidjet ćete sadržaj datoteke iz HEAD.

Uredite indeks (desno) dok ne bude zadovoljan. Ne zaboravite spremiti ako je potrebno.

Kada završite, zatvorite meld i git-meld-index će ažurirati indeks kako bi odgovarao sadržaju privremenog imenika na desnoj strani naredbe spojene koju ste upravo uredili.

2
04 июля '15 в 23:26 2015-07-04 23:26 odgovor je dao Croad > 4. srpnja 15. u 23:26 2015-07-04 23:26

Emacs također ima gitsum

2
13 июля '09 в 0:52 2009-07-13 00:52 odgovor je dat zut 13. srpnja '09 u 0:52 2009-07-13 00:52

Dodavanjem prethodnog odgovora, ako želite koristiti naredbeni redak, upišite git add -e myfile daje vam izbor da odaberete red po redak koji želite git add -e myfile , jer će ova naredba otvoriti uređivač s razlikama, na primjer:

2019

24 авг. Odgovor je dat Beto Aveiga 24 aug. 2018-08-24 18:24 '18 u 18:24 2018-08-24 18:24

Za korisnike Atoma , paket github uključuje postavku interaktivnog git gui stila. Za naljepnice pogledajte dokumentaciju o pakiranju.

Korištenje Atoma omogućuje rad s temom na tamnoj pozadini (prema zadanim postavkama git gui ima bijelu pozadinu).

1
10 апр. Odgovor koji je dao Ioannis Filippidis 10. travnja 2018-04-10 05:31 '18 u 17:31 2018-04-10 05:31

Kao što jedan od gore navedenih odgovora pokazuje, možete koristiti git add --patch filename.txt

ili kratki obrazac git add -p filename.txt

... ali za datoteke koje se već nalaze u vašem spremištu, mnogo je bolje koristiti zastavicu -patch za naredbu urezivanja (ako koristite prilično nedavnu verziju git-a): git commit --patch filename.txt

... ili, opet, kratki oblik git commit -p filename.txt

... i zatim pomoću specificiranih tipki (y / n, itd.) odaberite linije koje će biti uključene u urezivanje.

1
30 июня '14 в 11:34 2014-06-30 11:34 odgovor je dao Samuel Lampa 30. lipnja 2014. u 11:34 2014-06-30 11:34

git-cola je izvrsno grafičko sučelje, kao i ugrađena funkcija. Jednostavno odaberite linije za scenu i pritisnite S. Ako nema odabira, izvršava se puni komad.

0
27 авг. odgovor je dan AndiDog 27 aug. 2015-08-27 14:28 '15 u 14:28 2015-08-27 14:28

Ako je na Windows platformi, po mom mišljenju, git gui je najbolji alat za stage / commit više linija iz unstaged datoteke.

1. Hank:

  • Odaberite datoteku u odjeljku unstagged Changes
  • Desnom tipkom miša kliknite kôd koji želite izvršiti.
  • Odaberite Stage Hunk for commit

2. Redak:

  • Odaberite datoteku u odjeljku unstagged Changes
  • Odaberite redak / redove koji će biti raspoređeni.
  • Odaberite Stage Lines for commit

3. Ako želite stvoriti potpunu datoteku, osim nekoliko redaka:

  • Odaberite datoteku u odjeljku unstagged Changes
  • Pritisnite Ctrl+T (Stage file to commit)
  • Odabrana datoteka sada je premještena u odjeljak Staged Changes mijenjanje.
  • Odaberite redak / redove koji će biti raspoređeni.
  • Odaberite UnStage Lines for commit
0
28 мая '15 в 15:52 2015-05-28 15:52 Odgovor daje Anvesh Yalamarthy 28. svibnja '15 u 15:52 2015-05-28 15:52

Ostala pitanja o oznakama ili postavi pitanje