Πλέον έχετε ένα αποθετήριο Git και μια ενημερωμένη έκδοση των αρχείων του έργου. Συνήθως, η διαδικασία που θα ακολουθείτε είναι να κάνετε μερικές αλλαγές στο έργο και να υποβάλλετε ένα στιγμιότυπα (snapshots) αυτών των αλλαγών στο αποθετήριο όποτε το έργο σας φτάνει σε μια κατάσταση που θέλετε να καταγράψετε.
Θυμηθείτε ότι κάθε αρχείο στον κατάλογο που εργάζεστε μπορεί να βρίσκεται σε δύο καταστάσεις: παρακολουθούμενο (tracked) ή μη-παρακολουθούμενο. Τα παρακολουθούμενα αρχεία είναι αυτά που βρίσκονταν στο τελευταίο στιγμιότυπο καθώς και αρχεία που μόλις έχουν τοποθετηθεί στην και μπορεί να είναι τροποποιημένα, ατροποποίητα ή ευρισκόμενα στον προθάλαμο (staged). Τα μη-παρακολουθούμενα αρχεία είναι όλα τα υπόλοιπα — τα αρχεία στον κατάλογο εργασίας που δεν βρίσκονταν στο τελευταίο στιγμιότυπο, και δεν βρίσκονται ούτε στον προθάλαμο. Όταν κλωνοποιείτε για πρώτη φορά ένα αποθετήριο, όλα τα αρχεία θα είναι παρακολουθούμενα και ατροποποίητα επειδή το Git μόλις τα έχει κάνει ανασύρει (check out) και δεν τα έχετε επεξεργαστεί ακόμα.
Καθώς επεξεργάζεστε τα αρχεία, το Git θα τα αναγνωρίζει ως τροποποιημένα, αφού θα έχουν αλλάξει από την τελευταία σας υποβολή (commit). Όσο εργάζεστε, τοποθετείτε επιλεκτικά κάποια τροποποιημένα αρχεία στον προθάλαμο, στη συνέχεια υποβάλλετε όλες τις αλλαγές των αρχείων στον προθάλαμο και επαναλαμβάνετε τη διαδικασία ξανά και ξανά.
Το βασικό εργαλείο που χρησιμοποιείτε για να προσδιορίσετε την τρέχουσα κατάσταση των αρχείων είναι η εντολή git status
.
Αν την εκτελέσετε αμέσως μόλις έχετε κλωνοποιήσει ένα αποθετήριο, θα δείτε στη γραμμή εντολών ένα μήνυμα παρόμοιο με το παρακάτω:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
Αυτό σημαίνει ότι έχετε ένα καθαρό κατάλογο εργασίας· με άλλα λόγια, κανένα από τα παρακολουθούμενα αρχεία σας δεν έχουν τροποποιηθεί.
Επίσης το Git δεν βλέπει κανένα μη-παρακολουθούμενο αρχείο, αλλιώς θα τα το Git θα τα παρέθετε στο παραπάνω μήνυμα.
Τέλος, η εντολή αυτή σας ενημερώνει σε ποιον κλάδο βρίσκεστε καθώς και ότι δεν έχει αποκλίνει από τον αντίστοιχο κλάδο που βρίσκεται στον διακομιστή.
Προς το παρόν ο κλάδος αυτός είναι ο master
, που είναι και ο προεπιλεγμένος.
Η ενότητα ch03-git-branching.asc θα εξετάσει πιο αναλυτικά τους κλάδους και τις αναφορές.
Note
|
Το GitHub άλλαξε το προεπιλεγμένο όνομα κλάδου από Πάντως, το ίδιο το Git χρησιμοποιεί το όνομα |
Ας υποθέσουμε ότι έχετε προσθέσει ένα νέο αρχείο στο έργο σας, ένα απλό αρχείο README
.
Αν το αρχείο αυτό δεν προϋπήρχε και εκτελέσετε την εντολή git status
, θα δείτε το μη-παρακολουθούμενο αρχείο σας ως εξής:
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
Καταλαβαίνετε ότι το αρχείο README
είναι μη-παρακολουθούμενο διότι βρίσκεται κάτω από τον τίτλο “Untracked files”.
Μη-παρακολουθούμενο ουσιαστικά σημαίνει ότι το Git βλέπει ένα αρχείο το οποίο δεν υπήρχε στο προηγούμενο στιγμιότυπο (υποβολή, commit) και που δεν έχει τοποθετηθεί ακόμα στον προθάλαμο·
Το Git δεν θα συμπεριλάβει το αρχείο αυτό στα επόμενα στιγμιότυπα που θα υποβάλλετε, αν δεν το ζητήσετε ρητά.
Αυτό γίνεται ώστε να μην συμπεριλάβετε κατά λάθος στο έργο σας αρχεία τα οποία δεν θέλατε να συμπεριλάβετε, για παράδειγμα εκτελέσιμα αρχεία.
Σε αυτή την περίπτωση, θέλετε να συμπεριλάβετε το αρχείο README
στο έργο σας, οπότε ας ξεκινήσουμε να παρακολουθείτε το αρχείο .
Για να αρχίσετε να παρακολουθείτε ένα καινούριο αρχείο, χρησιμοποιείτε την εντολή git add
.
Για να αρχίσετε να παρακολουθείτε το αρχείο READΜE
, γράψτε:
$ git add README
Αν τώρα εκτελέσετε την εντολή για να δείτε την τρέχουσα κατάσταση, θα δείτε ότι το αρχείο README
πλέον παρακολουθείται και έχει τοποθετηθεί στον προθάλαμο ώστε να είναι έτοιμο να υποβληθεί:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Καταλαβαίνετε ότι το αρχείο αυτό πλέον έχει τοποθετηθεί στον προθάλαμο διότι βρίσκεται κάτω από τον τίτλο Changes to be committed
.
Αν σε αυτό το σημείο υποβάλετε τα αρχεία σας, η έκδοση του αρχείου README
που θα αποθηκευτεί στο στιγμιότυπο θα είναι αυτή που υπήρχε όταν εκτελέσατε την εντολή git add
.
Ίσως θυμάστε ότι προηγουμένως κάνατε κάτι αντίστοιχο, εκτελέσατε την εντολή git init
ακολουθούμενη από git add <files>
— αυτό το κάνατε για να αρχίσετε να παρακολουθείτε τα αρχεία του καταλόγου.
Η εντολή git add
μπορεί να ακολουθείται είτε από ένα αρχείο είτε από έναν κατάλογο.
Αν ακολουθείται από κατάλογο τότε η εντολή θα καταχωρήσει όλα τα αρχεία του συγκεκριμένου καταλόγου.
Ας αλλάξουμε ένα αρχείο που βρίσκεται ήδη υπό παρακολούθηση.
Αν αλλάξετε το ήδη παρακολουθούμενο αρχείο CONTRIBUTING.md
και εκτελέσετε την εντολή git status
ξανά, θα δείτε κάτι σαν το εξής:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Το αρχείο CONTRIBUTING.md
βρίσκεται κάτω από την κατηγορία Changed but not staged for commit
, που σημαίνει ότι ένα αρχείο υπό παρακολούθηση έχει τροποποιηθεί στον κατάλογο εργασίας, αλλά δεν έχει τοποθετηθεί ακόμα στον προθάλαμο.
Για να το τοποθετήσετε στον προθάλαμο θα πρέπει να εκτελέσετε την εντολή git add
.
Η εντολή git add
έχει πολλές λειτουργίες· τη χρησιμοποιείτε για να ξεκινήσετε την παρακολούθηση καινούριων αρχείων, για να τοποθετήσετε αρχεία στον προθάλαμο αλλά και για άλλες λειτουργίες όπως το να επισημάνετε αρχεία που προέρχονται από συγκρούσεις συγχώνευσης (merge conflicts) ως επιλυμένα.
Μπορείτε να σκεφτείτε την εντολή ως “πρόσθεσε αυτό το περιεχόμενο στην επόμενη υποβολή” αντί για “πρόσθεσε αυτό το αρχείο στο έργο”.
Ας εκτελέσουμε την εντολή git add
, ώστε να καταχωρήσετε το αρχείο CONTRIBUTING.md
και έπειτα ας τρέξουμε την εντολή git status
ξανά:
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Και τα δύο αρχεία πλέον βρίσκονται στον προθάλαμα και θα συμπεριληφθούν στην επόμενη υποβολή στιγμιοτύπου.
Ας υποθέσουμε τώρα ότι θυμηθήκατε άλλη μία μικρή αλλαγή που θέλετε να κάνετε στο αρχείο CONTRIBUTING.md
πριν το υποβάλλετε.
Το ανοίγετε ξανά, κάνετε την αλλαγή που θέλετε και είστε έτοιμοι για την υποβολή.
Παρόλα αυτά ας εκτελέσουμε git status
για άλλη μια φορά:
$ vim CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Τι στην ευχή συμβαίνει;
Το αρχείο CONTRIBUTING.md
εμφανίζεται και ως αρχείο τοποθετημένο στον προθάλαμο, αλλά και ως αρχείο που δεν έχει τοποθετηθεί στον προθάλαμο.
Πώς είναι αυτό δυνατόν;
Αυτό που συμβαίνει είναι ότι το Git τοποθετεί στον προθάλαμο ένα αρχείο ακριβώς όπως είναι τη στιγμή που εκτελείτε την εντολή git add
.
Αν υποβάλλετε το στιγμιότυπο τώρα, η έκδοση του αρχείου CONTRIBUTING.md
που θα συμπεριληφθεί στην υποβολή είναι αυτή που υπήρχε όταν εκτελέσατε την εντολή git add
(και όχι η τωρινή έκδοση του αρχείου).
Γενικά, αν τροποποιήσετε ένα αρχείο αφότου έχετε εκτελέσει την εντολή git add
, θα πρέπει να εκτελέσετε git add
ξανά, αν θέλετε να τοποθετήσετε την τελευταία εκδοχή του αρχείου στον προθάλαμο:
$ git add CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
Αν και η εντολή git status
δίνει αρκετά ολοκληρωμένες πληροφορίες, οι πληροφορίες αυτές είναι λίγο φλύαρες.
Το Git διαθέτει μια σημαία για πιο συνοπτική περιγραφή της κατάστασης των αλλαγών.
Αν εκτελέσετε git status -s
ή git status --short
θα έχετε ένα πιο απλοποιημένο αποτέλεσμα.
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
Τα καινούργια αρχεία που δεν παρακολουθούνται ακόμα ακολουθούν ένα ??
, τα καινούρια αρχεία που έχουν καταχωρηθεί με A
, τα τροποποιημένα αρχεία με M
κ.ο.κ.
Το αποτέλεσμα της εντολής περιλαμβάνει δύο στήλες για το κάθε αρχείο.
Η αριστερή στήλη περιγράφει την κατάσταση του αρχείου στον προθάλαμο και η δεξιά στήλη την κατάστασή του στο δέντρο εργασίας. ότι το αρχείο έχει καταχωρηθεί και το δεξί ότι έχει τροποποιηθεί.
Στο παραπάνω παράδειγμα, το αρχείο README
έχει τροποποιηθεί στον κατάλογο εργασίας, αλλά δεν έχει ακόμα τοποθετηθεί στον προθάλαμο, ενώ το αρχείο lib/simplegit.rb
είναι και τροποποιημένο και έχει τοποθετηθεί στον προθάλαμο.
Το αρχείο Rakefile
από την άλλη έχει τροποποιηθεί, τοποθετηθεί στον προθάλαμο και στη συνέχεια τροποποιήθηκε ξανά, που σημαίνει ότι υπάρχουν κάποιες αλλαγές που έχουν τοποθετηθεί στον προθάλαμο και άλλες που δεν έχουν τοποθετηθεί στον προθάλαμο.
Συμβαίνει συχνά, να υπάρχει μια κατηγορία αρχείων που δεν θέλετε να τα προσθέτετε στον προθάλαμο, ούτε καν να φαίνονται ως μη-παρακολουθούμενα.
Αυτά είναι συνήθως αρχεία που δημιουργούνται αυτόματα όπως αρχεία .log ή αρχεία που δημιουργούνται κατά τη μεταγλώττιση.
Σε αυτές τις περιπτώσεις μπορείτε να δημιουργήσετε ένα αρχείο με όνομα .gitignore
, στο οποίο να καταγράψετε τα μοτίβα των ονομάτων αυτών των αρχείων.
Να ένα παράδειγμα αρχείου .gitignore
:
$ cat .gitignore
*.[oa]
*~
Η πρώτη γραμμή λέει στο Git να αγνοεί όλα τα αρχεία που τελειώνουν σε .o
ή .a
— αρχεία που είναι συνήθως αποτέλεσμα της μεταγλώττισης τους κώδικά σας.
Η δεύτερη γραμμή λέει στο Git να αγνοεί όλα τα αρχεία που τελειώνουν με τον χαρακτήρα ~
, το οποίο χρησιμοποιείται από πολλούς επεξεργαστές κειμένου, όπως ο Emacs, για να δηλώσει τα προσωρινά αρχεία.
Μπορείτε επίσης να συμπεριλάβετε καταλόγους που περιλαμβάνουν αρχεία καταγραφής, προσωρινούς καταλόγους κ.ο.κ.
Γενικά είναι καλή ιδέα να ρυθμίσετε το αρχείο .gitignore
νωρίς ώστε να μην υποβάλλετε κατά λάθος αρχεία που δεν θέλετε να βρίσκονται στο αποθετήριό σας.
Οι κανόνες για τα μοτίβα που μπορείτε να δηλώσετε στο αρχείο .gitignore
είναι οι εξής:
-
Οι κενές γραμμές ή οι γραμμές που ξεκινούν με
#
αγνοούνται. -
Μπορείτε να χρησιμοποιήσετε τα κλασικά μοτίβα για ονόματα αρχείων (glob patterns) και αυτά εφαρμόζονται αναδρομικά.
-
Μπορείτε να ξεκινήσετε τα μοτίβα σας με slash (
/
) ώστε να αποφύγετε την αναδρομικότητα -
Μπορείτε να τελειώσετε τα μοτίβα σας με slash (
/
) ώστε να ορίσετε έναν κατάλογο. -
Μπορείτε να αντιστρέψετε ένα μοτίβο χρησιμοποιώντας ένα θαυμαστικό (
!
) στην αρχή του.
Τα μοτίβα αυτά μοιάζουν με απλοποιημένες κανονικές εκφράσεις (regular expressions), σαν αυτές που χρησιμοποιούν τα λειτουργικά συστήματα.
Ένας αστερίσκος () αντιστοιχεί σε μηδέν ή περισσότερους χαρακτήρες· το
[abc]
αντιστοιχεί σε οποιονδήποτε χαρακτήρα βρίσκεται μέσα στις αγκύλες (σε αυτή την περίπτωση a
, b
και c
· το σύμβολο του αγγλικού ερωτηματικού (?
) αντιστοιχεί σε έναν και μόνο χαρακτήρα· και οι αγκύλες που περιέχουν χαρακτήρες που διαχωρίζονται με παύλα ([0-9]
) αντιστοιχίζονται σε όλους τους χαρακτήρες που υπάρχουν μεταξύ τους (σε αυτή την περίπτωση, όλους τους αριθμούς από το 0 μέχρι το 9).
Μπορείτε επίσης να χρησιμοποιήσετε δύο αστερίσκους για να αντιστοιχίσετε εμφωλευμένους καταλόγους· η έκφραση a/
*/z
αντιστοιχεί στους καταλόγους a/z
, a/b/z
, a/b/c/z
κ.ο.κ.
Ορίστε άλλο ένα παράδειγμα ενός αρχείου .gitignore
:
# αγνόησε όλα τα αρχεία .a
*.a
# αλλά να παρακολουθείς το lib.a, παρά το ότι αγνοείς τα αρχεία .a
!lib.a
# αγνόησε μόνο το αρχείο TODO στον τρέχοντα κατάλογο, όχι το subdir/TODO
/TODO
# αγνόησε όλα τα αρχεία σε οποιονδήποτε κατάλογο με όνομα build
build/
# αγνόησε το doc/notes.txt, αλλά όχι το doc/server/arch.txt
doc/*.txt
# αγνόησε όλα τα αρχεία .pdf στον φάκελο doc/ και όλους τους υποφακέλους του
doc/**/*.pdf
Tip
|
Αν θέλετε κάποια παραδείγματα για να ξεκινήσετε, το GitHub διατηρεί μια λίστα με παραδείγματαα αρχείων |
Note
|
Στην απλούστερη περίπτωση, ένα αποθετήριο έχει μόνο ένα αρχείο Περισσότερες λεπτομέρειες σχετικά με πολλαπλά αρχεία |
Αν η εντολή git status
είναι πολύ αόριστη για σας και θέλετε να δείτε ακριβώς τι έχετε αλλάξει (και όχι μόνο ποια αρχεία έχουν αλλάξει), μπορείτε να χρησιμοποιήσετε την εντολή git diff
.
Θα καλύψουμε την εντολή αυτή πιο αναλυτικά αργότερα, αλλά το πιθανότερο είναι ότι θα τη χρησιμοποιείτε πιο συχνά για να απαντήσετε αυτές τις δύο ερωτήσεις:
Τι έχετε αλλάξει και δεν έχετε ακόμα τοποθετήσει στον προθάλαμο;
Και τι έχετε τοποθετήσει στον προθάλαμο και είναι έτοιμο να υποβληθεί;
Ενώ η εντολή git status
απαντά σε αυτές τις ερωτήσεις πολύ γενικά, απαριθμώντας τα ονόματα των αρχείων, η εντολή git diff
θα σας δείξει ακριβώς ποιες γραμμές προστέθηκαν ή αφαιρέθηκαν — με άλλα λόγια το επίθεμα (patch).
Έστω λοιπόν ότι έχετε επεξεργαστεί και τοποθετήσει στον προθάλαμο το αρχείο README
ξανά και μετά επεξεργάζεστε το αρχείο CONTRIBUTING.md
χωρίς να το τοποθετήσετε στον προθάλαμο.
Αν τώρα εκτελέσετε την εντολή git status
, θα δείτε κάτι τέτοιο:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Για να δείτε τι έχετε αλλάξει, αλλά δεν έχετε ακόμα τοποθετήσει στον προθάλαμο, πληκτρολογήστε git diff
χωρίς άλλα ορίσματα:
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
Η εντολή αυτή συγκρίνει τον κατάλογο εργασίας σας με ό,τι υπάρχει στον προθάλαμο. Σας λέει τις αλλαγές που έχετε κάνει, αλλά δεν έχετε ακόμα τοποθετήσει στον προθάλαμο.
Αν θέλετε να δείτε τι έχετε τοποθετήσει στον προθάλαμο, που θα είναι και μέρος της επόμενης υποβολής, μπορείτε να χρησιμοποιήσετε την εντολή git diff --staged
.
Η εντολή αυτή συγκρίνει τις αλλαγές που βρίσκονται στον προθάλαμο με την τελευταία υποβολή:
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project
Είναι σημαντικό να θυμάστε ότι η εντολή git diff
από μόνη της δεν σας εμφανίζει όλες τις αλλαγές που έγιναν σε σχέση με την τελευταία υποβολή, αλλά μόνο τις αλλαγές που δεν έχουν ακόμα τοποθετηθεί στον προθάλαμο.
Αν έχετε τοποθετήσει όλες τις αλλαγές σας στον προθάλαμο, η εντολή git diff
δεν θα επιστρέψει τίποτα.
Ας δείτε άλλο ένα παράδειγμα.
Έστω ότι έχετε τοποθετήσει το αρχείο CONTRIBUTING.md
στον προθάλαμο και έπειτα το έχετε τροποποιήσει.
Τότε μπορείτε να χρησιμοποιήσετε την εντολή git diff
για να δείτε ποιες ακριβώς αλλαγές του αρχείου έχουν τοποθετηθεί στον προθάλαμο και ποιες όχι.
Ας υποθέσουμε ότι το περιβάλλον εργασίας σας είναι κάπως έτσι:
$ git add CONTRIBUTING.md
$ echo '# test line' >> CONTRIBUTING.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: CONTRIBUTING.md
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
Τότε μπορείτε να χρησιμοποιήσετε την εντολή git diff
για να δείτε τι δεν έχει τοποθετηθεί ακόμα στον προθάλαμο
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 643e24f..87f08c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -119,3 +119,4 @@ at the
## Starter Projects
See our [projects list](https://github.com/libgit2/libgit2/blob/development/PROJECTS.md).
+# test line
καθώς και την εντολή git diff --cached
για να δείτε τι έχετε τοποθετήσει στον προθάλαμο μέχρι στιγμής (τα --staged
και --cached
είναι συνώνυμα):
$ git diff --cached
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
Note
|
Χρήση της
git diff από εξωτερικό πρόγραμμαΘα συνεχίσουμε να χρησιμοποιούμε την εντολή |
Τώρα που ο προθάλαμός σας περιέχει τις αλλαγές που θέλετε, είστε έτοιμοι να τις υποβάλλετε (commit).
Θυμηθείτε ότι όλα τα μη καταχωρημένα αρχεία, δηλαδή όσα αρχεία έχετε δημιουργήσει ή τροποποιήσει και για τα οποία δεν εκτελέσατε την εντολή git add
, δεν θα συμπεριληφθούν σε αυτή την υποβολή και θα παραμείνουν ως τροποποιημένα αρχεία στον δίσκο σας.
Σε αυτή την περίπτωση, έστω ότι την τελευταία φορά που εκτελέσατε την εντολή git status
, είδατε ότι τα πάντα είχαν τοποθετηθεί στον προθάλαμο και συνεπώς είστε έτοιμοι να υποβάλλετε τις αλλαγές σας.
Ο απλούστερος τρόπος για να υποβάλλετε αλλαγές είναι να πληκτρολογήσετε git commit
:
$ git commit
Όταν το κάνετε, θα εκκινήσετε τον προεπιλεγμένο επεξεργαστή κειμένου σας.
Αυτός είναι καθορισμένος από τη μεταβλητή περιβάλλοντος (environment variable) της γραμμής εντολών, $EDITOR
, και συνήθως είναι ο vim ή ο emacs, αλλά μπορείτε να χρησιμοποιήσετε την εντολή git config --global core.editor
ώστε να χρησιμοποιήσετε τον επεξεργαστή κειμένου της αρεσκείας σας, όπως είδατε στο ch01-introduction.asc.
Ο επεξεργαστής κειμένου σας θα εμφανίσει το παρακάτω κείμενο (αυτό το παράδειγμα είναι οθόνη του Vim):
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
#
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
Βλέπετε ότι το προεπιλεγμένο μήνυμα υποβολής περιέχει το τελευταίο αποτέλεσμα της εντολής git status
μέσα σε σχόλια και μια κενή γραμμή στην αρχή.
Μπορείτε να αφαιρέσετε τα σχόλια αυτά και να γράψετε το δικό σας μήνυμα υποβολής ή να τα αφήσετε ως έχουν ώστε να σας βοηθήσουν αργότερα να θυμηθείτε ποια αρχεία υποβάλλετε.
Note
|
Για να έχετε μια ακόμα πιο ρητή υπενθύμιση των αλλαγών που έχετε κάνει, μπορείτε να χρησιμοποιήσετε την επιλογή |
Αφού κλείσετε τον επεξεργαστή κειμένου, το Git θα δημιουργήσει την υποβολή σας με το παραπάνω μήνυμα (τα σχόλια θα αφαιρεθούν).
Εναλλακτικά, μπορείτε να γράψετε το μήνυμα υποβολής σας μαζί με την εντολή commit
, μετά τη σημαία -m
ως εξής:
$ git commit -m "Story 182: fix benchmarks for speed"
[master 463dc4f] Story 182: fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
Μόλις κάνατε την πρώτη σας υποβολή!
Βλέπετε ότι η υποβολή αυτή σας έχει δώσει κάποιες πληροφορίες: τον κλάδο στον οποίο υποβάλλατε τις αλλαγές σας (master
), το άθροισμα ελέγχου SHA-1 (SHA-1 checksum) της υποβολής (463dc4f
), πόσα αρχεία τροποποιήθηκαν, καθώς και στατιστικά για το πόσες γραμμές προστέθηκαν και αφαιρέθηκαν σε αυτή την υποβολή.
Θυμηθείτε ότι η υποβολή αλλαγών καταγράφει το στιγμιότυπο το οποίο είχατε εκείνη τη στιγμή στον προθάλαμο. Οτιδήποτε δεν είχατε τοποθετήσει στον προθάλαμο, παραμένει εκεί τροποποιημένο και μπορείτε να το υποβάλλετε αργότερα με άλλο ένα commit. Κάθε φορά που πραγματοποιείτε μια υποβολή, καταγράφετε ένα στιγμιότυπο του έργου σας, στο οποίο μπορείτε να επανέλθετε αργότερα ή να το συγκρίνετε με κάποιο μελλοντικό στιγμιότυπο του έργου σας.
Παρόλο που ο προθάλαμος είναι πολύ χρήσιμος για να κόβετε και ράβετε τις υποβολές σας όπως ακριβώς θέλετε, ενίοτε είναι πιο περίπλοκος από όσο χρειάζεστε να είναι στην εργασία σας.
Αν θέλετε να παραλείψετε τον προθάλαμο, το Git παρέχει μια απλή συντόμευση.
Αν προσθέσετε την επιλογή -a
στην εντολή git commit
αναγκάζετε το Git να τοποθετεί αυτόματα όλα τα αρχεία υπό παρακολούθηση πριν κάνει το commit, επιτρέποντάς σας έτσι να παραλείψετε την εντολή git add
:
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
no changes added to commit (use "git add" and/or "git commit -a")
$ git commit -a -m 'Add new benchmarks'
[master 83e38c7] Add new benchmarks
1 file changed, 5 insertions(+), 0 deletions(-)
Παρατηρείτε ότι στην περίπτωση αυτή, δεν έχετε εκτελέσει την εντολή git add
για το αρχείο CONTRIBUTING.md
πριν υποβάλετε το στιγμιότυπό σας επειδή η σημαία -a
περιλαμβάνει όλα τα αρχεία που έχουν τροποποιηθεί.
Αυτό είναι βολικό, αλλά χρειάζεται προσοχή· με αυτή η σημαία μπορεί μερικές φορές να συμπεριλάβτε αλλαγές που δεν θέλατε να υποβάλετε.
Για να διαγράψετε ένα αρχείο από το Git, θα πρέπει να το διαγράψετε από τη λίστα των παρακολουθούμενων αρχείων (ή πιο σωστά, να το διαγράψετε από τον προθάλαμο) και έπειτα να υποβάλλετε το στιγμιότυπο.
Αυτό γίνεται με την εντολή git rm
, η οποία επίσης θα διαγράψει το αρχείο από τον κατάλογο εργασίας σας, ώστε να μην εμφανίζεται ως μη-παρακολουθούμενο αρχείο.
Αν απλά διαγράψετε το αρχείο από τον κατάλογο εργασίας σας, θα εμφανίζεται κάτω από την κατηγορία Changed but not updated
(unstaged, που ουσιαστικά σημαίνει ότι δεν έχει τοποθετηθεί στον προθάλαμο) του αποτελέσματος της εντολής git status
:
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
Αν στη συνέχεια εκτελέσετε την εντολή git rm
, η αλλαγή αυτή, δηλαδή η διαγραφή του αρχείου, θα τοποθετηθεί στον προθάλαμο:
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: PROJECTS.md
Την επόμενη φορά που θα κάνετε commit, το αρχείο θα έχει διαγραφεί και δεν θα βρίσκεται υπό παρακολούθηση.
Αν είχατε τροποποιήσει το αρχείο ή το είχατε ήδη τοποθετήσει στον προθάλαμο, θα πρέπει να εξαναγκάσετε τη διαγραφή του με την επιλογή -f
.
Πρόκειται για μια λειτουργικότητα ασφαλείας του Git, προκειμένου να αποτρέψει αφαίρεση δεδομένων από σφάλμα που δεν έχουν ακόμα καταγραφεί σε κάποιο στιγμιότυπο και δεν μπορούν να ανακτηθούν από το Git.
Κάτι άλλο που μπορεί να θέλετε να κάνετε, είναι να κρατήσετε το αρχείο στον κατάλογο εργασίας σας, αλλά να το αφαιρέσετε από τον προθάλαμο.
Με άλλα λόγια, ίσως θέλετε να κρατήσετε το αρχείο στον σκληρό σας δίσκο, αλλά να μην βρίσκεται πλέον υπό παρακολούθηση από το Git.
Αυτό είναι ιδιαίτερα χρήσιμο αν είχατε ξεχάσει να προσθέσετε κάτι στο αρχείο .gitignore
και το τοποθετήσατε στον προθάλαμο κατά λάθος, όπως για παράδειγμα μεγάλα αρχεία .log
ή αρχεία .a
poy προέκυψαν από μεταγλώττιση.
Για να το κάνετε αυτό, χρησιμοποιείτε την επιλογή --cached
:
$ git rm --cached README
Μπορείτε να χρησιμοποιήσετε την παραπάνω εντολή με αρχεία, καταλόγους και μοτίβα glob αρχείων. Αυτό σημαίνει ότι μπορείτε να εκτελέσετε εντολές όπως:
$ git rm log/\*.log
Παρατηρήστε το backslash (\
) μπροστά από τον αστερίσκο, *
.
Είναι απαραίτητο, επειδή το Git χρησιμοποιεί κι αυτό ανάπτυξη των ονομάτων των αρχείων (file name expansion), επιπρόσθετα με την ανάπτυξη των ονομάτων των αρχείων του κελύφους.
Η παραπάνω εντολή αφαιρεί όλα τα αρχεία που έχουν την κατάληξη .log
στον κατάλογο log/
.
Επίσης, θα μπορούσατε να κάνετε κάτι τέτοιο:
$ git rm \*~
Η εντολή αυτή αφαιρεί όλα τα αρχεία που τελειώνουν με τον χαρακτήρα ~
.
Σε αντίθεση με άλλα συστήματα ελέγχου έκδοσης, το Git δεν παρακολουθεί τις μετακινήσεις αρχείων από μόνο του. Αν μετονομάσετε ένα αρχείο στο Git, δεν αποθηκεύεται καμιά μεταπληροφορία που να ενημερώνει το Git ότι μετονομάσατε το αρχείο. Παρόλα αυτά, το Git είναι αρκετά έξυπνο ώστε να καταλάβει κάτι τέτοιο — θα ασχοληθείτε λίγο αργότερα με την ανίχνευση μετακίνησης αρχείων.
Κατ' αυτή την έννοια, το γεγονός ότι το Git έχει εντολή mv
μπορεί να δημιουργήσει σύγχυση.
Αν θέλετε να μετονομάσετε ένα αρχείο στο Git, μπορείτε να το κάνετε κάπως έτσι
$ git mv file_from file_to
το οποίο θα λειτουργήσει τέλεια. Στην πραγματικότητα, αν εκτελέσετε κάτι τέτοιο και έπειτα κοιτάξετε το status του αποθετηρίου, θα δείτε ότι το Git το θεωρεί μετονομασμένο αρχείο:
$ git mv README.md README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
----
Η εντολή αυτή όμως, είναι ισοδύναμη με το να εκτελέσετε το εξής:
[source,console]
$ mv README.md README $ git rm README.md $ git add README
Το Git καταλαβαίνει ότι ουσιαστικά πρόκειται για μετονομασία, οπότε δεν έχει σημασία αν μετονομάσετε ένα αρχείο με αυτό τον τρόπο ή με την εντολή `mv`. Η μόνη πραγματική διαφορά είναι ότι η εντολή `mv` είναι μία εντολή αντί για τρεις, άρα πιο βολική. Και το πιο σημαντικό, μπορείτε να χρησιμοποιήσετε όποιο εργαλείο θέλετε για να μετονομάσετε ένα αρχείο και να λύσετε το πρόβλημα της προσθήκης/διαγραφής, `add`/`rm`, του αρχείου αργότερα, πριν την υποβολή.