Git
Chapters ▾ 2nd Edition

7.2 Εργαλεία του Git - Διαδραστική εργασία με το στάδιο καταχώρισης

Διαδραστική εργασία με το στάδιο καταχώρισης

Το Git έχει μερικά script που διευκολύνουν μερικές εργασίες στη γραμμή εντολών. Εδώ θα δούμε μερικές διαδραστικές εντολές που μπορούν να μας βοηθήσουν να κοψοράψουμε εύκολα τις υποβολές μας ώστε να περιλάβουμε μόνο ορισμένους συνδυασμούς και τμήματα αρχείων. Αυτά τα εργαλεία είναι πολύ χρήσιμα αν τροποποιήσουμε κάμποσα αρχεία και στη συνέχεια αποφασίσουμε ότι θέλουμε αυτές οι αλλαγές να είναι σε περισσότερες συνεκτικές υποβολές και όχι σε μια μεγάλη ακατάστατη υποβολή. Με αυτόν τον τρόπο μπορούμε να βεβαιωθούμε ότι οι υποβολές μας είναι λογικά διαχωρισμένες και μπορούν εύκολα να αναθεωρηθούν από τους προγραμματιστές που συνεργάζονται μαζί μας.

Αν εκτελέσουμε την git add με την επιλογή -i ή --interactive, το Git μεταβαίνει σε λειτουργία διαδραστικού κελύφους, εμφανίζοντας κάτι σαν αυτό:

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

Μπορούμε να δούμε ότι αυτή η εντολή μας δείχνει μια πολύ διαφορετική εικόνα του σταδίου καταχώρισής μας —βασικά δίνει τις ίδιες πληροφορίες που παίρνουμε με την git status αλλά λίγο πιο συνοπτικά και ενημερωτικά. Εμφανίζει τις αλλαγές που έχουμε προετοιμάσει για υποβολή στα αριστερά και τις υπόλοιπες στα δεξιά.

Μετά από αυτό έρχεται ένα τμήμα εντολών (Commands). Εδώ μπορούμε να κάνουμε πολλά πράγματα, όπως προσθήκη αρχείων στο στάδιο καταχώρισης, απόσυρση αρχείων από το στάδιο καταχώρισης, προσθήκη τμημάτων αρχείων στο στάδιο καταχώρισης, προσθήκη μη παρακολουθύμενων αρχείων και εμφάνιση diff αρχείων που βρίσκονται στο στάδιο καταχώρισης.

Προσθήκη σε και απόσυρση από το στάδιο καταχώρισης

Εάν πληκτρολογήσουμε 2 ή u στην ερώτηση What now>, το script μάς ρωτά ποια αρχεία που θέλουμε να προστεθούν στο στάδιο καταχώρισης:

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

Για να προσθέσουμε τα 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>>

Το * δίπλα σε κάθε αρχείο σημαίνει ότι το αρχείο έχει επιλεγεί για να προστεθεί στο στάδιο καταχώρισης. Εάν πατήσουμε το πλήκτρο Enter αφού πληκτρολογήσουμε κάτι στην προτροπή Update>>, το Git παίρνει ο,τιδήποτε έχει επιλεγεί και το προσθέτει στο στάδιο καταχώρισης:

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

Τώρα μπορούμε να δούμε ότι τα αρχεία TODO και index.html έχουν προστεθεί στο στάδιο καταχώρισης ενώ το αρχείο simplegit.rb εξακολουθεί να είναι εκτός του σταδίου καταχώρισης. Αν τώρα θέλουμε να αποσύρουμε το αρχείο TODO από το στάδιο καταχώρισης, χρησιμοποιήσουμε την επιλογή 3 ή r (συντομογραφία για revert):

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

Αν κοιτάξουμε πάλι την κατάσταση του Git, θα δούμε ότι το αρχείο TODO έχει αποσυρθεί από το στάδιο καταχώρισης:

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

Για να δούμε το diff των αρχείων που βρίσκονται στο στάδιο καταχώρισης, μπορούμε να χρησιμοποιήσουμε την εντολή 6 ή d (συντομογραφία για το diff). Μας παρουσιάζει τη λίστα με τα αρχεία του σταδίου καταχώρισης και μπορούμε να επιλέξουμε εκείνα των οποίων το diff θέλουμε να δούμε. Αυτό μοιάζει πολύ με την git diff --cached στη γραμμή εντολών:

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

Με αυτές τις στοιχειώδεις εντολές, μπορούμε να χρησιμοποιήσουμε τη διαδραστική λειτουργία για να αλληλεπιδράσουμε με το στάδιο καταχώρισης λίγο πιο εύκολα.

Προσθήκη επιθεμάτων στο στάδιο καταχώρισης

Είναι επίσης δυνατό να προσθέσουμε στο στάδιο καταχώρισης κάποια τμήματα αρχείων και όχι τα υπόλοιπα. Για παράδειγμα, αν κάνουμε δύο αλλαγές στο αρχείο simplegit.rb και θέλουμε να προσθέσουμε τη μία από αυτές αλλά όχι την άλλη, μπορούμε να το κάνουμε πολύ εύκολα. Στο διαδραστικό περιβάλλον πληκτρολογούμεε 5 ή p (συντομογραφία για patch). Το Git θα μας ρωτήσει ποια αρχεία θα θέλαμε να προσθέσουμε μερικώς στο στάδιο καταχώρισης· τότε για κάθε τμήμα των επιλεγμένων αρχείων, θα εμφανιστούν τα κομμάτια του diff του αρχείου και θα μας ρωτά αν θα θέλουμε να τα προσθέσουμε στο στάδιο καταχώρισης, ένα ένα:

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 είναι ενδιαφέρουσα. Σας δείχνει ότι μερικές γραμμές έχουν προστεθεί στο στάδιο καταχώρισης και κάποιες άλλες όχι. Έχουμε προσθέσει αυτό το αρχείο μερικώς στο στάδιο καταχώρισης. Σε αυτό το σημείο, μπορούμε να βγούμε από το διαδραστικό script και να εκτελέσουμε την git commit για να υποβάλουμε τα μερικά σταδιακά αρχεία.

Επίσης, δεν χρειάζεται να είμαστε στο διαδραστικό περιβάλλον για να πραγματοποιήσουμε τη μερική προσθήκη στο στάδιο καταχώρισης —μπορούμε να ξεκινήσουμε το ίδιο script χρησιμοποιώντας την git add -p ή git add --patch στη γραμμή εντολών.

Επιπλέον, μπορούμε να χρησιμοποιήσουμε τη λειτουργία patch για μερική επαναφορά των αρχείων με την εντολή reset --patch, για ενημέρωση (checkout) τμημάτων των αρχείων με την εντολή checkout --patch και για εναπόθεση (stashing) τμημάτων των αρχείων με την εντολή stash save --patch. Θα δούμε περισσότερες λεπτομέρειες για καθεμία από αυτές, όταν φτάσουμε σε πιο προηγμένες χρήσεις αυτών των εντολών.