Vraag Bepaal slechts een gedeelte van een bestand in Git


Wanneer ik in Git wijzigingen in een bestand aanbreng, hoe kan ik dan slechts enkele van de wijzigingen toewijzen?

Hoe zou ik bijvoorbeeld slechts 15 regels van 30 regels kunnen vastleggen die in een bestand zijn gewijzigd?


2237
2017-07-06 02:25


oorsprong


antwoorden:


Je kunt gebruiken git add --patch <filename> (of -p Kortom), en git zal beginnen met het opsplitsen van je bestand in wat het denkt dat het verstandige "knutsels" zijn (delen van het bestand). Vervolgens wordt u gevraagd om deze vraag:

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

Hier is een beschrijving van elke optie:

  • Y plan deze hunk voor de volgende commit
  • n voer deze hunk niet uit voor de volgende commit
  • q stoppen; niet deze hunk of een van de overgebleven knotsen opvoeren
  • een toon deze hunk en alle latere hunks in het bestand
  • d niet deze hunk of een van de latere eenheden in het bestand uitvoeren
  • g selecteer een homp om naar toe te gaan
  • / zoek naar een homp die overeenkomt met de gegeven regex
  • j laat deze homp onbeslist achter, zie de volgende onbesliste homp
  • J laat deze hunk onbeslist achter, zie de volgende hunk
  • k laat deze homp onbeslist achter, zie eerder onbesliste hink
  • K laat deze hunk onbeslist achter, zie vorige hunk
  • s deel de huidige homp in kleinere knotsen
  • e handmatig de huidige hunk bewerken
  • ? Help voor afdrukken

Als het bestand nog niet in de repository staat, kunt u het eerst doen git add -N <filename>. Daarna kun je verder gaan git add -p <filename>.

Daarna kunt u gebruiken:
git diff --staged om te controleren of je de juiste veranderingen hebt doorgevoerd
git reset -p om per ongeluk toegevoegde hunks toe te voegen
git commit -v om je commit te bekijken terwijl je het commit-bericht bewerkt.

Let op dit is heel anders dan de git format-patch commando, welk doel is om commit data in a te ontleden .patch bestanden.

Referentie voor de toekomst: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging


2931
2017-07-06 11:49



Je kunt gebruiken git add --interactive of git add -p <het dossier>, en dan git commit (niet  git commit -a); zien Interactieve modus in git-add manpage, of volg gewoon de instructies.

Modern Git heeft ook git commit --interactive (en git commit --patch, wat een snelkoppeling is naar de patch-optie in interactieve commit).

Als u het liever vanuit de GUI doet, kunt u gebruiken git-gui. U kunt gewoon chunks markeren die u in commit wilt opnemen. Ik vind het persoonlijk gemakkelijker dan gebruiken git add -i. Andere git GUI's, zoals QGit of GitX, kunnen deze functionaliteit ook hebben.


215
2017-07-06 02:41



Git Gui biedt deze functionaliteit onder de diff-weergave. Klik gewoon met de rechtermuisknop op de regel (en) waarin u geïnteresseerd bent en u zou een menu moeten zien dat deze regel kan vastleggen.


115
2017-09-25 20:45



ik geloof dat git add -e myfile is de gemakkelijkste manier (althans mijn voorkeur), omdat het eenvoudig een teksteditor opent en je kunt kiezen welke regel je wilt opvoeren en welke lijn je niet wilt. Betreffende bewerkingsopdrachten:

toegevoegde inhoud:

Toegevoegde inhoud wordt weergegeven door lijnen die beginnen met "+". U kunt voorkomen dat toevoegingsregels worden gestationeerd door ze te verwijderen.

verwijderde inhoud:

Verwijderde inhoud wordt weergegeven door lijnen die beginnen met "-". U kunt voorkomen dat ze worden verwijderd door de "-" in een "" (spatie) te converteren.

gewijzigde inhoud:

Gewijzigde inhoud wordt weergegeven door "-" regels (het verwijderen van de oude inhoud) gevolgd door "+" regels (het toevoegen van de vervangende inhoud). U kunt voorkomen dat de wijziging wordt opgestart door "-" regels naar "" te converteren en "+" te verwijderen              lijnen. Pas op dat het wijzigen van slechts de helft van het paar waarschijnlijk verwarrende wijzigingen in de index zal introduceren.

Alle details over git add zijn beschikbaar op git --help add 


55
2018-02-23 10:37



Als je vim gebruikt, wil je misschien de uitstekende plugin proberen die is aangeroepen vluchteling.

U kunt de diff van een bestand tussen werkkopie en index zien met :Gdiffen voeg vervolgens regels of knikken toe aan de index met behulp van klassieke vim-diff-opdrachten zoals dp. Sla de wijzigingen op in de index en commit met :Gcommit, en je bent klaar.

Zeer goede inleidende screencasts hier (zie esp. deel 2).


41
2017-08-12 13:32



Ik zou het sterk aanbevelen om te gebruiken SourceTree van Atlassian. (Het is gratis.) Het maakt dit triviaal. U kunt afzonderlijke code-eenheden of individuele regels code snel en eenvoudig opvoeren.

enter image description here


26
2017-12-05 17:29



Het vermelden waard dat te gebruiken git add --patch voor een nieuw bestand u moet eerst het bestand toevoegen om te indexeren met git add --intent-to-add:

git add -N file
git add -p file

20
2018-06-06 22:14



Wanneer ik veel wijzigingen heb en uiteindelijk een aantal commits van de wijzigingen zal maken, wil ik mijn startpunt tijdelijk opslaan voordat ik de dingen installeer.

Soortgelijk:

$ 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

Whymarrh's antwoord is wat ik gewoonlijk doe, behalve soms zijn er veel veranderingen en ik kan vertellen dat ik een fout kan maken tijdens het ensceneren van dingen, en ik wil een geëngageerde staat waar ik op kan terugvallen voor een tweede pass.


17
2017-07-08 07:00



Mocht je emacs gebruiken, kijk dan eens naar Magit, dat een git-interface biedt voor emacs. Het ondersteunt staging hunks (delen van bestanden) vrij goed.


12
2017-08-07 13:25



Net zoals jdsumsion's antwoord kun je ook je huidige werk opslaan, maar gebruik dan een difftool-achtige meld om geselecteerde veranderingen uit de voorraad te halen. Op die manier kun je zelfs hunks handmatig aanpassen, wat een beetje lastig is als je erin zit git add -p:

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

Het gebruik van de stash-methode geeft je de mogelijkheid om, als je code nog werkt, te testen voordat je het commit.


7
2017-07-27 09:52



Voor degenen die gebruiken Git Extensions:

Selecteer in het venster Commit het bestand dat u gedeeltelijk wilt vastleggen, selecteer vervolgens de tekst die u wilt vastleggen in het rechterdeelvenster, klik met de rechtermuisknop op de selectie en kies 'Geaccentueerde lijnen sorteren' in het contextmenu.


7
2018-01-09 17:11