Zoeken…
Opmerkingen
Het is vermeldenswaard dat enscenering weinig te maken heeft met 'bestanden' zelf en alles met de veranderingen binnen elk gegeven bestand. We stapelen bestanden die wijzigingen bevatten, en git volgt de wijzigingen als commits (zelfs wanneer de wijzigingen in een commit in meerdere bestanden worden aangebracht).
Het onderscheid tussen bestanden en commits lijkt misschien klein, maar het begrijpen van dit verschil is fundamenteel voor het begrijpen van essentiële functies zoals cherry-pick en diff. (Zie de frustratie in opmerkingen over de complexiteit van een geaccepteerd antwoord dat cherry-pick voorstelt als hulpmiddel voor bestandsbeheer .)
Wat is een goede plek om concepten uit te leggen? Staat het in opmerkingen?
Sleutelbegrippen:
Een bestand is de meest voorkomende metafoor van de twee in informatietechnologie. Best practice dicteert dat een bestandsnaam niet verandert als de inhoud ervan verandert (met een paar erkende uitzonderingen).
Een commit is een metafoor die uniek is voor broncodebeheer. Commits zijn wijzigingen die verband houden met een specifieke inspanning, zoals een bugfix. Commits bevatten vaak meerdere bestanden. Een enkele, kleine bugfix kan aanpassingen in sjablonen en css in unieke bestanden met zich meebrengen. Terwijl de wijziging wordt beschreven, ontwikkeld, gedocumenteerd, beoordeeld en geïmplementeerd, kunnen de wijzigingen in de afzonderlijke bestanden worden geannoteerd en als één eenheid worden verwerkt. De enige eenheid in dit geval is de commit. Even belangrijk is dat de focus op alleen de commit tijdens een review ervoor zorgt dat de ongewijzigde coderegels in de verschillende getroffen bestanden veilig worden genegeerd.
Een enkel bestand opvoeren
Om een bestand voor het plegen van een podium te stapelen, voer je uit
git add <filename>
Alle wijzigingen in bestanden organiseren
git add -A
git add .
In versie 2.x, git add .
zal alle wijzigingen in bestanden in de huidige map en alle bijbehorende submappen opvoeren. In 1.x worden echter alleen nieuwe en gewijzigde bestanden gefaseerd, geen verwijderde bestanden .
Gebruik git add -A
, of het gelijkwaardige commando git add --all
, om alle wijzigingen in bestanden in elke versie van git op te zetten.
Fase verwijderde bestanden
git rm filename
Gebruik de vlag --cached
om het bestand uit git te verwijderen zonder het van schijf te verwijderen
git rm --cached filename
Unstage een bestand dat wijzigingen bevat
git reset <filePath>
Interactieve toevoeging
git add -i
(of --interactive
) geeft je een interactieve interface waar je de index kunt bewerken, om voor te bereiden wat je in de volgende commit wilt hebben. U kunt wijzigingen aan hele bestanden toevoegen en verwijderen, niet-bijgehouden bestanden toevoegen en bestanden verwijderen die niet worden gevolgd, maar u kunt ook een subsectie van wijzigingen selecteren die u in de index wilt opnemen, door delen van de toe te voegen wijzigingen te selecteren, die delen te splitsen of zelfs de diff te bewerken . Veel grafische commit-tools voor Git (zoals bijv. Git git gui
) hebben een dergelijke functie; dit is misschien gemakkelijker te gebruiken dan de versie van de opdrachtregel.
Het is erg handig (1) als je veranderingen in de werkmap hebt verward die je in afzonderlijke commits wilt plaatsen, en niet allemaal in één enkele commit (2) als je midden in een interactieve rebase zit en ook wilt splitsen grote inzet.
$ git add -i
staged unstaged path
1: unchanged +4/-4 index.js
2: +1/-0 nothing package.json
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
De bovenste helft van deze uitvoer toont de huidige status van de index opgesplitst in gefaseerde en niet-gefaseerde kolommen:
-
index.js
heeft 4 regels toegevoegd en 4 regels verwijderd. Het wordt momenteel niet opgevoerd, omdat de huidige status meldt "ongewijzigd". Wanneer dit bestand geënsceneerd wordt, wordt het+4/-4
bit overgebracht naar de gefaseerde kolom en zal de niet-gefaseerde kolom "niets" lezen. -
package.json
heeft één regel toegevoegd en is geënsceneerd. Er zijn geen verdere wijzigingen omdat het is opgevoerd zoals aangegeven door de regel "niets" onder de niet-opgevoerde kolom.
De onderste helft laat zien wat u kunt doen. Voer een cijfer (1-8) of een letter ( s
, u
, r
, a
, p
, d
, q
, h
) in.
status
toont output identiek aan het bovenste gedeelte van de output hierboven.
update
kunt u verdere wijzigingen aanbrengen in de geënsceneerde commits met extra syntaxis.
revert
zal de geënsceneerde commit-informatie terugzetten naar HEAD.
add untracked
kunt u bestandspaden toevoegen die eerder niet zijn gevolgd door versiebeheer.
patch
maakt het mogelijk om één pad te selecteren uit een uitgang vergelijkbaar met status
voor verdere analyse.
diff
toont wat er zal worden gepleegd.
quit
verlaat het commando.
help
biedt verdere hulp bij het gebruik van deze opdracht.
Voeg wijzigingen toe door hunk
Je kunt zien welke "stukjes" van het werk zouden worden opgevoerd voor commit met behulp van de patch-vlag:
git add -p
of
git add --patch
Dit opent een interactieve prompt waarmee u naar de verschillen kunt kijken en u kunt beslissen of u ze wilt opnemen of niet.
Stage this hunk [y,n,q,a,d,/,s,e,?]?
- y stage deze hunk voor de volgende commit
- n plaats deze hunk niet voor de volgende commit
- q stoppen; stel deze hunk of een van de resterende hunks niet op
- een fase deze hunk en alle later hunks in het bestand
- d voer deze hunk of een van de latere delen in het bestand niet uit
- g selecteer een stuk om naar toe te gaan
- / zoeken naar een stuk dat overeenkomt met de gegeven regex
- j laat deze hunk onbeslist, zie volgende onbesliste hunk
- J laat deze hunk onbeslist, zie volgende hunk
- k laat deze hunk onbeslist, zie vorige onbesliste hunk
- K laat deze hunk onbeslist, zie vorige hunk
- s splitst de huidige hunk in kleinere hunks
- e bewerk de huidige hunk handmatig
- ? help afdrukken
Dit maakt het gemakkelijk om veranderingen te vangen die u niet wilt doorvoeren.
Je kunt dit ook openen via git add --interactive
en p
selecteren.
Gefaseerde wijzigingen weergeven
Om de hunks weer te geven die zijn geënsceneerd voor commit:
git diff --cached