Hier gaan we een blik werpen op een paar interactieve Git commando’s die je kunnen helpen om eenvoudig in je commits alleen bepaalde combinaties en delen van bestanden op te nemen. Deze instrumenten zijn zeer handig als je een aantal bestanden wijzigt en dan besluit dat je deze wijzigingen alleen in een aantal gerichte commits wilt hebben in plaats van een grote warrige commit. Op deze manier kan je ervoor zorgen dat je commits logisch onderscheiden wijzigingsgroepen (change sets) zijn en daarmee eenvoudig te reviewen door de ontwikkelaars die met je samenwerken.
Als je git add
aanroept met de -i
of --interactive
optie, zal Git in een interactieve schil modus schakelen, en je iets als het volgende tonen:
$ git add -i
staged unstaged path
1: unchanged +0/-1 TODO
2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now>
Je kunt zien dat dit commando je een heel andere kijk op je staging area geeft — eigenlijk dezelfde informatie die je krijgt met git status
maar wat beknopter en meer informatief.
Het lijst de wijzigingen die je gestaged hebt aan de linker- en de unstagede wijzigingen aan de rechterkant.
Hierna volgt een Commands gedeelte. Hier kan je een aantal dingen doen, waaronder bestanden stagen en unstagen, delen van bestanden stagen, untracked bestanden toevoegen en diffs zien van wat gestaged is.
Als je 2
of u
typt achter de What now>
prompt, zal het script je vragen welke bestanden je wilt stagen:
What now> 2
staged unstaged path
1: unchanged +0/-1 TODO
2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
Update>>
Om de TODO
en index.html
bestanden te stagen, kan je de nummers typen:
Update>> 1,2
staged unstaged path
* 1: unchanged +0/-1 TODO
* 2: unchanged +1/-1 index.html
3: unchanged +5/-1 lib/simplegit.rb
Update>>
De *
naast elk bestand geeft aan dat het bestand geselecteerd is om te worden gestaged.
Als je Enter drukt als je niets typt achter de Update>>
prompt, zal Git alles wat geselecteerd is voor je stagen:
Update>>
updated 2 paths
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 1
staged unstaged path
1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Nu kan je zien dat de TODO
en index.html
bestanden gestaged zijn en het simplegit.rb
bestand nog steeds unstaged is.
Als je het TODO
bestand op dit moment wilt unstagen, kan je de 3
of r
(voor revert) optie gebruiken:
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 3
staged unstaged path
1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Revert>> 1
staged unstaged path
* 1: +0/-1 nothing TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Revert>> [enter]
reverted one path
Als je weer naar je Git status kijkt, kan je zien dat het TODO
bestand unstaged is:
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 1
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: unchanged +5/-1 lib/simplegit.rb
Om de diff te zien van wat je gestaged hebt, kan je het 6
of d
(voor diff) commando gebruiken.
Het laat je een lijst zien van staged bestanden, en je kunt diegenen selecteren waar je de staged diff van wilt bekijken.
Dit is vergelijkbaar met het specificeren van git diff --cached
op de command line:
*** Commands ***
1: status 2: update 3: revert 4: add untracked
5: patch 6: diff 7: quit 8: help
What now> 6
staged unstaged path
1: +1/-1 nothing index.html
Review diff>> 1
diff --git a/index.html b/index.html
index 4d07108..4335f49 100644
--- a/index.html
+++ b/index.html
@@ -16,7 +16,7 @@ Date Finder
<p id="out">...</p>
-<div id="footer">contact : [email protected]</div>
+<div id="footer">contact : [email protected]</div>
<script type="text/javascript">
Met deze simpele commando’s kan je de interactieve toevoeg methode gebruiken om je staging area iets eenvoudiger te bewerken.
Het is ook mogelijk om Git bepaalde delen van bestanden te laten stagen en de rest niet.
Bijvoorbeeld, als je twee wijzigingen maakt in het simplegit.rb
bestand en de ene wilt stagen en de andere niet, is dit erg eenvoudig te doen in Git.
Vanaf dezelfde interactieve prompt die is uitgelegd in de vorige paragraaf, type je 5
of p
(voor patch).
Git zal je vragen welke bestanden je deels wilt stagen; vervolgens, voor elke sectie van de geselecteerde bestanden, zal het een voor een brokken van de bestands-diff laten zien en vragen of je deze wilt stagen:
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index dd5ecc4..57399e0 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -22,7 +22,7 @@ class SimpleGit
end
def log(treeish = 'master')
- command("git log -n 25 #{treeish}")
+ command("git log -n 30 #{treeish}")
end
def blame(path)
Stage this hunk [y,n,a,d,/,j,J,g,e,?]?
Je hebt hier veel keuzes.
Het typen van ?
laat je een lijst zien van wat je kunt doen:
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? ?
y - stage this hunk
n - do not stage this hunk
a - stage this and all the remaining hunks in the file
d - do not stage this hunk nor any of the remaining hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help
Over het algemeen zal je y
of n
typen als je elk deel wilt stagen, maar alle delen in bepaalde bestanden stagen of een besluit om een deel voor nu even over te slaan kan ook handig zijn.
Als je het ene deel van het bestand staged en een ander deel unstaged laat, zal je status uitvoer er zo uit zien:
What now> 1
staged unstaged path
1: unchanged +0/-1 TODO
2: +1/-1 nothing index.html
3: +1/-1 +4/-0 lib/simplegit.rb
De status van het simplegit.rb
bestand is interessant.
Het laat je zien dat een aantal regels staged zijn een een aantal unstaged.
Je hebt het bestand deels gestaged.
Nu kan je het interactieve toevoeg script verlaten en git commit
uitvoeren om de deels gestagede bestanden te committen.
Je hoeft overigens niet in de interactieve toevoeg modues te zijn om het stagen van bestandsdelen te doen — je kunt hetzelfde script starten door git add -p
of git add --patch
op de commando regel te typen.
Bovendien kan je de patch modus gebruiken om bestanden deels te resetten met het reset --patch
commando, om delen van bestanden uit te checken met het checkout --patch
commando en om delen van bestanden te stashen met het stash save --patch
commando.
We zullen meer details geven van elk van deze als we de meer gevorderde toepassingen van deze commando’s gaan behandelen.