Git
Chapters ▾ 2nd Edition

7.2 Гит алати - Интерактивно стејџовање

Интерактивно стејџовање

Програм Git долази са неколико скрипти које олакшавају неке задатке из команде линије. Овде ћете упознати неколико интерактивних комади које вам могу помоћи да лако састављате своје комитове тако да се у њих укључе само одређене комбинације и делови фајлова. Ови алати су од изванредне помоћи ако измените гомилу фајлова, па онда одлучите да је боље да се те измене организују у неколико фокусираних комитова, уместо у једном великом запетљаном комиту. На тај начин можете обезбедити да су ваши комитови логички груписани скупови измена које програмери који раде са вама једноставно могу да провере. Ако команду git add извршите са -i или --interactive опцијом, програм Гит прелази у режим интерактивне љуске и приказује нешто слично овоме:

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

Можете видети да вам ова команда приказује доста другачији поглед на ваш стејџ – у основи су то исте информације које добијате са git status, али мало сажетије и информативније. Она на левој страни приказује измене које сте поставили на стејџ, а на десној измене које нису на стејџу.

Након тога следи „Commands” одељак са командама који вам омогућава да урадите већи број ствари, као што је стављање и уклањање фајлова са стејџа, постављање делова фајлова на стејџ, додавање фајлова који се не прате и приказ разлике онога што је постављено на стејџ.

Постављање и уклањање фајлова са стејџа

Ако на What now> одзиву откуцате u или 2 (за update – ажурирање), скрипта тражи да наведете фајлове које желите да ставите на стејџ:

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

Ако желите да фајлове TODO и index.html поставите на стејџ, можете да откуцате бројеве:

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

* поред сваког фајла значи да је фајл изабран са стављање на стејџ. Ако на Update>> одзиву не откуцате ништа већ само притиснете ентер, програм Гит уместо вас узима све изабране фајлове и поставља их на стејџ:

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

Сада можете видети да се фајлови TODO и index.html налазе на стејџу и да се фајл simplegit.rb још увек не налази на стејџу. Ако у овом тренутку желите да фајл TODO уклоните са стејџа, можете употребити опцију r или 3 (за revert – враћање):

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

Ако поново погледате на ваш Гит статус, видећете да сте фајл 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

Ако желите да видите разлику онога што сте поставили на стејџ, употребите команду d или 6 (за diff). Она вам приказује списак фајлова који се налазе на стејџу, па можете да изаберете оне за које бисте желели да погледате разлику са стејџа. Ово веома личи на задавање git diff --cached на командној линији:

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

Овим основним командама можете користити режим интерактивног додавања који вам омогућава једноставнији рад са стејџом.

Постављање закрпа на стејџ

Постоји могућност да програм Гит на стејџ постави само одређене делове фајлова. На пример, ако направите две измене у фајлу simplegit.rb, а желите да само једну од њих поставите на стејџ, то ћете веома лако постићи програмом Гит. На интерактивном одзиву откуцајте p или 5 (за patch – закрпа). Програм Git ће вас питати да наведете фајлове ко желите делимично да ставите на стејџ; затим ће за сваки одељак изабраних фајлова да прикаже блокове разлике фајла и питаће вас да ли желите да их поставите на стејџ, један по један:

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

У овом тренутку имате доста опција. Ако откуцате ? приказаће вам се листа ствари које можете да урадите:

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

У општем случају ћете откуцати y или n ако желите или нећете да поставите текући блок на стејџ, али помаже и да их за неке фајлове поставите све одједном или да одлуку за дати блок одложите за касније. Ако део неког фајла поставите на стејџ а остатак остане ван стејџа, имаћете следећи статус:

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

Статус simplegit.rb фајла је врло интересантан. Приказује вам да је неколико линија на стејџу, а неколико није. Овај фајл сте делимично поставили на стејџ. У овом тренутку можете да напустите скрипту за интерактивно додавање и извршите команду git commit којом ћете комитовати фајлове делимично налазе на стејџу.

Да бисте урадили делимично постављање фајла на стејџ, нема потребе да се налазите у режиму интерактивног додавања – исту скрипту можете да покренете употребом git add -p или git add --patch на командној линији.

Уз то, режим закрпе можете да користите и за делимично ресетовање фајлова reset --patch командом, за одјављивање делова фајлова checkout --patch командом и за сакривање делова фајлова stash save --patch командом. Како будемо прелазили на напреднију употребу ових команди, приказаћемо више детаља о свакој од њих.