Git
Chapters ▾ 2nd Edition

7.2 Git Tools - Interactief stagen

Interactief stagen

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.

Bestanden stagen en unstagen

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 : support@github.com</div>
+<div id="footer">contact : email.support@github.com</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.

Patches stagen

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.

scroll-to-top