Chapters ▾ 2nd Edition

7.2 Git-verktyg - Interaktiv köläggning

Interaktiv köläggning

I det här avsnittet tittar vi på några interaktiva Git-kommandon som kan hjälpa dig att forma dina incheckningar så att de bara innehåller vissa kombinationer och delar av filer. Dessa verktyg är hjälpsamma om du ändrar många filer i stor utsträckning och sedan bestämmer dig för att du vill dela upp ändringarna i flera fokuserade incheckningar i stället för en stor, rörig incheckning. På så sätt kan du se till att dina incheckningar är logiskt separata ändringsmängder och kan granskas enkelt av utvecklarna som arbetar med dig.

Om du kör git add med flaggan -i eller --interactive går Git in i ett interaktivt skalsläge och visar något i stil med detta:

$ 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: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now>

Du kan se att kommandot visar en annan vy av din köyta än du är van vid — i stort sett samma information som i git status, men mer kortfattat och informativt. Det listar ändringarna du har köat till vänster och icke köade ändringar till höger.

Efter detta kommer en sektion med kommandon, som låter dig göra en rad saker som att köa och avköa filer, köa delar av filer, lägga till ospårade filer och visa diffar för det som köats.

Köa och avköa filer

Om du skriver u eller 2 (för uppdatering) vid inmatningsraden What now> får du frågan vilka filer du vill köa:

What now> u
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:    unchanged        +1/-1 index.html
  3:    unchanged        +5/-1 lib/simplegit.rb
Update>>

För att köa filerna TODO och index.html kan du skriva siffrorna:

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>>

* bredvid varje fil betyder att filen är markerad för köläggning. Om du trycker Enter efter att ha lämnat Update>> tom tar Git allt markerat och köar det åt dig:

Update>>
updated 2 paths

*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> s
           staged     unstaged path
  1:        +0/-1      nothing TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

Nu kan du se att filerna TODO och index.html är köade och att filen simplegit.rb fortfarande inte är köad. Om du vill avköa filen TODO vid det här laget använder du alternativet r eller 3 (för återställning):

*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> r
           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

Om du tittar på din Git-status igen kan du se att du har avköat filen TODO:

*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> s
           staged     unstaged path
  1:    unchanged        +0/-1 TODO
  2:        +1/-1      nothing index.html
  3:    unchanged        +5/-1 lib/simplegit.rb

För att se diffen av det du har köat kan du använda kommandot d eller 6 (för diff). Det visar en lista över dina köade filer, och du kan välja dem du vill se diffen för. Det här liknar att ange git diff --cached på kommandoraden:

*** Commands ***
  1: [s]tatus     2: [u]pdate      3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff        7: [q]uit       8: [h]elp
What now> d
           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">

Med dessa grundläggande kommandon kan du använda det interaktiva köläggningsläget för att hantera din köyta lite enklare.

Köa ändringspatchar

Det är också möjligt för Git att köa vissa delar av filer och inte resten. Till exempel, om du gör två ändringar i din simplegit.rb-fil och vill köa den ena men inte den andra är det väldigt enkelt i Git. Från samma interaktiva inmatningsrad som beskrivs i föregående avsnitt, skriv p eller 5 (för ändringspatch). Git frågar vilka filer du vill köa delvis; sedan visar den varje diffstycke och frågar om du vill köa dem, en efter en:

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,?]?

Här har du många alternativ. Om du trycker ? visas en lista över vad du kan göra:

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

I allmänhet skriver du y eller n om du vill köa varje diffstycke, men att köa alla diffstycken i vissa filer eller skjuta upp beslut om ett diffstycke till senare kan också vara till hjälp. Om du köar en del av filen och lämnar en annan del ej köad kommer din statusutdata att se ut så här:

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

Statusen för filen simplegit.rb är intressant. Den visar att några rader är köade och några är ej köade. Du har köat den här filen delvis. Vid det här laget kan du avsluta det interaktiva köläggningsskriptet och köra git commit för att checka in de delvis köade filerna.

Du behöver inte heller vara i interaktivt köläggningsläge för att köa delar av filer — du kan starta samma skript genom att använda git add -p eller git add --patch på kommandoraden.

Dessutom kan du använda ändringspatchläge för att delvis återställa filer med kommandot git reset --patch, för att lägga ut delar av filer med kommandot git checkout --patch och för att lägga undan delar av filer med kommandot git stash save --patch. Vi går in på fler detaljer för varje kommando när vi kommer till mer avancerade användningar av dessa kommandon.