Table of Contents
Git - Version Control
Εγκατάσταση
aptitude install git git-core
Βασικές εντολές
Όνομα και email χρήστη
Καλό είναι να συστηθούμε αρχικά, δίνοντας το όνομα και το email μας, πληροφορίες που θα εμφανίζονται σε κάθε commit αρχείου
git config --global user.name "Your Name Comes Here" git config --global user.email you@yourdomain.example.com
Το αρχείο που δημιουργείται είναι το ~/.gitconfig ως
[user] name = "Your Name Comes Here" email = you@yourdomain.example.com
Δημιουργία repository
Μπαίνουμε στον φάκελο που θέλουμε (π.χ. ~/mygit) και δημιουργούμε ένα νέο project
mkdir ~/mygit cd ~/mygit git-init
Έτσι δημιουργήθηκε ένα .git repository μέσα σε αυτόν τον φάκελο
Προσθήκη αρχείων
Στην συνέχεια προσθέτουμε κάποια αρχεία στον φάκελο που βρισκόμαστε (π.χ. ένα script αρχείο στο κέλυφος bash myscript)
cp ~/myscript .
Για να τo προσθέσουμε και στο .git repository εκτελούμε
git-add myscript git-commit myscript
Εδώ θα μας ανοίξει ένας editor για να γράψουμε ένα περιγραφικό μήνυμα. Θα αφήσουμε την περιγραφή initial commit, βγάζωντας τα σχόλια από την γραμμή
Change logs
Για προτάσεις πως να γράφονται change logs (βλ. change logs standards)
Τροποποίηση αρχείων
Αφού τροποποιήσουμε το αρχείο μας, για να το εισάγουμε στο repository, κάνουμε απλά commit
git-commit myscript
Παράβλεψη αρχείων
Εάν έχουμε αρχεία στον ίδιο φάκελο που δεν θέλουμε να παρακολουθούνται για αλλαγές από το git τα σημειώνουμε στο αρχείο .gitignore π.χ.
myscript~ testscript testscript~ .gitignore~
Στην συνέχεια το προσθέτουμε και αυτό στο repository ώστε να κρατάμε και το ιστορικό των ενεργειών για αγνόηση ή όχι αρχείων
git add .gitignore git commit .gitignore
με μύνημα π.χ Make git ignore testscript and backup files.
Ορθή επανάληψη τελευταίου commit
Για να επαναλάβουμε το commit μαζί με τα τελευταία μηνύματα και τις αλλαγές
git commit --amend myscript
Αν είχαμε ορίσει και tag στο ακυρωμένο commit (π.χ. v0.1.1) το αφαιρούμε με
git tag -d v0.1.1
Και τέλος το ξαναορίζουμε στην τελευταία αλλαγή
git tag v0.1.1
tags (εκδόσεις)
Για να ορίσουμε την τελευταία έκδοση του project μας ως v0.1.0 εκτελούμε
git-tag v0.1.0
Για να ορίσουμε μια έκδοση ενός παλιού commit (π.χ. του 77d7ba625f25f989d5bf51f38d2c28e94b77645c)
git-tag v0.1.0beta 77d7ba
βλέπουμε ότι τα πρωτα γράμματα της ονομασίας αρκούν για να αναφερθούμε σε ένα commit
Αρίθμηση εκδόσεων
Για προτάσεις στο πως να σημειώνονται οι εκδόσεις (βλ. version numbering standards)
Διαγραφή εκδόσεων
Για να διαγράψουμε μια ετικέτα έκδοσης π.χ. το tag v0.1.2
git tag -d v0.1.2
Checkout σε άλλη έκδοση
Για να πάμε π.χ. στην έκδοση v0.1.8 απλά εκτελούμε
git-checkout v0.1.8
Δεν διαγράφονται οι άλλες εκδόσεις αν συνεχίσουμε από εκεί, απλά γίνονται παρακλάδια
Κλάδοι (branches)
Εκτός από εκδόσεις μπορούμε να δώσουμε και ονόματα κλάδων
git-branch experimental
Για να μετονομάσουμε έναν κλαδο π.χ. τον master σε oldstable εκτελούμε
git-branch -m master oldstable
Ονομασίες κλάδων
Για προτάσεις στο πως να ονομάζουμε κλάδους (βλ. branch naming standards)
Checkout σε άλλο κλαδο
Για να πάμε σε άλλο κλάδο (π.χ. experimental) απλά εκτελούμε
git-checkout experimental
Δεν διαγράφονται οι άλλοι κλάδοι αν συνεχίσουμε από εκεί, απλά γίνονται παρακλάδια
Αν έχουμε τραβήξει αλλαγές από άλλο repository και θέλουμε να τοποθετηθούμε στην έκδοση του αρχείο με τις τελευταίες αλλαγές ελέγχουμε τον κλάδο με git-log ώστε να δούμε την ονομασία του κλάδου και π.χ. για να εμφανίσουμε το αρχείο test.sh του κλάδου refs/remotes/remoteserver/master εκτελούμε
git-checkout refs/remotes/remoteserver/master test.sh
History
revisions
Για να δούμε το ιστορικό τον μέχρι τώρα αλλαγών
git-log
για ποιο όμορφο και συνοπτικό αποτέλεσμα σε μία γραμμή (το –decorate εμφανίζει τα tags)
git-log --decorate --color --pretty=oneline --abbrev-commit --abbrev=0
με πιο πλήρη μηνύματα και πληροφορίες για τις αλλαγές σε αρχεία
git-log --decorate --color --stat --pretty=short --abbrev-commit --abbrev=0
για περισσότερες ακόμα πληροφορίες
git-log --decorate --color --stat --pretty=fuller --graph --summary
Αλλαγές μεταξύ εκδόσεων
Για να δούμε τις αλλαγές από την έκδοση v1.0.3 έως και τώρα
git-log v1.0.3..
Για να δούμε τις αλλαγές από την έκδοση v1.0.3 έως και την έκδοση v1.0.5
git-log v1.0.3..v1.0.5
Αλλαγές μεταξύ κλάδων
Ομοίως για τους κλάδους Για να δούμε τις αλλαγές από τον κλάδο experimental έως και τώρα
git-log experimental..
Για να δούμε τις αλλαγές από την έκδοση testing έως και την experimental
git-log testing..experimental
Δημιουργία ChangeLogs
Στο πακέτο git-buildpackage υπάρχει το εργαλείο git-dch του debian για δημιουργία changelogs (δημιουργήθηκε για debian πακέτα, αλλά αυτό δεν μας πειράζει καθόλου).
Εγκαθιστούμε με
aptitude install git-buildpackage
Diffs
Για να δούμε τις αλλαγές που έγιναν στο commit μιας συγκεκριμένης έκδοσης
git show v1.0.1 --color
Ανά Γραμμή Αρχείου
Υπάρχει η δυνατότητα να δούμε πότε τροποποιήθηκε μια οποιαδήποτε γραμμή ενός αρχείου με την εντολή git blame
git blame myscript
Κατανεμημένη ανάπτυξη
clone - Αρχική αντιγραφή
Για να αντιγράψουμε ένα repository από κάποιον server όπου έχουμε πρόσβαση ssh εκτελούμε την παρακάτω εντολή, π.χ.
cd /opt/develop git clone gitserver.mydomain.gr:/opt/develop/public/myproject
Έτσι θα δημιουργήσουμε τοπικά έναν νέο φάκελο myproject κάτω από τον φάκελο /opt/develop που θα είναι ακριβές αντίγραφο του φακέλου /opt/develop/public/myproject που βρίσκεται στο μηχάνημα gitserver.mydomain.gr
Για χρήση με εφαρμογές όπως redmine θα πρέπει να εκτελέσουμε την εντολή
git clone --bare ssh://user@domain.com/path/to/git/projectname projectname
pull - Συγχρονισμός προς τοπικό αποθετήριο
Εάν εργαζόμαστε στο project και θέλουμε να τραβήξουμε από το απομακρυσμένο αποθετήριο τις αλλαγές ώστε να συγχρονίσουμε το τοπικό μας αντίγραφο εκτελούμε (ενώ είμαστε στο φάκελο του project)
git pull gitserver.mydomain.gr:/opt/develop/public/myproject master git pull --tags gitserver.mydomain.gr:/opt/develop/public/myproject master
push - Συγχρονισμός προς απομακρυσμένο αποθετήριο
Εάν θέλουμε να στείλουμε τις τελευταίες αλλαγές μας από το τοπικό αποθετήριο σε ένα απομακρυσμένο εκτελούμε (ενώ είμαστε στο φάκελο του project)
git push user@gitserver.mydomain.gr:/opt/develop/public/myproject master git push --tags user@gitserver.mydomain.gr:/opt/develop/public/myproject master
remote - config - ρύθμιση αποθετηρίων
Τα αποθετήρια που τραβάμε και στέλνουμε αρχεία είναι συνήθως σταθερά. Μπορούμε να τα ορίσουμε π.χ. ως εξής
git remote add gitserver user@gitserver.mydomain.gr:/opt/develop/public/myproject master git config branch.master.remote 'gitserver' git config branch.master.merge 'refs/heads/master'
Στην το pull απλοποιείται
git pull gitserver
το ίδιο και το push
git push gitserver git push --tags gitserver
Άλλες εντολές
Κατάσταση αρχείων
Για να δούμε την κατάσταση στο repository μας εκτελούμε
git-status
Cleanup/Compress
git-gc
Διαφορές αρχείων
Για να δούμε την τελευταία αλλαγή, πριν κάνουμε commit, εκτελούμε
git-diff myscript
Μόνιμη διαγραφή αλλαγών τελευταίου commit
Προσοχή! Η επαναφορά προυποθέτει ότι θα χάσουμε όλες τις μέχρι τότε αλλαγές
Για να διαγράψουμε και τις αλλαγές αλλά όχι τα παλιά ονόματα tags
git reset --hard HEAD^
git-gui - γραφικό εργαλείο
Το καλούμε από κονσόλα ενώ είμαστε στον φάκελο που περιέχει το git repository
Από το μενού repository / visualize έχει την δυνατότητα να εμφανίσει το gitk
giggle - γραφικό εργαλείο
aptitude install giggle
gitweb - Web Interface
aptitude install gitweb
Gitk - γραφικό εργαλείο
Το καλούμε από κονσόλα ενώ είμαστε στον φάκελο που περιέχει το git repository
Εγκατάσταση
aptitude install gitk
Λειτουργίες
Εάν κάνουμε παράλληλα αλλαγές στο repository από την γραμμή εντολών, για να τις εμφανίσουμε πηγαίνουμε File / Update. Προσοχή δεν κάνουμε Reload (ακόμα δεν γνωρίζω τι ακριβώς κάνει)
GitStats
Δημιουργεί ενδιαφέροντα στατιστικά στοιχεία σε μορφή html για ένα repository
aptitude install gitstats
Εκτελούμε ως π.χ.
gitstats /path/to/myrepodir ~/gitstats
Στην συνέχεια ανοίγουμε την ιστοσελίδα ~/gitstats/index.html από έναν browser
tig - command line frontend
Εγκατάσταση με
aptitude install tig
TODO
Aπό εδώ να δω οδηγίες για δημιουργία change logs http://www.luthi.eu/blog/2008/06/git-for-debian-packaging. Να δοκιμάσω σε άλλο φάκελο-αντίγραφο του repository
Να δοκιμάσω και να καταγράψω πως γίνονται 6 συνήθεις ενέργειες σε Version Control Systems (από ένα forum http://railsforum.com/viewtopic.php?pid=65590 - έχει και τις εντολές).
- How do I create a new repository?
- How do I check code out?
- How do I submit changes?
- I screwed up, broke everything, how do I roll back my entire tree to what I had last Thursday at 0900?
- I just hit a huge milestone, how do I mark/tag/branch my code at this point?
- I fixed a huge bug, how do I move changes from just that bug into my previous release?
Πηγές
- Git Official Tutorial : http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html
- Cheat Sheets :
- git for the lazy : http://www.spheredev.org/wiki/Git_for_the_lazy
- 20 everyday commands : http://www.kernel.org/pub/software/scm/git/docs/everyday.html
- Setup public repository : http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#setting-up-a-public-repository
- 6 συνήθεις ενέργειες σε Version Control Systems : http://railsforum.com/viewtopic.php?pid=65590
- Frontends / tools
- Short guide : http://kerneltrap.org/node/5196
- Packaging with git : http://madduck.net/blog/2007.10.03:packaging-with-git/
- Ελληνικό Linux Format τεύχος 22, σελ.80-83
- git for designers : http://hoth.entp.com/output/git_for_designers.html
- Comparison
- git-bazaar-mercurial benchmarks : http://git.or.cz/gitwiki/GitBenchmarks
- Version Numbering :
- Linux kernel policy : http://en.wikipedia.org/wiki/Linux_kernel#Version_numbering
