Git
Chapters ▾ 2nd Edition

1.7 Ξεκινώντας με το Git - Χρησιμοποιώντας τη βοήθεια

Χρησιμοποιώντας τη βοήθεια

Αν ποτέ χρειαστούμε βοήθεια για το Git ενώ το χρησιμοποιούμε, μπορούμε να ανοίξουμε το εγχειρίδιο για οποιαδήποτε εντολή του Git (manpage) με τρεις διαφορετικούς τρόπους:

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

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

$ git help config

Οι εντολές αυτές είναι πολύ χρήσιμες καθώς μπορούμε τις χρησιμοποιήσουμε ακόμα και αν είστε εκτός δικτύου. Αν το εγχειρίδιο και αυτό το βιβλίο δεν είναι αρκετά και χρειάζεστε πιο άμεση βοήθεια, μπορούμε να δοκιμάσουμε τα κανάλια #git και #github στον διακομιστή IRC Freenode (irc.freenode.net). Στα κανάλια αυτά θα βρούμε εκατοντάδες άτομα που γνωρίζουν πολύ καλά το Git και είναι πολύ πρόθυμοι να βοηθήσουν.

Επιπλέον, αν δεν χρειάζεστε την εκτεταμένη βοήθεια του manpage αλλά ένα γρήγορο φρεσκάρισμα των διαθέσιμων επιλογών για μία εντολή του Git, μπορούμε να ρωτήσουμε την πιο συνοπτική βοήθεια με τις επιλογές -h ή --help, όπως για παράδειγμα:

$ git add -h
usage: git add [<options>] [--] <pathspec>...

    -n, --dry-run         dry run
    -v, --verbose         be verbose

    -i, --interactive     interactive picking
    -p, --patch           select hunks interactively
    -e, --edit            edit current diff and apply
    -f, --force           allow adding otherwise ignored files
    -u, --update          update tracked files
    -N, --intent-to-add   record only the fact that the path will be added later
    -A, --all             add changes from all tracked and untracked files
    --ignore-removal      ignore paths removed in the working tree (same as --no-all)
    --refresh             don't add, only refresh the index
    --ignore-errors       just skip files which cannot be added because of errors
    --ignore-missing      check if - even missing - files are ignored in dry run
    --chmod <(+/-)x>      override the executable bit of the listed files----



=== Ανακεφαλαίωση

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



[[_git_basics_chapter]]
== Τα θεμελιώδη στοιχεία του Git

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

[[_getting_a_repo]]
=== Αποκτώντας ένα αποθετήριο Git

Μπορούμε να δημιουργήσουμε ένα έργο στο Git χρησιμοποιώντας δύο βασικές προσεγγίσεις.
Η πρώτη παίρνει ένα υπάρχον έργο ή κατάλογο και το εισάγει στο Git.
Η δεύτερη κλωνοποιεί ένα υπάρχον αποθετήριο Git από έναν άλλο διακομιστή.

==== Αρχικοποιώντας ένα Αποθετήριο σε έναν Υπάρχοντα Κατάλογο

Αν θέλουμε να ξεκινήσουμε τον εντοπισμό ένα υπάρχοντος έργου στο Git, θα χρειαστεί να πάμε στον κατάλογο του έργου μας και να πληκτρολογήσουμε

[source,console]

$ git init

Η εντολή αυτή δημιουργεί έναν νέο υπο-κατάλογο με το όνομα `.git` ο οποίος περιέχει όλα τα απαραίτητα αρχεία για το αποθετήριο. Ουσιαστικό ο υπο-κατάλογος αυτός αποτελεί ένα σκελετό για το αποθετήριό μας.
Στο σημείο αυτό, τίποτα δεν έχει εντοπιστεί ακόμα από το έργο μας.
(Βλ. <<_git_internals>> για περισσότερες πληροφορίες σχετικά με το τι ακριβώς αρχεία περιέχονται στον κατάλογο `.git` που μόλις δημιουργήσαμε.)(((εντολές git, init)))

Αν θέλουμε να ξεκινήσουμε τον έλεγχο έκδοσης στα υπάρχοντα αρχεία, θα πρέπει να ξεκινήσουμε τον εντοπισμό στα αρχεία αυτά και να κάνουμε μια πρώτη υποβολή τους.
Για να το επιτύχουμε αυτό θα χρειαστούμε μερικές εντολές `git add` οι οποίες προσδιορίζουν τα αρχεία που θέλουμε να εντοπίσουμε και μια εντολή `git commit`:

[source,console]

$ git add *.c $ git add LICENSE $ git commit -m initial project version

θα εξετάσουμε σε λίγο τι κάνουν οι παραπάνω εντολές.
Στο σημείο αυτό, έχουμε ένα αποθετήριο Git με κάποια εντοπισμένα αρχεία και μια αρχική υποβολή.

[[_git_cloning]]
==== Κλωνοποιώντας ένα Υπάρχον Αποθετήριο

Αν θέλουμε να αποκτήσουμε ένα αντίγραφο ενός υπάρχοντος αποθετηρίου Git --για παράδειγμα, ένα έργο στο οποίο θα θέλαμε να συνεισφέρουμε-- η εντολή που χρειαζόμαστε είναι `git clone`.
Αν είμαστε εξεικοιωμένοι με άλλα συστήματα ελέγχου έκδοσης όπως το Subversion, θα παρατηρήσουμε ότι η εντολή είναι "clone" και όχι "checkout".
Αυτή είναι μια σημαντική διάκριση· το Git παίρνει ένα πλήρες αντίγραφο σχεδόν όλων των δεδομένων που έχει ο διακομιστής αντί για ένα απλό αντίγραφο.
Με την εντολή `git clone` όλες οι εκδόσεις του κάθε αρχείου του έργου αποθηκεύονται τοπικά.
Στην πραγματικότητα, αν ο δίσκος του διακομιστή μας αλλοιωθεί, μπορούμε να χρησιμοποιήσουμε οποιονδήποτε από τους κλώνους του ώστε να θέσουμε τον διακομιστή στην κατάσταση που ήταν όταν κλωνοποιήθηκε.

Για να κλωνοποιήσουμε ένα αποθετήριο, εκτελούμε την εντολή `git clone [url]`.(((εντολές git, clone)))
Για παράδειγμα, αν θέλουμε την κλωνοποιήσουμε τη βιβλιοθήκη libgit2 του Git, θα πρέπει να εκτελέσουμε:

[source,console]
Η εντολή αυτή δημιουργεί έναν κατάλογο με το όνομα ``libgit2'', αρχικοποιεί έναν κατάλογο `.git` μέσα σε αυτόν, κατεβάζει όλα τα δεδομένα για αυτό το αποθετήριο καθώς και ένα αντίγραφο από την τελευταία έκδοση.
Αν περιηγηθούμε στον καινούριο κατάλογο `libgit2`, θα δούμε τα αρχεία του έργου μέσα σε αυτόν, έτοιμα για να χρησιμοποιηθούν.
Αν θέλουμε να κλωνοποιήσουμε το αποθετήριο σε έναν κατάλογο με διαφορετικό όνομα, μπορούμε να το ορίσουμε με την παρακάτω εναλλακτική της εντολής:

[source,console]

$ git clone https://github.com/libgit2/libgit2 mylibgit

Η εντολή αυτή έχει το ίδιο αποτέλεσμα με την προηγούμενη, αλλά ο κατάλογος που θα δημιουργηθεί ονομάζεται `mylibgit`.

Το Git έχει διάφορα πρωτόκολλα μεταφοράς που μπορούμε να χρησιμοποιήσουμε.
Το προηγούμενο παράδειγμα χρησιμοποεί το πρωτόκολλο `https://`, ενδέχεται επίσης να δούμε το `git://` ή το `user@server:path/to/repo.git` το οποίο χρησιμοποιεί το πρωτόκολλο μεταφοράς SSH.
Στο κεφάλαιο <<_git_on_the_server>> θα μας παρουσιαστούν όλες οι διαθέσιμες εναλλακτικές που μπορεί να χρησιμοποιήσει ο διακομιστής ώστε να αποκτήσει πρόσβαση στο αποθετήριο Git μας, καθώς και τα πλεονεκτήματα και μειονεκτήματα της κάθε εναλλακτικής.


=== Καταχωρώντας αλλαγές στο αποθετήριο

Έχουμε λοιπόν ένα ολοκαίνουριο αποθετήριο Git και μια ενημερωμένη έκδοση των αρχείων του έργου.
Η διαδικασία που θα ακολουθήσουμε είναι να κάνουμε μερικές αλλαγές στο έργο και να υποβάλλουμε ένα στιγμιότυπο από αυτές τις αλλαγές στο αποθετήριο κάθε φορά που θέλουμε να καταγράψουμε την εκάστοτε κατάσταση του έργου μας.

Οποιοδήποτε αρχείο στον κατάλογο που δουλεύουμε μπορεί να βρίσκεται σε δύο καταστάσεις: εντοπισμένο ή μη εντοπισμένο.
Τα εντοπισμένα αρχεία είναι αυτά που βρίσκονταν στο τελευταίο στιγμιότυπο και μπορούν να είναι τροποποιημένα, ατροποποίητα ή καταχωρημένα.
Τα μη εντοπισμένα αρχεία από την άλλη μπορούν να είναι οτιδήποτε άλλο. Τα αρχεία αυτά μπορούν να είναι οποιοδήποτε αρχεία στον κατάλογο εργασίας μας τα οποία δεν βρίσκονταν στο τελευταίο στιγμιότυπο και ούτε έχουν καταχωρηθεί ακόμα.
Για παράδειγμα, όταν κλωνοποιούμε για πρώτη φορά ένα αποθετήριο, όλα τα αρχεία θα είναι εντοπισμένα και ατροποποίητα καθώς μόλις τα ενημερώσαμε και δεν τα έχουμε επεξεργαστεί ακόμα.

Καθώς επεξεργαζόμαστε τα αρχεία, το Git θα τα αναγνωρίζει ως τροποποιημένα καθώς έχουν αλλάξει από την τελευταία φορά που υποβάλλαμε κάποια αρχεία.
Τα επόμενα στάδια είναι η καταχώρηση των τροποποιημένων αρχείων και η υποβολή τους, η διαδικασία αυτή θα επαναλαμβάνεται συνέχεια.

.The lifecycle of the status of your files.
image::images/lifecycle.png[The lifecycle of the status of your files.]

[[_checking_status]]
==== Έλεγχος της κατάστασης των αρχείων μας

Το βασικό εργαλείο που μπορούμε να χρησιμοποιήσουμε ώστε να δούμε την τρέχουσα κατάσταση των αρχείων είναι η εντολή `git status`.(((εντολές git, status)))
Αν εκτελέσουμε την εντολή αυτή αμέσως αφού κλωνοποιήσουμε ένα αποθετήριο, θα δούμε στη γραμμή εντολών το παρακάτω μήνυμα:

[source,console]

$ git status On branch master nothing to commit, working directory clean

Το μήνυμα αυτό σημαίνει ότι έχουμε ένα καθαρό κατάλογο εργασίας. Με άλλα λόγια, δεν υπάρχουν τροποποιημένα ή εντοπισμένα αρχεία.
Επίσης δεν υπάρχουν ούτε μη εντοπισμένα αρχεία αλλιώς το Git θα τα είχε καταγράψει στο παραπάνω μήνυμα.
Επίσης, η εντολή αυτή μας ενημερώνει σε ποιον κλάδο βρισκόμαστε καθώς και ότι δεν έχει αποκλίνει από τον αντίστοιχο κλάδο του διακομιστή.
Προς το παρόν χρησιμοποιούμε τον κύριο κλάδο, ``master'', ο οποίος είναι και ο προεπιλεγμένος.
Θα αναφερθούμε πιο αναλυτικά στους κλάδους στο κεφάλαιο <<_git_branching>>.

Έστω ότι έχουμε προσθέσει ένα νέο αρχείο στο έργο μας, ένα απλό αρχείο README.
Αν το αρχείο αυτό δεν προυπήρχε και εκτελέσουμε την εντολή `git status`, θα δούμε το μη εντοπισμένο αρχείο μας ως εξής:

[source,console]

$ echo My Project > README $ git status On branch 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 βλέπει ένα αρχείο το οποίο δεν υπήρχε στο προηγούμενο στιγμιότυπο (την τελευταία φορά που υποβάλλαμε αρχεία). Το Git δεν θα συμπεριλάβει το αρχείο αυτό στα επόμενα στιγμιότυπα που θα υποβάλλουμε αν δεν το ζητήσουμε ρητά.
Αυτό γίνεται ώστε να μην συμπεριλάβουμε κατά λάθος στο έργο μας αρχεία τα οποία δεν θέλαμε, για παράδειγμα δυαδικά αρχεία.
Στην περίπτωσή μας, θέλουμε να συμπεριλάβουμε το αρχείο README στο έργο μας οπότε πάμε να ενημερώσουμε το Git ώστε να το εντοπίσει.

[[_tracking_files]]
==== Εντοπίζοντας Νέα Αρχεία

Για να εντοπίσει το Git ένα καινούριο αρχείο, χρησιμοποιούμε την εντολή `git add`.(((εντολές git, add)))
Ξεκινάμε τον εντοπισμό του αρχείου REAMDE με την εντολή:

[source,console]

$ git add README

Αν τώρα εκτελέσουμε την εντολή για να δούμε την τρέχουσα κατάσταση του αποθετηρίου, θα δούμε ότι το αρχείο README είναι πλέον εντοπισμένο και καταχωρημένο ώστε να είναι έτοιμο να υποβληθεί:

[source,console]

$ 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, init)))(((εντολές git, add)))
Η εντολή `git add` μπορεί να ακολουθείται είτε από ένα αρχείο είτε από έναν κατάλογο. Αν ακολουθείται από κατάλογο τότε η εντολή θα καταχωρήσει όλα τα αρχεία του συγκεκριμένου καταλόγου αναδρομικά.

==== Καταχωρώντας Τροποποιημένα Αρχεία

Πάμε λοιπόν να τροποποιήσουμε ένα αρχείο το οποίο είναι ήδη εντοπισμένο.
Έστω ότι τροποποιούμε ένα ήδη εντοπισμένο αρχείο, το ``CONTRIBUTING.md'' και εκτελούμε την εντολή `git status` ξανά:

[source,console]

$ git status On branch 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)))
Πάμε λοιπόν να εκτελέσουμε την εντολή `git add` για να καταχωρήσουμε το αρχείο``CONTRIBUTING.md'' και έπειτα να δούμε την τρέχουσα κατάσταση του αποθετηρίου:

[source,console]

$ git add CONTRIBUTING.md $ git status On branch master Changes to be committed: (use "git reset HEAD <file>…​" to unstage)

new file:   README
modified:   CONTRIBUTING.md
Και τα δύο αρχεία πλέον είναι καταχωρημένα και θα συμπεριληφθούν στην επόμενη υποβολή στιγμιοτύπου.
Στο σημείο αυτό, ας υποθέσουμε ότι θυμόμαστε μια μικρή αλλαγή που θέλουμε να κάνουμε στο αρχείο `CONTRIBUTING.md` πριν το υποβάλλουμε.
Αφού κάνουμε την αλλαγή που θέλουμε, είμαστε έτοιμοι για την υποβολή.
Παρόλα αυτά ας εκτελέσουμε `git status` άλλη μια φορά:

[source,console]

$ vim CONTRIBUTING.md $ git status On branch 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`, θα πρέπει να την εκτελέσουμε ξανά ώστε να καταχωρήσουμε την τελευταία έκσοτη του αρχείου:

[source,console]

$ git add CONTRIBUTING.md $ git status On branch 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` θα έχουμε ένα πιο απλοποιημένο αποτέλεσμα.

[source,console]

$ git status -s M README MM Rakefile A lib/git.rb M lib/simplegit.rb ?? LICENSE.txt

Τα καινούργια αρχεία που δεν έχουν εντοπιστεί ακόμα συμβολίζονται με `??`, τα καινούρια αρχεία που έχουν καταχωρηθεί με `A`, τα τροποποιημένα αρχεία με `M` κ.ο.κ.
Το αποτέλεσμα της εντολής περιλαμβάνει δύο σύμβολα για το κάθε αρχείο. Το αριστερό σύμβολο υποδηλώνει ότι το αρχείο έχει καταχωρηθεί και το δεξί ότι έχει τροποποιηθεί.
Για παράδειγμα, το αρχείο `README` είναι τροποιποιημένο στο κατάλογο εργασίας, αλλά δεν έχει καταχωρηθεί ακόμα. Το αρχείο `lib/simplegit.rb` είναι τροποποιημένο και καταχωρημένο.
Το αρχείο `Rakefile` από την άλλη έχει τροποποιηθεί, καταχωρηθεί, και τροποποιηθεί ξανά που σημαίνει ότι υπάρχουν κάποιες αλλαγές που έχουν καταχωρηθεί και κάποιες που δεν έχουν.

[[_ignoring]]
==== Αγνοώντας αρχεία

Είναι συχνό φαινόμενο να υπάρχει μια κατηγορία αρχείων που δεν θέλουμε να καταχωρηθούν αυτόματα από το Git, αλλά ούτε και να τα βλέπουμε ως μη εντοπισμένα.
Συνήθως αυτά είναι αρχεία που δημιουργούνται αυτόματα όπως αρχεία καταγραφής ή αρχεία που δημιουργούνται από τον μεταγλωττιστή.
Σε αυτές τις περιπτώσεις μπορούμε να βρούμε το μοτίβο των ονομάτων των αρχείων που δεν χρειαζόμαστε και να τα καταχωρήσουμε στο αρχείο `.gitignore`.(((ignoring files)))
Ας δούμε ένα παράδειγμα αρχείου `.gitignore`:

[source,console]

$ cat .gitignore *.[oa] *~

Η πρώτη γραμμή ενημερώνει το Git ώστε να αγνοεί όλα τα αρχεία που τελειώνουν σε ``.o'' ή ``.a''.
Η δεύτερη γραμμή ενημερώνει το Git ώστε να αγνοεί όλα τα αρχεία που τελειώνουν με τον χαρακτήρα της ισπανικής περισπωμένης (`~`), το οποίο χρησιμοποιείται από πολλούς επεξεργαστές κειμένου, όπως ο Emacs, για να δηλώσει τα προσωρινά αρχεία.
Μπορούμε επίσης να συμπεριλάβουμε καταλόγους που περιλαμβάνουν αρχεία καταγραφής, προσωρινούς καταλόγους κ.ό.κ.
Γενικά είναι καλή ιδέα να ρυθμίσουμε το αρχείο `.gitignore` νωρίς ώστε να μην υποβάλλουμε κατά λάθος αρχεία που δεν θέλουμε να βρίσκονται στο αποθετήριο.

Οι κανόνες για τα μοτίβα που μπορούμε να δηλώσουμε στο αρχείο `.gitignore` είναι οι εξής:

*  Οι κενές γραμμές ή οι γραμμές που ξεκινούν με `#` θα αγνοηθούν.
*  Μπορούμε να χρησιμοποιήσουμε τα κλασικά μοτίβα για ονόματα αρχείων (glob patterns).
*  Μπορούμε να ξεκινήσουμε τα μοτίβα μας με μια κάθετο (`/`) ώστε να αποφύγουμε την αναδρομικότητα
*  Μπορούμε να τελειώσουμε τα μοτίβα μας με μια κάθετο (`/`) ώστε να ορίσουμε έναν κατάλογο.
*  Μπορούμε να αντιστρέψουμε ένα μοτίβο χρησιμοποιώντας ένα θαυμαστικό (`!`) στην αρχή του.

Τα μοτίβα αυτά είναι σαν απλοποιημένες κανονικές εκφράσεις (regular expressions) που χρησιμοποιούν τα λειτουργικά συστήματα.
Ένας αστερίσκος (`*`) αντιστοιχεί σε 0 ή περισσότερους χαρακτήρες. Το `[abc]` αντιστοιχεί σε οποιονδήποτε χαρακτήρα βρίσκεται μέσα στις αγκύλες. Το σύμβολο του αγγλικού ερωτηματικού (`?`) αντιστοιχεί σε έναν και μόνο χαρακτήρα. Αν οι αγκύλες περιέχουν 2 χαρακτήρες που μεταξύ τους χωρίζονται με παύλα (`[0-9]`) τότε αυτή η έκφραση αντιστοιχεί σε όλους τους χαρακτήρες που υπάρχουν μεταξύ των 2 χαρακτήρων (στην περίπτωσή μας, όλοι οι αριθμοί από το 0 μέχρι το 9).
Μπορούμε επίσης να χρησιμοποιήσουμε 2 αστερίσκους για να αντιστοιχίσουμε εμφωλευμένους καταλόγους: η έκφραση `a/**/z` αντιστοιχεί στους καταλόγους `a/z`, `a/b/z`, `a/b/c/z` κ.ό.κ.

Ας δούμε άλλο ένα παράδειγμα ενός αρχείου .gitignore:

[source]