====== 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 (βλ. [[el:programming:standards#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 === Αρίθμηση εκδόσεων === Για προτάσεις στο πως να σημειώνονται οι εκδόσεις (βλ.[[el:programming:standards#versions | 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 === Ονομασίες κλάδων === Για προτάσεις στο πως να ονομάζουμε κλάδους (βλ.[[el:programming:standards#branches | 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 ===== FIXME Aπό εδώ να δω οδηγίες για δημιουργία change logs http://www.luthi.eu/blog/2008/06/git-for-debian-packaging. Να δοκιμάσω σε άλλο φάκελο-αντίγραφο του repository FIXME Να δοκιμάσω και να καταγράψω πως γίνονται 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 - Guide : http://www-cs-students.stanford.edu/~blynn/gitmagic/ - Cheat Sheets : * http://swxruby.org/git-cheat-sheet.pdf * http://cheat.errtheblog.com/s/git - 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 - User Manual : http://www.kernel.org/pub/software/scm/git/docs/user-manual.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 * http://git.or.cz/gitwiki/InterfacesFrontendsAndTools * http://git.or.cz/#tools - Short guide : http://kerneltrap.org/node/5196 - Tutorial : http://www-cs-students.stanford.edu/~blynn/gitmagic/ - 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 - http://bryan-murdock.blogspot.com/2007/03/cutting-edge-revision-control.html - Version Numbering : - Linux kernel policy : http://en.wikipedia.org/wiki/Linux_kernel#Version_numbering - http://www.advogato.org/article/40.html