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?
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?
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:
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
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.
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.
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
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 :Gdiff
en 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.
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.
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
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.
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.
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.
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.