Git
Chapters ▾ 2nd Edition

7.2 Mga Git na Kasangkapan - Staging na Interactive

Staging na Interactive

Sa seksyon na ito, ikaw ay tumitingin sa iilang interactive na Git na mga utos na maaaring makatulong sayo na napadali ang pag-craft ng iyong mga commit upang isama lamang ang tiyak na mga kumbinasyon at mga parte ng mga file. Itong mga kasangkapan ay kapaki-pakinabang kung ikaw ay nakapagbago ng bilang ng mga file at pagkatapos nagpasya na gusto mo ang mga pagbabago na iyon ay nasa ilang naka-focus na mga commit sa halip na isang malaking magulo na commit. Sa ganitong paraan, maaari mong tiyakin na ang iyong mga commit ay lohikal na hiwalay ang mga changeset at madaling masusuri ng mga developer na tumatrabaho kasama ka.

Kung ikaw ay magpatakbo ng git add na may -i o --interactive na opsyon, ang Git ay pumapasok sa isang interactive na shell mode, na nagpapakita na isang bagay na tulad nito:

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

Makikita mo na ang utos na ito ay nagpapakita sayo ng isang mas kakaibang hitsura ng iyong staging na lugar kaysa nakagawiang paggamit nito — talagang, ang parehong impormasyon na iyong makukuha gamit ang git status kung saan ay medyo maikli at makabuluhan. Ito ay naglilista ng mga pagbabago na iyong na-stage sa kaliwa at mga hindi na stage na mga pagbabago sa iyong kanan.

Pagkatapos ito ay mayroon ding isang “Commands” na seksyon, na kung saan ay nagpapahintulot sayo na gawin ang iilang mga bagay katulad ng staging at unstaging na mga file, ang staging na mga parte ng mga file, ang pagdagdag ng untracked na mga file, at ang pagpakita ng mga diff sa kung ano ang na-staged.

Ang Pag-staging at Unstaging na mga File

Kung ikaw ang nag-type ng 2 o u sa What now> prompt, ikaw ay sinesenyasan kung anong mga file na gusto mong i-stage:

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

Sa pag-stage ng TODO at index.html na mga file, maaari kang mag-type ng mga numero:

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

Ang * na susunod sa bawat file ay nangangahulugan na ang file ay napili na i-stage. Kung ikaw ay pumindot sa Enter pagkatapos mag-type ng wala sa Update>> na prompt, ang Git kumukulang kung ano ang napili at i-stage ito para sa iyo:

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

Ngayon ay maaari mong makita ang TODO at index.html na mga file na nai-stage at ang simplegit.rb na file ay nanatiling naka-unstaged. Kung gusto mong i-unstage ang TODO na file mula rito, gamitin mo ang 3 o r (para bumalik) na opsyon:

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

Paghahanap muli sa katayuan ng iyong Git, makikita mo na nai-unstaged mo ang TODO na file:

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

Upang tingnan ang diff ng iyong nai-stage, maaari kang gumamit ng 6 o d (para sa diff) na utos. Ito ay nagpapakita sa iyo ng isang listahan sa iyong na-stage na mga file, at maaari kang pumili ng isa lang para gusto mong makita ang na-stage diff. Ito ay maraming tulad ng pagtukoy sa git diff --cached sa 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">

Sa mga pangunahing mga utos, maaari mong gamitin ang interactive na pagdagdag na mode upang makikitungo sa iyong staging na lugar na mas madali.

Ang mga Patch ng Staging

Ito rin ay posible para sa Git na i-stage ang tiyak na mga parte ng mga file at hindi ang lahat. Halimbawa, kung ikaw ay gumawa ng dalawang pagbabago sa iyong simplegit.rb na file at gusto mong i-stage ang isa sa kanila at hindi ang iba, sa paggawa nito ay isang pinakamadali sa Git. Mula sa parehong interactive prompt ay ipinaliwanag sa nakaraang seksyon, i-type ang 5 o p (para sa patch). Ang Git ay magtatanong kung anong mga file ang gusto mo na i-bahagyang i-stage; pagkatapos, para sa bawat seksyon sa napiling mga file, ito ay magpakita ng mga hunk sa file na diff at magtanong na kung gusto mong i-stage sila, isa-isa:

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

Ikaw ay merong maraming mga opsyon sa puntong ito. I-type ang ? na magpapakita ng listahan kung ano ang gagawin:

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

Sa pangkalahatan, ikaw ay mag-type ng y o n kung gusto mong i-stage ang bawat hunk, ngunit ang pag-stage sa lahat sa kanila ng tiyak na mga file o paglaktaw sa isang hunk na desisyon hanggang mamaya ay maaaring makatulong din. Kung ikaw ay mag-stage ng isang parte ng file at iwan ang ibang parte na naka-unstage, ang iyong katayuan sa output ay magmukhang ganito:

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

Ang katayuan ng simplegit.rb na file ay kawili-wili. Ito ay nagpapakita sa iyo na isang pares ng mga linya ay na-stage at ang isang pares ay naka-unstage. Ikaw ay bahagyang na-stage ang file na ito. Sa puntong ito, maaari mong lumabas sa interactive na pagdagdag na script at ipatakbo ang git commit upang i-commit ang bahagyang naka-stage na mga file.

Ikaw din ay hindi nangangailangan na naka-interactive na nagdagdag na mode upang gawin ang bahagyang-file na staging — kaya mong simulan ang parehong script sa pamamagitan ng paggamit ng git add -p o git add --patch sa command line.

At saka, maaari mong gamitin ang patch mode para sa bahagyang pag-reset ng mga file na gamit ang git reset --patch na utos, para sa pagsusuri ng mga parte ng mga file na may git checkout --patch na utos at para sa pag-stash ng mga parte ng mga file na may git stash save --patch na utos. Pupunta tayo sa mas detalyado sa bawat na mga ganito hanggang tayo ay nasa mas advance na paggamit sa mga utos na ito.