<p>εντάξει, αφού είδε <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/2678236#2678236">αυτή η δημοσίευση από τον pj hyett</a> , αποφάσισα να παραλείψω το τέλος και να πάω με <a href="http://en.wikipedia.org/wiki/git\_(software)">git</a> .</p><p>αυτό που χρειάζομαι είναι ένας οδηγός <strong> για αρχάριους </strong> για το git. ο "αρχάριος" που ορίζεται ως κάποιος που ξέρει να χειρίζεται τον μεταγλωττιστή του, καταλαβαίνει σε κάποιο επίπεδο τι είναι <a href="http://en.wikipedia.org/wiki/make\_%28software%29">makefile</a> και έχει αγγίξει τον έλεγχο πηγής χωρίς να το καταλαβαίνει πολύ καλά.</p><p>το "πρακτικό" που ορίζεται ως αυτό το άτομο δεν θέλει να πάρει σε μεγάλη λεπτομέρεια σχετικά με το τι κάνει το git στο παρασκήνιο, και δεν νοιάζεται ούτε (ή δεν γνωρίζει) ότι είναι διανεμημένο. οι απαντήσεις σας ενδέχεται να υποδεικνύουν τις δυνατότητες, αλλά προσπαθήστε να στοχεύσετε στον αρχάριο που θέλει να διατηρήσει ένα "κύριο" αποθετήριο σε ένα "διακομιστή" που υποστηρίζεται και ασφαλίζεται και αντιμετωπίζει τον τοπικό αποθετήριο ως απλώς πόρο "πελάτη".</p><p>ετσι:</p><h2>εγκατάσταση/ρύθμιση</h2><ul> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323764">πώς να εγκαταστήσετε το git</a> </li> <li>πώς ρυθμίζετε το git; προσπαθήστε να καλύψετε το linux, windows, mac, σκεφτείτε τη νοοτροπία "client/server". <ul> <li> <a href="https://stackoverflow.com/questions/1482824/setup-git-server-with-msysgit-on-windows">εγκατάσταση git server με msysgit σε windows</a> </li> </ul> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#320140">πώς δημιουργείτε ένα νέο έργο/αποθετήριο;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#316062">πώς το ρυθμίζετε ώστε να αγνοεί τα αρχεία (.obj, .user, κ.λπ.) που δεν είναι πραγματικά μέρος του codebase;</a> </li> </ul><h2>εργασία με τον κώδικα</h2><ul> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/1350157#1350157">πώς αποκτάτε τον πιο πρόσφατο κώδικα;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323906">πώς ελέγχετε τον κώδικα;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#316055">πώς πραγματοποιείτε αλλαγές;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#319465">πώς βλέπετε τι δεν έχει δεσμευτεί, ή την κατάσταση της τρέχουσας βάσης κώδικα;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323898">πώς καταστρέφετε ανεπιθύμητες δεσμεύσεις;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/1762631#1762631">πώς συγκρίνετε δύο αναθεωρήσεις ενός αρχείου ή του τρέχοντος αρχείου σας και μιας προηγούμενης αναθεώρησης;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/2114836#2114836">πώς βλέπετε το ιστορικό των αναθεωρήσεων σε ένα αρχείο;</a> </li> <li>πώς χειρίζεστε δυαδικά αρχεία (π.χ. visio docs ή περιβάλλοντα μεταγλωττιστή);</li> <li>πώς συγχωνεύετε τα αρχεία αλλάζετε την ίδια χρονική στιγμή;</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/323898#323898">πώς ακυρώσετε (επαναφορά ή επαναφορά) μια δέσμευση;</a> </li> </ul><h2>ετικέτες, διακλάδωση, απελευθερώσεις, γραμμές βάσης</h2><ul> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#322967">πώς σημειώνετε '' ετικέτα '' ή 'απελευθέρωση' ένα συγκεκριμένο σύνολο αναθεωρήσεων για ένα συγκεκριμένο σύνολο αρχείων, ώστε να μπορείτε πάντα να το τραβάτε αυτό αργότερα;</a> </li> <li>πώς τραβάτε μια συγκεκριμένη "απελευθέρωση";</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/816614#816614">πώς κάνετε υποκατάστημα;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/816636#816636">πώς συγχωνεύετε τα υποκαταστήματα;</a> </li> <li>πώς επιλύετε διενέξεις και ολοκληρώσετε τη συγχώνευση;</li> <li>πώς συγχωνεύετε τμήματα ενός κλάδου σε άλλο κλάδο;</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/5985070#5985070">τι είναι το rebasing;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/1590791#1590791">πώς μπορώ να παρακολουθώ απομακρυσμένα υποκαταστήματα;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/1590803#1590803">πώς μπορώ να δημιουργήσω ένα υποκατάστημα σε απομακρυσμένο αποθετήριο;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/5977604#5977604">πώς μπορώ να διαγράψω ένα υποκατάστημα σε απομακρυσμένο αποθετήριο;</a> </li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/5968622#5968622">παραδείγματα ροής εργασίας git</a> </li> </ul><h2>αλλα</h2><ul> <li>περιγράψτε και συνδεθείτε με ένα καλό γραφικό περιβάλλον, πρόσθετο ide κ.λπ. που κάνει το git έναν πόρο μη γραμμής εντολών, αλλά παραθέστε τους περιορισμούς του καθώς και το καλό του.<ul> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323559">msysgit</a> - σταυροειδής πλατφόρμα, περιλαμβάνεται στο git</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323559">gitk</a> - πρόγραμμα προβολής ιστορικού διασταυρώσεων, που περιλαμβάνεται στο git</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323559">gitnub</a> - mac os x</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323559">gitx</a> - πρόγραμμα προβολής ιστορικού mac os x.</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323559">smartgit</a> - σταυροειδής πλατφόρμα, εμπορική, βήτα</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/322989#322989">tig</a> - κονσόλα gui για linux</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/644129#644129">qgit</a> - gui για windows, linux</li> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide#323559">git extensions</a> - πακέτο για windows, περιλαμβάνει φιλικό gui</li> </ul> </li> <li>οποιαδήποτε άλλα κοινά καθήκοντα πρέπει να γνωρίζει ένας αρχάριος; <ul> <li> <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/319465#319465">η κατάσταση git σας λέει τι κάνατε, τι υποκατάστημα έχετε και άλλες χρήσιμες πληροφορίες</a> </li> </ul> </li> <li>πώς μπορώ να εργαστώ αποτελεσματικά με ένα αποθετήριο subversion που έχει οριστεί ως πηγή ελέγχου πηγή μου;</li> </ul><h2>άλλες αναφορές αρχαρίων του git</h2><ul> <li> <a href="http://www.sourcemage.org/git\_guide">οδηγός git</a> </li> <li> <a href="http://book.git-scm.com/">βιβλίο git</a> </li> <li> <a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/">git μαγεία</a> </li> <li> <a href="http://www.gitcasts.com/">gitcasts</a> </li> <li> <a href="http://github.com/guides/home">οδηγοί github</a> </li> <li> <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">git tutorial</a> </li> <li> <a href="http://progit.org/book">progit - βιβλίο του scott chacon</a> </li> <li> <a href="http://git.or.cz/course/svn.html">git - svn crash course</a> </li> <li> <a href="http://www.newartisans.com/2008/04/git-from-the-bottom-up.html">git από κάτω προς τα πάνω</a> </li> <li> <a href="http://www.gitready.com">git έτοιμο</a> </li> <li> <a href="http://gitref.org/">gitref.org</a> </li> <li> <a href="http://www.ndpsoftware.com/git-cheatsheet.html">git visual cheatsheet</a> </li> </ul><h2>περπατώντας στο git</h2><ul> <li> <a href="http://www.eecs.harvard.edu/~cduan/technical/git/">κατανόηση git εννοιολογικά</a> </li> <li> <a href="http://eagain.net/articles/git-for-computer-scientists/">git για τους επιστήμονες υπολογιστών</a> (και <a href="http://sitaramc.github.com/gcs/">άλλη έκδοση</a> )</li> </ul><p>θα περάσω μέσα από τις καταχωρήσεις από καιρό σε καιρό και θα τους τακτοποιήσω έτσι ώστε να έχουν μια σταθερή εμφάνιση και αίσθηση και είναι εύκολο να σκανάρουν τη λίστα - διστάσετε να ακολουθήσετε μια απλή "επικεφαλίδα - σύντομη εξήγηση - λίστα οδηγιών - gotchas και επιπλέον πληροφορίες ". θα συνδεθώ επίσης με τις καταχωρίσεις από τη λίστα των κουκίδων παραπάνω, ώστε να είναι εύκολο να τις βρείτε αργότερα.</p>
git για αρχάριους: ο οριστικός πρακτικός οδηγός
<h1>πώς δημιουργείτε ένα νέο έργο/αποθετήριο;</h1><p>μια αποθήκη git είναι απλά ένας κατάλογος που περιέχει έναν ειδικό κατάλογο <code>.git</code>.</p><p>αυτό είναι διαφορετικό από τα "κεντρικά" συστήματα ελέγχου έκδοσης (όπως το subversion), όπου φιλοξενείται ένας "αποθετήριος" σε έναν απομακρυσμένο διακομιστή, ο οποίος <code>checkout</code> σε έναν κατάλογο "εργασίας αντίγραφο". με το git, το αντίγραφο εργασίας <em> είναι </em> το αποθετήριο.</p><p>απλά εκτελέστε <code>git init</code> στον κατάλογο που περιέχει τα αρχεία που θέλετε να παρακολουθήσετε.</p><p>για παράδειγμα,</p><pre><code>cd ~/code/project001/ git init </code></pre><p>αυτό δημιουργεί ένα φάκελο <code>.git</code> (κρυφό) στον τρέχοντα κατάλογο.</p><p>για να δημιουργήσετε ένα νέο έργο, εκτελέστε <code>git init</code> με ένα πρόσθετο όρισμα (το όνομα του καταλόγου που θα δημιουργηθεί):</p><pre><code>git init project002 (this is equivalent to: mkdir project002 &amp;&amp; cd project002 &amp;&amp; git init) </code></pre><p>για να ελέγξετε αν η τρέχουσα διαδρομή είναι εντός ενός αποθετηρίου git, εκτελέστε απλά το <code>git status</code> - εάν δεν είναι αποθετήριο, θα αναφέρει "fatal: not a git repository"</p><p>θα μπορούσατε επίσης να ορίσετε τον κατάλογο <code>.git</code> και να τον ελέγξετε ότι περιέχει αρχεία/καταλόγους παρόμοια με τα παρακάτω:</p><pre><code>$ ls .git head config hooks/ objects/ branches/ description info/ refs/ </code></pre><hr><p>αν για οποιονδήποτε λόγο θέλετε να "de-git" ένα αποθετήριο (θέλετε να σταματήσετε να χρησιμοποιείτε git για να παρακολουθήσετε το έργο). απλά καταργήστε τον κατάλογο <code>.git</code> στο βασικό επίπεδο του αποθετηρίου.</p><pre><code>cd ~/code/project001/ rm -rf .git/ </code></pre><p><strong>προσοχή:</strong> αυτό θα καταστρέψει <em> όλα </em> ιστορικό αναθεώρησης, <em> όλα </em> οι ετικέτες σας, <em> όλα </em> git έχει κάνει. δεν θα αγγίξει τα "τρέχοντα" αρχεία (τα αρχεία που μπορείτε να δείτε αυτή τη στιγμή), αλλά οι προηγούμενες αλλαγές, τα διαγραμμένα αρχεία και ούτω καθεξής θα είναι ανεπανόρθωτα!</p>
<p>λοιπόν, παρά το γεγονός ότι ζητήσατε να μην "συνδέουμε" απλώς με άλλους πόρους, είναι αρκετά ανόητο όταν υπάρχει ήδη ένας αναπτυσσόμενος (και αναπτυσσόμενος) πόρος της κοινότητας που είναι πραγματικά αρκετά καλός: το <a href="http://book.git-scm.com/">git community book</a> . σοβαρά, αυτά τα 20 + ερωτήματα σε μια ερώτηση θα είναι οτιδήποτε, αλλά συνοπτικό και συνεπές. το βιβλίο του git community book είναι διαθέσιμο ως html και pdf και απαντά σε πολλές από τις ερωτήσεις σας με σαφείς, καλά μορφοποιημένες και αξιολογούμενες από ομότιμους απαντήσεις και σε μορφή που σας επιτρέπει να μεταβείτε ευθέως στο πρόβλημά σας στο χέρι.</p><p>δυστυχώς, αν η ανάρτηση μου αναστατώσει τότε θα το διαγράψω. απλά το πείτε.</p>
<h2>πώς να το ρυθμίσετε ώστε να αγνοεί τα αρχεία:</h2><p>η δυνατότητα να αγνοήσετε τα αρχεία που δεν θέλετε να παρακολουθήσετε είναι πολύ χρήσιμη.</p><p>για να αγνοήσετε ένα αρχείο ή ένα σύνολο αρχείων, παρέχετε ένα μοτίβο. η σύνταξη μοτίβο για git είναι αρκετά απλή, αλλά ισχυρή. ισχύει και για τα τρία διαφορετικά αρχεία που θα αναφέρω παρακάτω.</p><ul> <li>μια κενή γραμμή αγνοεί κανένα αρχείο, χρησιμοποιείται γενικά ως διαχωριστικό.</li> <li>οι γραμμές που κοιτάζουν με <strong> # </strong> χρησιμεύουν ως σχόλια.</li> <li>το πρόθεμα <strong>! </strong> είναι προαιρετικό και θα αρνηθεί το πρότυπο. οποιοδήποτε αρνητικό μοτίβο που ταιριάζει θα αντικαταστήσει τα χαμηλότερα πρότυπα προτεραιότητας.</li> <li>υποστηρίζει προηγμένες εκφράσεις και άγριες κάρτες <ul> <li>ex: το πρότυπο: <strong> *. [oa] </strong> θα αγνοήσει όλα τα αρχεία στο αποθετήριο που τελειώνουν σε .o ή .a (αρχεία αντικειμένων και αρχείων)</li> </ul> </li> <li>εάν ένα μοτίβο έχει κατάλογο που τελειώνει με μια πλάγια όψη, το git θα αντιστοιχεί μόνο σε αυτόν τον κατάλογο και τις διαδρομές κάτω από αυτό. αυτό αποκλείει κανονικά αρχεία και συμβολικούς συνδέσμους από τον αγώνα.</li> <li>μια κορυφαία κάθετο θα ταιριάζει με όλα τα αρχεία σε αυτό το όνομα διαδρομής. <ul> <li>ex: το μοτίβο <strong>/* .c </strong> θα ταιριάζει με το αρχείο <strong> foo.c </strong> αλλά όχι <strong> bar/awesome .c </strong></li> </ul> </li> </ul><p>μεγάλο παράδειγμα από τη σελίδα man <a href="http://www.kernel.org/pub/software/scm/git/docs/gitignore.html">gitignore (5)</a> :</p><pre><code>$ git status [...] # untracked files: [...] # documentation/foo.html # documentation/gitignore.html # file.o # lib.a # src/internal.o [...] $ cat .git/info/exclude # ignore objects and archives, anywhere in the tree. *.[oa] $ cat documentation/.gitignore # ignore generated html files, *.html # except foo.html which is maintained by hand !foo.html $ git status [...] # untracked files: [...] # documentation/foo.html [...] </code></pre><hr><p>γενικά, υπάρχουν τρεις διαφορετικοί τρόποι για να αγνοήσετε τα μη κρυπτογραφημένα αρχεία.</p><p><strong> 1) ignore για όλους τους χρήστες του αποθετηρίου: </strong></p><p>προσθέστε ένα αρχείο με όνομα <strong>. gitignore </strong> στη ρίζα του αντιγράφου εργασίας σας.</p><p>επεξεργασία <strong>. gitignore </strong> για να ταιριάζει με τις προτιμήσεις σας για τα οποία τα αρχεία πρέπει να/δεν πρέπει να αγνοούνται.</p><pre><code>git add .gitignore </code></pre><p>και να δεσμευτείτε όταν τελειώσετε.</p><p><strong> 2) ignore μόνο για το αντίγραφο του αποθετηρίου: </strong></p><p>προσθέστε/επεξεργαστείτε το αρχείο <strong> $ git\_dir/info/exclude </strong> στο αντίγραφο εργασίας σας, με τα προτιμώμενα πρότυπά σας.</p><p>ex: το αντίγραφο εργασίας μου είναι ~/src/project1 έτσι θα επεξεργαστώ <strong> ~/src/project1/.git/info/exclude </strong></p><p>τελείωσες!</p><p><strong> 3) ignore σε όλες τις περιπτώσεις, στο σύστημά σας: </strong></p><p>τα γενικά πρότυπα παραβίασης για το σύστημά σας μπορούν να μεταφερθούν σε ένα αρχείο που ονομάζεται ό, τι θέλετε.</p><p>το προσωπικό μου ονομάζεται <strong> ~/.gitglobalignore </strong></p><p>στη συνέχεια, μπορώ να ξέρω το git γνωρίζοντας αυτό το αρχείο τροποποιώντας το αρχείο μου <strong> ~/.gitconfig </strong> με την ακόλουθη γραμμή:</p><pre><code>core.excludesfile = ~/.gitglobalignore </code></pre><p>τελείωσες!</p><p>θεωρώ ότι η σελίδα <a href="http://www.kernel.org/pub/software/scm/git/docs/gitignore.html">gitignore</a> είναι η καλύτερη πηγή για περισσότερες πληροφορίες.</p>
<h1>πώς ετικέτατε ένα συγκεκριμένο σύνολο αναθεωρήσεων</h1><p><em> πώς σημαίνετε μια ετικέτα ή μια "απελευθέρωση" ενός συγκεκριμένου συνόλου αναθεωρήσεων για ένα συγκεκριμένο σύνολο αρχείων, ώστε να μπορείτε πάντα να το τραβάτε αυτό αργότερα; </em></p><p>χρησιμοποιώντας την εντολή <code>git tag</code>.</p><p>για απλά "ετικέτα" την τρέχουσα αναθεώρηση, θα τρέξετε μόνο ..</p><pre><code>git tag -a thetagname git tag -a 0.1 git tag -a 2.6.1-rc1 -m 'released on 01/02/03' </code></pre><p>για να ορίσετε τις τρέχουσες ετικέτες, απλώς εκτελέστε το <code>git tag</code> χωρίς επιχειρήματα ή <code>-l</code> (πεζά l):</p><pre><code>$ git tag -a thetagname # and enter a message, or use -m 'my tag annotation' $ git tag -l thetagname </code></pre><p>για να διαγράψετε μια ετικέτα, χρησιμοποιείτε τη σημαία <code>-d</code>:</p><pre><code>$ git tag -d thetagname deleted tag 'thetagname' $ git tag [no output] </code></pre><p>για να επισημάνετε μια συγκεκριμένη (προηγούμενη) δέσμευση, απλά κάνετε ..</p><pre><code>git tag [tag name] [revision sha1 hash] </code></pre><p>για παράδειγμα:</p><pre><code>git tag 1.1.1 81b15a68c6c3e71f72e766931df4e6499990385b </code></pre><hr><p>σημείωση: από προεπιλογή, το git δημιουργεί μια "ελαφριά" ετικέτα (βασικά μια αναφορά σε μια συγκεκριμένη αναθεώρηση). ο "σωστός" τρόπος είναι να χρησιμοποιήσετε τη σημαία <code>-a</code>. αυτό θα ξεκινήσει ο συντάκτης σας ζητώντας ένα μήνυμα ετικέτας (το ίδιο με το ερώτημα για ένα μήνυμα δέσμευσης, μπορείτε επίσης να χρησιμοποιήσετε τη σημαία <code>-m</code> για την παροχή του μηνύματος ετικέτας στη γραμμή εντολών). χρησιμοποιώντας μια ετικέτα σχολιασμού δημιουργεί ένα αντικείμενο με δική του ταυτότητα, ημερομηνία, tagger (συγγραφέας) και προαιρετικά μια υπογραφή gpg (χρησιμοποιώντας την ετικέτα <code>-s</code>). <em> για περισσότερες πληροφορίες σχετικά με αυτό, δείτε <a href="http://www.rockstarprogrammer.org/post/2008/oct/16/git-tag-does-wrong-thing-default/">αυτή την ανάρτηση</a> </em></p><pre><code>git tag mytagwithmsg -a -m 'this is a tag, with message' </code></pre><p>και για να απαριθμήσετε τις ετικέτες με σχολιασμούς, χρησιμοποιήστε τη σημαία <code>-n1</code> για να εμφανίσετε 1 γραμμή κάθε μηνύματος ετικέτας (<code>-n245</code> για να εμφανίσετε τις πρώτες 245 γραμμές κάθε σχολιασμού κ.ο.κ.):</p><pre><code>$ git tag -l -n1 mytagwithmsg this is a tag, with message </code></pre><p>για περισσότερες πληροφορίες, δείτε την <a href="http://www.kernel.org/pub/software/scm/git/docs/git-tag.html">git-tag (1) χειροκίνητη σελίδα</a> </p>
<p>παράδειγμα ροής εργασίας με git.</p><p>το git είναι εξαιρετικά ευέλικτο και προσαρμόζεται καλά σε οποιαδήποτε ροή εργασίας, αλλά η επιβολή μιας συγκεκριμένης ροής εργασίας δεν μπορεί να έχει αρνητικές συνέπειες καθιστώντας δύσκολο να κατανοήσετε τι μπορείτε να κάνετε με το git πέρα ​​από τη γραμμική ροή εργασίας "backup" και πόσο χρήσιμη είναι η διακλάδωση .</p><p>αυτό το <a href="http://nvie.com/posts/a-successful-git-branching-model/">blog post</a> εξηγεί ωραία μια πολύ απλή αλλά αποτελεσματική ροή εργασιών που είναι πραγματικά εύκολο στη ρύθμιση χρησιμοποιώντας git.</p><p>αναφέροντας από το blog post: θεωρούμε ότι ο origin/master είναι ο κύριος κλάδος όπου ο πηγαίος κώδικας του head αντικατοπτρίζει πάντα μια κατάσταση έτοιμη για παραγωγή:</p><p>η ροή εργασίας έχει γίνει αρκετά δημοφιλής ώστε να έχει κάνει ένα έργο που υλοποιεί αυτή τη ροή εργασίας: <a href="https://github.com/nvie/gitflow">git-flow</a> </p><p>νίκαια απεικόνιση μιας απλής ροής εργασίας, όπου κάνετε όλες τις αλλαγές σας στην ανάπτυξη και μόνο push to master όταν ο κώδικας βρίσκεται σε κατάσταση παραγωγής:</p><p><img src="https://i.stack.imgur.com/naozi.png" alt="simple workflow"></p><p>τώρα, ας υποθέσουμε ότι θέλετε να εργαστείτε σε ένα νέο χαρακτηριστικό ή να επαναχρησιμοποιήσετε μια ενότητα. θα μπορούσατε να δημιουργήσετε ένα νέο υποκατάστημα, αυτό που θα μπορούσαμε να ονομάσουμε ένα "χαρακτηριστικό" υποκατάστημα, κάτι που θα πάρει κάποιο χρονικό διάστημα και μπορεί να σπάσει κάποιο κωδικό. μόλις η λειτουργία σας είναι "αρκετά σταθερή" και θέλετε να την μετακινήσετε "πιο κοντά" στην παραγωγή, συγχωνεύετε τον κλάδο των χαρακτηριστικών σας για να αναπτύξετε. όταν όλα τα σφάλματα έχουν ταξινομηθεί μετά τη συγχώνευση και ο κωδικός σας περνάει όλες τις δοκιμές ροκ στερεά, πιέστε τις αλλαγές σας σε master.</p><p>κατά τη διάρκεια αυτής της διαδικασίας, θα βρείτε ένα τρομερό σφάλμα ασφαλείας, το οποίο πρέπει να επιλυθεί αμέσως. θα μπορούσατε να έχετε ένα υποκατάστημα που ονομάζεται επείγουσα επιδιόρθωση, το οποίο κάνει αλλαγές που ωθούνται πιο γρήγορα στην παραγωγή από τον κανονικό κλάδο ανάπτυξης.</p><p>εδώ έχετε μια εικόνα του τρόπου εμφάνισης αυτής της δυνατότητας λειτουργίας/επείγουσας επιδιόρθωσης/ανάπτυξης/παραγωγής (εξηγείται καλά στην αναρτήση του ιστολογίου και επαναλαμβάνω ότι η δημοσίευση στο blog εξηγεί ολόκληρη τη διαδικασία με περισσότερες λεπτομέρειες και πολύ καλύτερα από ό, τι κάνω .</p><p><img src="https://i.stack.imgur.com/6rduk.png" alt="git workflow example"></p>
<p>ακολουθεί ένα αντίγραφο της δημοσίευσης της pj hyett, καθώς δεν είναι πλέον διαθέσιμο:</p><blockquote> <h2>το git δεν είναι δύσκολο</h2> <p>23 νοεμβρίου 2008</p> <p>όταν λέμε στους ανθρώπους γιατί πρέπει να χρησιμοποιήσουν το git για την subversion, η γραμμή go-to είναι: "το git κάνει subversion καλύτερα από την subversion, αλλά κάνει πολύ περισσότερα από αυτό."</p> <p>το "πολύ περισσότερο" αποτελείται από ένα σωρό πράγματα που κάνει το git πραγματικά λάμπει, αλλά μπορεί να είναι αρκετά συντριπτική για εκείνους που προέρχονται από άλλα scm όπως subversion.</p> <p>τούτου λεχθέντος, τίποτα δεν σας εμποδίζει να χρησιμοποιήσετε το git όπως ακριβώς χρησιμοποιείτε το subversion ενώ κάνετε τη μετάβαση.</p> <p>υποθέτοντας ότι έχετε εγκαταστήσει το απαραίτητο λογισμικό και έχετε κάπου ένα απομακρυσμένο αποθετήριο, έτσι θα τραβήξετε τον κώδικα και πιέστε τις αλλαγές σας με το subversion:</p> <p><code>$ svn checkout svn://foo.googlecode.com/svn/trunk foo</code><br> <code># make your changes</code><br> <code>$ svn commit -m "my first commit"</code></p> <p>και πώς θα το κάνατε στο git:</p> <p><code>$ git clone git@github.com:pjhyett/foo.git</code><br> <code># make your changes</code><br> <code>$ git commit -a -m "my first commit"</code><br> <code>$ git push</code></p> <p>μια ακόμη εντολή να γίνει αυτό στο git. αυτή η επιπλέον εντολή έχει μεγάλες συνέπειες, αλλά για τους σκοπούς αυτής της δημοσίευσης, αυτό είναι όλο που μιλάμε, μια επιπλέον εντολή.</p> <p>βλέπετε, πραγματικά δεν είναι τόσο δύσκολο.</p> <p><strong>ενημέρωση:</strong> θα ήθελα να είμαι remiss να μην αναφέρει επίσης ότι το ισοδύναμο της ενημέρωσης τοπικό αντίγραφό σας σε subversion σε σύγκριση με git είναι <code>svn update</code> και <code>git pull</code>, αντίστοιχα. μόνο μία εντολή και στις δύο περιπτώσεις.</p> </blockquote>
<h1>πώς να εγκαταστήσετε το git</h1><h2>στα windows:</h2><p>εγκατάσταση <a href="http://code.google.com/p/msysgit/">msysgit</a> </p><p>υπάρχουν πολλές λήψεις:</p><ul> <li><strong>git:</strong> χρησιμοποιήστε αυτό εάν δεν χρειάζεστε συγκεκριμένα μία από τις άλλες επιλογές παρακάτω.</li> <li><strong>portablegit:</strong> χρησιμοποιήστε αυτό εάν θέλετε να εκτελέσετε το git σε έναν υπολογιστή χωρίς να το εγκαταστήσετε σε αυτόν τον υπολογιστή (π.χ. τρέχοντας git από μια μονάδα usb)</li> <li><strong>msysgit:</strong> χρησιμοποιήστε αυτό εάν θέλετε να αναπτύξετε το ίδιο το git. αν θέλετε απλά να χρησιμοποιήσετε το git για τον πηγαίο κώδικα <em> your </em>, αλλά δεν θέλετε να επεξεργαστείτε <em> git's </em> τον πηγαίο κώδικα, t χρειάζεται αυτό.</li> </ul><p>αυτό εγκαθιστά επίσης το shell της cygwin bash, ώστε να μπορείτε να χρησιμοποιήσετε το <code>git</code> σε ένα ωραιότερο shell (από το cmd.exe) και επίσης να συμπεριλάβετε το git-gui (προσβάσιμο μέσω της εντολής <code>git gui</code> ή του <code>start &gt; all programs &gt; git</code>)</p><h2>mac os x</h2><p>χρησιμοποιήστε το <a href="http://code.google.com/p/git-osx-installer/">git-osx-installer</a> ή μπορείτε επίσης να το εγκαταστήσετε από την πηγή</p><h2>μέσω ενός διαχειριστή πακέτων</h2><p>εγκαταστήστε <code>git</code> χρησιμοποιώντας τον εγγενή σας διαχειριστή πακέτων. για παράδειγμα, στο debian (ή στο ubuntu):</p><pre><code>apt-get install git-core </code></pre><p>ή σε mac os x, μέσω <a href="http://www.macports.org/">macports</a> :</p><pre><code>sudo port install git-core+bash\_completion+doc </code></pre><p>... ή fink:</p><pre><code>fink install git </code></pre><p>... ή <a href="http://github.com/mxcl/homebrew">homebrew</a> :</p><pre><code>brew install git </code></pre><p>στις κατανομές που βασίζονται στο red hat, όπως το fedora:</p><pre><code>yum install git </code></pre><p>στο cygwin το πακέτο git μπορεί να βρεθεί κάτω από την ενότητα "devel"</p><h2>από την πηγή (mac os x/linux/bsd/κλπ.)</h2><p>στο mac os x, αν έχετε εγκαταστήσει τα εργαλεία για προγραμματιστές, μπορείτε να μεταγλωττίσετε εύκολα το git από την πηγή. κατεβάστε την τελευταία έκδοση του git ως <code>.tar.bz</code> ή <code>.tar.gz</code> από <a href="http://git-scm.com/">http://git-scm.com/</a> και εξαγάγετε (κάντε διπλό κλικ στο finder)</p><p>σε linux/bsd/etc. θα πρέπει να είναι το ίδιο. για παράδειγμα, στο debian (και στο ubuntu), πρέπει να εγκαταστήσετε το πακέτο <code>build-essential</code> μέσω <code>apt</code>.</p><p>στη συνέχεια, σε ένα τερματικό, <code>cd</code> όπου εξάγετε τα αρχεία (το τρέξιμο <code>cd ~/downloads/git*/</code> θα πρέπει να λειτουργήσει), και στη συνέχεια εκτελέστε ..</p><pre><code>./configure &amp;&amp; make &amp;&amp; sudo make install </code></pre><p>αυτό θα εγκαταστήσει το git στην προεπιλεγμένη θέση (<code>/usr/local</code> - έτσι <code>git</code> θα βρίσκεται σε <code>/usr/local/bin/git</code>)</p><p>θα σας ζητήσει να εισαγάγετε τον κωδικό πρόσβασής σας (για <code>sudo</code>), έτσι μπορείτε να γράψετε στον κατάλογο <code>/usr/local/</code>, τον οποίο μπορεί να έχει πρόσβαση μόνο ο χρήστης "root", οπότε απαιτείται το sudo!</p><p>αν το κάνετε να το εγκαταστήσετε κάπου χωριστά (έτσι τα αρχεία του git δεν αναμειγνύονται με άλλα εργαλεία), χρησιμοποιήστε το <code>--prefix</code> με την εντολή configure:</p><pre><code>./configure --prefix=/usr/local/gitpath make sudo make install </code></pre><p>αυτό θα εγκαταστήσει το δυαδικό <code>git</code> σε <code>/usr/local/bin/gitpath/bin/git</code> - έτσι δεν χρειάζεται να πληκτρολογείτε ότι κάθε φορά, πρέπει να προσθέσετε στον <code>$path</code> προσθέτοντας την ακόλουθη γραμμή στον <code>~/.profile</code>:</p><pre><code>export path="${path}:/usr/local/bin/gitpath/bin/" </code></pre><p>αν δεν έχετε πρόσβαση στο sudo, μπορείτε να χρησιμοποιήσετε το <code>--prefix=/users/myusername/bin</code> και να εγκαταστήσετε στον οικείο κατάλογό σας. θυμηθείτε να προσθέσετε το <code>~/bin/</code> στο <code>$path</code></p><p>η δέσμη ενεργειών <a href="http://www.simplicidade.org/notes/archives/2008/09/updated\_xgitupd.html">x-git-update-to-latest-version</a> αυτοματοποιεί πολλά από αυτά:</p><blockquote> <p>αυτή η δέσμη ενεργειών ενημερώνει τον τοπικό κλώνο του git repo (τοπικά στο <code>~/work/track/git</code>) και στη συνέχεια ρυθμίζει, εγκαθιστά (στο <code>/usr/local/git</code>-<code>git describe</code>) και ενημερώνει το σύμβολο <code>/usr/local/git</code>.</p> <p>με αυτόν τον τρόπο, μπορώ να έχω <code>/usr/local/git/bin</code> στο <code>path</code> μου και πάντα χρησιμοποιώ την πιο πρόσφατη έκδοση.</p> <p>η τελευταία έκδοση αυτού του σεναρίου εγκαθιστά επίσης τις σελίδες man. πρέπει να τροποποιήσετε το <code>manpath</code> για να συμπεριλάβετε τον κατάλογο <code>/usr/local/git/share/man</code>.</p> </blockquote>
<h1>git reset</h1><p>πείτε ότι κάνετε ένα τράβηγμα, συγχωνεύστε τον στον κωδικό σας, και αποφασίστε ότι δεν σας αρέσει. χρησιμοποιήστε το git-log ή το tig και βρείτε το hash όπου θέλετε να επιστρέψετε (ίσως το τελευταίο σας commit πριν από την pull/merge) αντιγράψετε το hash και κάντε:</p><pre><code># revert to a previous commit by hash: git-reset --hard &lt;hash&gt; </code></pre><p>αντί του hash, μπορείτε να χρησιμοποιήσετε <strong>head ^</strong> ως συντόμευση για την προηγούμενη δέσμευση.</p><pre><code># revert to previous commit: git-reset --hard head^ </code></pre>
<h1>πώς ρυθμίζετε ένα κοινόχρηστο αποθετήριο ομάδας;</h1><p>ο τρόπος δημιουργίας ενός <em> κανονικού </em> αποθετηρίου περιγράφεται <a href="https://stackoverflow.com/questions/315911/git-for-beginners-the-definitive-practical-guide/320140#320140">εδώ</a> - αλλά πώς δημιουργείτε ένα αποθετήριο ομάδας που όλοι μπορούν να τραβήξουν και να πιέσουν από και προς;</p><h2>χρησιμοποιώντας ένα κοινό σύστημα αρχείων nfs</h2><p>υποθέτοντας ότι η ομάδα σας έχει ήδη για παράδειγμα μια ιδιότητα μέλους κοινής ομάδας που μπορεί να χρησιμοποιηθεί.</p><pre><code>mkdir /your/share/folder/project.git cd /your/share/folder/project.git newgrp yourteamgroup # if necessary git init --bare --shared </code></pre><p>για να αρχίσετε να χρησιμοποιείτε αυτό το χώρο αποθήκευσης, το πιο εύκολο πράγμα που κάνετε είναι να ξεκινήσετε από έναν τοπικό χώρο αποθήκευσης που χρησιμοποιείτε ήδη:</p><pre><code>cd your/local/workspace/project git remote add origin /your/share/folder/project.git git push origin master </code></pre><p>άλλοι μπορούν τώρα να την κλωνοποιήσουν και να αρχίσουν να δουλεύουν:</p><pre><code>cd your/local/workspace git clone /your/share/folder/project.git </code></pre><h2>χρησιμοποιώντας ssh</h2><p>ρυθμίστε έναν λογαριασμό χρήστη στο διακομιστή προορισμού. είτε χρησιμοποιείτε έναν λογαριασμό χωρίς κωδικό πρόσβασης, έναν λογαριασμό με κωδικό πρόσβασης, είτε χρησιμοποιώντας το <code>authorized\_keys</code> εξαρτάται πραγματικά από το απαιτούμενο επίπεδο ασφάλειας. ρίξτε μια ματιά στο <a href="https://stackoverflow.com/questions/1595848/configuring-git-over-ssh">για τη ρύθμιση του git over ssh</a> για περισσότερες πληροφορίες.</p><p>εάν όλοι οι προγραμματιστές χρησιμοποιούν τον ίδιο λογαριασμό για την πρόσβαση σε αυτήν την κοινόχρηστη αποθήκη, δεν χρειάζεται να χρησιμοποιήσετε την επιλογή <code>--shared</code> όπως παραπάνω.</p><p>αφού ανοίξετε το χώρο αποθήκευσης με τον ίδιο τρόπο όπως παραπάνω, κάνετε το αρχικό push όπως αυτό:</p><pre><code>cd your/local/workspace/project git remote add origin user@server:/path/to/project.git git push origin master </code></pre><p>δείτε την ομοιότητα με τα παραπάνω; το μόνο πράγμα που μπορεί να συμβεί επιπλέον είναι η ssh να ζητάει έναν κωδικό πρόσβασης εάν ο λογαριασμός έχει κωδικό πρόσβασης. εάν λάβετε αυτήν την ερώτηση σε έναν λογαριασμό χωρίς κωδικό πρόσβασης, ο διακομιστής ssh έχει απενεργοποιήσει <code>permitemptypasswords</code>.</p><p>η κλωνοποίηση μοιάζει τώρα:</p><pre><code>cd your/local/workspace git clone user@server:/path/to/project.git </code></pre>
<p><code>git status</code> είναι ο φίλος σας, χρησιμοποιήστε το συχνά. καλό για να απαντήσετε σε ερωτήσεις όπως:</p><ul> <li>τι έκανε ακριβώς αυτή η εντολή;</li> <li>σε ποιο κλάδο είμαι;</li> <li>τι αλλαγές πρόκειται να διαπράξω, και έχω ξεχάσει τίποτα;</li> <li>ήμουν στη μέση κάτι τελευταίο που εργάστηκα σε αυτό το έργο (ημέρες, εβδομάδες ή ίσως μήνες πριν);</li> </ul><p>αντίθετα, πείτε <code>svn status</code>, <code>git status</code> τρέχει κοντά-αμέσως ακόμη και σε μεγάλα έργα. συχνά βρήκα καθησυχαστική μάθηση ενώ έμαθα να το χρησιμοποιώ συχνά, για να βεβαιωθώ ότι το πνευματικό μοντέλο μου για το τι συνέβαινε ήταν ακριβές. τώρα το χρησιμοποιώ μόνο για να θυμηθώ τι έχω αλλάξει από την τελευταία μου δέσμευση.</p><p>προφανώς, είναι πολύ πιο χρήσιμο αν το .gitignore σας είναι σωστά διαμορφωμένο.</p>
<h2>επαναλάβετε τις αλλαγές</h2><p>μόλις επεξεργαστείτε ένα αρχείο, θα πρέπει να δεσμευθείτε για τις αλλαγές σας. όταν εκτελέσετε αυτήν την εντολή, θα ζητήσετε ένα μήνυμα δέσμευσης - το οποίο είναι απλά ένα απλό κομμάτι κειμένου που λέει σε όλους τι αλλάξατε.</p><pre><code>$ git commit source/main.c </code></pre><p>θα δεσμεύσει το αρχείο main.c στον κατάλογο ./source/</p><pre><code>$ git commit -a # the -a flag pulls in all modified files </code></pre><p>θα δεσμεύσει όλα τα αλλαγμένα αρχεία (αλλά όχι νέα αρχεία, αυτά πρέπει να προστεθούν στο ευρετήριο με git-add). αν θέλετε να δεσμεύσετε μόνο συγκεκριμένα αρχεία τότε θα πρέπει να τα βάλετε πρώτα με git-add και κατόπιν να δεσμευτείτε χωρίς τη σημαία -a.</p><p>η δέσμευση μόνο των αλλαγών του τοπικού αποθετηρίου σας, αν και όχι των απομακρυσμένων αποθετηρίων. αν θέλετε να στείλετε τις δεσμεύσεις στο απομακρυσμένο αποθετήριο τότε θα χρειαστεί να κάνετε ένα push.</p><pre><code>$ git push &lt;remote&gt; &lt;branch&gt; # push new commits to the &lt;branch&gt; on the &lt;remote&gt; repository </code></pre><p>για κάποιον που προέρχεται από το cvs ή το svn, αυτή είναι μια αλλαγή από τότε που η δέσμευση στο κεντρικό αποθετήριο απαιτεί δύο βήματα.</p>
<h1>πώς φτιάχνεις υποκαταστήματα;</h1><p>ο προεπιλεγμένος κλάδος σε ένα αποθετήριο git ονομάζεται <code>master</code>.</p><p>για να δημιουργήσετε μια νέα χρήση υποκαταστήματος</p><pre><code>git branch &lt;branch-name&gt; </code></pre><p>για να δείτε μια λίστα όλων των κλάδων στον τρέχοντα τύπο αποθετηρίου</p><pre><code>git branch </code></pre><p>εάν θέλετε να μεταβείτε σε άλλο υποκατάστημα που μπορείτε να χρησιμοποιήσετε</p><pre><code>git checkout &lt;branch-name&gt; </code></pre><p>για να δημιουργήσετε ένα νέο υποκατάστημα και να μεταβείτε σε αυτό σε ένα βήμα</p><pre><code>git checkout -b &lt;branch-name&gt; </code></pre><p>για να διαγράψετε ένα υποκατάστημα, χρησιμοποιήστε το</p><pre><code>git branch -d &lt;branch-name&gt; </code></pre><p>για να δημιουργήσετε ένα υποκατάστημα με τις αλλαγές από τον τρέχοντα κλάδο, κάντε το</p><pre><code>git stash git stash branch &lt;branch-name&gt; </code></pre>
<h2>λήψη του τελευταίου κώδικα</h2><pre><code>$ git pull &lt;remote&gt; &lt;branch&gt; # fetches the code and merges it into # your working directory $ git fetch &lt;remote&gt; &lt;branch&gt; # fetches the code but does not merge # it into your working directory $ git pull --tag &lt;remote&gt; &lt;branch&gt; # same as above but fetch tags as well $ git fetch --tag &lt;remote&gt; &lt;branch&gt; # you get the idea </code></pre><p>αυτό καλύπτει σχεδόν κάθε περίπτωση για να πάρει το τελευταίο αντίγραφο του κώδικα από το απομακρυσμένο αποθετήριο.</p>
<p>το δωρεάν βιβλίο <a href="http://progit.org">pro git</a> είναι σίγουρα το αγαπημένο μου, ειδικά για αρχάριους.</p>
<p> <a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/">git magic</a> είναι το μόνο που θα χρειαστείτε ποτέ. εγγυημένη ή τα χρήματά σας πίσω!</p>
<p>έχω επίσης βρει <a href="http://peepcode.com/products/git-internals-pdf">git internals</a> να είναι πολύ χρήσιμη. είναι γραμμένο από τον scott chacon (συγγραφέας του pro git, και συντηρητής του βιβλίου git community book). αυτό που μου αρέσει στο git internals είναι <a href="http://blog.jordanterrell.com/post/favor-concepts-over-commands.aspx">επικεντρώνεται στις έννοιες πρώτα και στη συνέχεια στις εντολές</a> , και δεδομένου ότι είναι ~ 100 μικρές σελίδες είναι γρήγορα εύπεπτο.</p>
<h1>πώς συγχωνεύετε τα υποκαταστήματα;</h1><p>αν θέλετε να συγχωνεύσετε ένα υποκατάστημα (π.χ. <code>master</code> με <code>release</code>), βεβαιωθείτε ότι το τρέχον υποκατάστημά σας είναι το υποκατάστημα στο οποίο θέλετε να συγχωνεύσετε (χρησιμοποιήστε <code>git branch</code> ή <code>git status</code> για να δείτε το τρέχον υποκατάστημά σας).</p><p>στη συνέχεια, χρησιμοποιήστε</p><pre><code>git merge master </code></pre><p>(όπου <code>master</code> είναι το όνομα του υποκαταστήματος που θέλετε να συγχωνεύσετε με τον τρέχοντα κλάδο).</p><p>εάν υπάρχουν συγκρούσεις, μπορείτε να τις χρησιμοποιήσετε</p><pre><code>git diff </code></pre><p>για να δείτε τις εκκρεμείς διενέξεις που πρέπει να επιλύσετε.</p>
<h1>πώς βλέπετε το ιστορικό των αναθεωρήσεων ενός αρχείου;</h1><pre><code>git log -- filename</code></pre>
<h1>πώς να παρακολουθείτε απομακρυσμένα υποκαταστήματα</h1><p>υποθέτοντας ότι υπάρχει ένα απομακρυσμένο αποθετήριο που έχετε κλωνοποιήσει από το τοπικό αποθετήριο σας και επίσης υποθέτοντας ότι υπάρχει ένα υποκατάστημα με το όνομα 'some\_branch' σε αυτό το απομακρυσμένο αποθετήριο, εδώ μπορείτε να το εντοπίσετε τοπικά:</p><pre><code># list remote branches git branch -r # start tracking one remote branch git branch --track some\_branch origin/some\_branch # change to the branch locally git checkout some\_branch # make changes and commit them locally .... # push your changes to the remote repository: git push </code></pre>
<p>ένα πραγματικό χαρτί για την κατανόηση του πώς λειτουργεί το git είναι <a href="http://tom.preston-werner.com/2009/05/19/the-git-parable.html">the git parable</a> . πολύ συνιστάται!</p>
<h1>πώς συγκρίνετε δύο αναθεωρήσεις ενός αρχείου ή του τρέχοντος αρχείου σας και μιας προηγούμενης αναθεώρησης;</h1><p>η παράμετρος σύγκρισης είναι <code>git diff</code>.</p><p>για να συγκρίνετε 2 αναθεωρήσεις ενός αρχείου:</p><pre><code>$ git diff &lt;commit1&gt; &lt;commit2&gt; &lt;file\_name&gt; </code></pre><p>αυτό διαφέρει από τη δέσμευση1 κατά της δέσμευσης2. εάν αλλάξετε τη σειρά, τότε τα αρχεία διαφέρουν από την άλλη, πράγμα που μπορεί να μην είναι αυτό που περιμένετε ...</p><p>για να συγκρίνετε το τρέχον σταδιακό αρχείο με το αποθετήριο:</p><pre><code>$ git diff --staged &lt;file\_name&gt; </code></pre><p>για να συγκρίνετε το τρέχον μη αποθηκευμένο αρχείο με το αποθετήριο:</p><pre><code>$ git diff &lt;file\_name&gt; </code></pre>
<p>γιατί ακόμα ένα άλλο πώς; υπάρχουν πραγματικά καλά στο διαδίκτυο, όπως ο <a href="http://www.sourcemage.org/git\_guide">git οδηγός</a> το οποίο είναι τέλειο για να ξεκινήσετε. έχει καλές συνδέσεις, συμπεριλαμβανομένου του <a href="http://book.git-scm.com/">git βιβλίου</a> στο οποίο μπορεί κανείς να συνεισφέρει (φιλοξενείται στο git hub) και το οποίο είναι ιδανικό για αυτό το συλλογικό έργο.</p><p>στο stackoverflow, θα προτιμούσα πραγματικά να δω τα αγαπημένα σας κόλπα!</p><p>το ορυχείο, το οποίο ανακάλυψα μόνο πρόσφατα, είναι <code>git stash</code>, εξήγησε <a href="http://book.git-scm.com/4\_stashing.html">εδώ</a> , το οποίο σας επιτρέπει να αποθηκεύσετε την τρέχουσα εργασία σας και να πάτε σε άλλο υποκατάστημα</p><p>edit: όπως την προηγούμενη ανάρτηση, αν προτιμάτε πραγματικά stackoverlow μορφή με τις θέσεις ως wiki εγώ θα διαγράψει αυτή την απάντηση</p>
<h1>κονσόλα ui - tig</h1><h2>εγκατάσταση:</h2><pre><code>apt-get install tig </code></pre><h2>χρήση</h2><p>ενώ βρίσκεστε μέσα σε ένα git repo, πληκτρολογήστε 'tig', για να δείτε ένα διαδραστικό αρχείο καταγραφής, πατήστε 'enter' σε οποιοδήποτε αρχείο καταγραφής για να δείτε περισσότερες πληροφορίες γι 'αυτό. <b>h</b> για βοήθεια, η οποία απαριθμεί τις βασικές λειτουργίες.</p><h2>ασήμαντα πράγματα</h2><p>το "tig" είναι "git" προς τα πίσω.</p>
<h2>πώς μπορώ να διαγράψω ένα υποκατάστημα σε ένα απομακρυσμένο αποθετήριο;</h2><p>πραγματοποιήστε ένα πάτημα στο τηλεχειριστήριό σας χρησιμοποιώντας το <code>:</code> πριν από το όνομα του υποκαταστήματος</p><pre><code>git push origin :mybranchname </code></pre><p>είναι <code>origin</code> το όνομα του απομακρυσμένου σας και <code>mybranchname</code> το όνομα του υποκαταστήματος που πρόκειται να διαγραφεί</p><p> <a href="http://help.github.com/remotes/">http://help.github.com/remotes/</a> </p>
<h1>πώς μπορώ να δημιουργήσω ένα υποκατάστημα σε απομακρυσμένο αποθετήριο;</h1><p>υποθέτοντας ότι έχετε κλωνοποιήσει το απομακρυσμένο αποθετήριό σας από κάποια απομακρυσμένη αποθήκη.</p><pre><code># create a new branch locally git branch name\_of\_branch git checkout name\_of\_branch # edit/add/remove files # ... # commit your changes locally git add filename git commit -m message # push changes and new branch to remote repository: git push origin name\_of\_branch:name\_of\_branch </code></pre>
<p>ξεκίνησα με τον επίσημο <a href="http://www.kernel.org/pub/software/scm/git/docs/gittutorial.html">git tutorial</a> . νομίζω ότι είναι αρκετά πρακτικό για τους αρχάριους (ήμουν και εξακολουθώ να είμαι αρχάριος, με τον ορισμό σας! χρειάζομαι μόλις makefiles, έχω παίξει μόνο με το apache subversion κλπ.).</p>
<h1>έλεγχος κωδικού</h1><p>πρώτα πηγαίνετε σε ένα άδειο dir, χρησιμοποιήστε το "git init" για να το κάνετε αποθετήριο, και στη συνέχεια κλωνοποιήστε το απομακρυσμένο repo σε δική σας.</p><pre><code>git clone user@host.com:/dir/to/repo </code></pre><p>οπουδήποτε αρχικά κλωνοποιήσατε είναι από όπου το "git pull" θα τραβήξει από προεπιλογή.</p>
<p><strong>πιέστε και τραβήξτε τις αλλαγές</strong></p><p>με απλοποιημένο τρόπο, απλώς κάντε <code>git push</code> και <code>git pull</code>. οι αλλαγές συγχωνεύονται και αν υπάρχει σύγκρουση git θα σας ενημερώσει και μπορείτε να το επιλύσετε με μη αυτόματο τρόπο.</p><p>όταν πατάτε για πρώτη φορά σε απομακρυσμένο αποθετήριο, πρέπει να κάνετε <code>git push origin master</code> (master είναι ο κύριος κλάδος). από εκεί και πέρα ​​κάνετε ακριβώς το <code>git push</code>.</p><p>πιέστε ετικέτες με <code>git push --tags</code>.</p>
<p>gity: <a href="http://macendeavor.com/gity">http://macendeavor.com/gity</a> </p>
<p>wrt καλή guis/frontends, μπορείτε επίσης να θελήσετε να ελέγξετε έξω <a href="http://sourceforge.net/projects/qgit">qgit</a> το οποίο είναι ένα cross-platform (linux/win32) αποθετήριο θεατή για git και μπορεί να χρησιμοποιηθεί επίσης ως υψηλό επίπεδο frontend για το πιο κοινό git λειτουργίες, στην πραγματικότητα μπορεί εύκολα να ενισχυθεί με τις αποκαλούμενες "προσαρμοσμένες ενέργειες", έτσι ώστε οι χρήστες να μπορούν να παρέχουν προσαρμοσμένες ενέργειες.</p>
<h2>τι είναι η ανακύκλωση;</h2><p>αλλαγή εξήγησης από το βιβλίο <em> <a href="https://rads.stackoverflow.com/amzn/click/com/1934356727">pragmatic guide to git - travis swicegood</a> </em></p><blockquote> <p>κεφάλαιο ιιι</p> <p>16. επαναπροσδιορισμός ιστορικού με επανέκδοση</p> <p>η δέσμευση αναδιάρθρωσης είναι η μόνη έννοια στο git που δεν έχει αντίστοιχο στοιχείο στον παραδοσιακό κόσμο ελέγχου εκδόσεων. χρησιμοποιώντας το git rebase, μπορείτε να ξαναγράψετε το ιστορικό ενός αποθετηρίου με διάφορους τρόπους. είναι μία από τις πιο ισχυρές εντολές στο git, γεγονός που την καθιστά από τις πιο επικίνδυνες.</p> <p><strong> <code>rebase</code> παίρνει μια σειρά δεσμεύσεων (κανονικά ένα υποκατάστημα) και τις επαναλαμβάνει πάνω από άλλο commit (συνήθως το τελευταίο commit σε άλλο υποκατάστημα). ο γονέας δεσμεύει τις αλλαγές, έτσι ώστε να επανυπολογίζονται όλα τα αναγνωριστικά δέσμευσης. αυτό μπορεί να προκαλέσει προβλήματα σε άλλους προγραμματιστές που έχουν τον κωδικό σας, επειδή τα αναγνωριστικά δεν αντιστοιχούν. </strong></p> <p>υπάρχει ένας απλός κανόνας με git rebase: χρησιμοποιήστε το όσο θέλετε στις τοπικές δεσμεύσεις. αφού έχετε μοιραστεί τις αλλαγές με έναν άλλο προγραμματιστή, ο πονοκέφαλος γενικά δεν αξίζει τον κόπο.</p> </blockquote>
<p><strong> πόρος </strong>: σίγουρα check out <a href="http://www.gitcasts.com/">gitcasts του scott chacon</a> , <strong> <a href="http://www.gitcasts.com/posts/railsconf-git-talk">ειδικά η ομιλία του railsconf</a> </strong> ).</p><p> <a href="https://github.com/">github</a> είναι φοβερό και έχει επίσης μερικούς <a href="http://github.com/guides/home">χρήσιμοι οδηγοί</a> .</p>
<p>σοβαρά προσθέστε τον σύνδεσμο που εμφανίζεται στην <a href="https://stackoverflow.com/questions/1482824/setup-git-server-with-msysgit-on-windows/1503986#1503986">απάντηση του tim</a> στη στήλη overflow stack <a href="https://stackoverflow.com/questions/1482824/setup-git-server-with-msysgit-on-windows">εγκατάσταση git server με msysgit σε windows</a> .</p><p>είναι άψογα μου είπε πώς να ρυθμίσετε git στα windows με <a href="http://code.google.com/p/msysgit/">msysgit</a> , και είναι ένα απίστευτα λεπτομερές άρθρο.</p>
<p>βρήκα <a href="http://www.eecs.harvard.edu/~cduan/technical/git/">αυτό το post</a> να είναι πολύ χρήσιμο για να με ξεκινήσω. πρέπει ακόμα να διαβάσω το βιβλίο και άλλους πόρους, αλλά η θέση ήταν χρήσιμη, όπως λέει ο τίτλος, "κατανόηση git εννοιολογικά". προτείνω επίσης να πάρετε το μάθημα git &amp; github που προσφέρεται στο <a href="http://www.rubylearning.org">rubylearning</a> .</p>
<p>ένα ακόμα στοιχείο που νομίζω ότι θα έπρεπε να είναι σε αυτόν τον κατάλογο, ίσως πολύ χρήσιμο για αρχάριους:</p><h1>μην πανικοβληθείτε</h1><p>τι γίνεται αν έκανα κάποιες δεσμεύσεις και έπειτα έκανα κάτι τρομακτικό, όπως ίσως μια αναβολή, και τώρα κάτι - ή ακόμα και όλα - φαίνεται να χαθεί; (το rebase φαίνεται να είναι αυτό που παίρνει τους περισσότερους ανθρώπους για πρώτη φορά, οπότε επικεντρωθώ σε αυτό. ενώ το <code>git rebase --abort</code> βοηθάει πολύ, μερικές φορές θα διαπιστώσετε ότι έχετε ενοχλήσει μια επεξεργασία κατά τη διάρκεια μιας διαδραστικής εκδήλωσης, για παράδειγμα, και αφήστε το να τελειώσετε το rebase και τώρα θέλετε να πάρετε τα παλιά σας πράγματα πίσω και στη συνέχεια υπάρχουν πράγματα όπως <code>filter-branch</code>...)</p><p>μια βασική αρχή git είναι ότι ποτέ δεν διαγράφει πράγματι τίποτα που έχετε διαπράξει. ("ποτέ, ποτέ;" "τι, <em> ποτέ </em>;" "καλά, σχεδόν ποτέ!") αν δεν έχετε τρέξει <code>git gc</code>, <em> είναι ακόμα εκεί </em>. μπορεί να χρειαστεί κάποια βήματα για να βρούμε την προηγούμενη δουλειά σας, αλλά αν κάνατε κάποια επιτυχή <code>git commit</code>s νωρίτερα, τότε, για παράδειγμα, ακόμη και η φαινομενικά καταστρεπτική σειρά δεσμεύσεών σας από ένα τραγικό σφάλμα rebase είναι ακόμα εκεί, συνήθως για τουλάχιστον ένα μήνα (τεχνικά, μέχρι να λήξουν τα "reflogs").</p><p>είναι σημαντικό να έχετε κατά νου ότι κάθε όνομα υποκαταστήματος επισημαίνει - ή δείχνει σε - ένα "commit-id". αυτοί είναι οι αστείες αριθμοί όπως το <code>7cc5272</code>. πολλά από τα πράγματα που κάνετε, όπως η προσθήκη νέας δέσμευσης σε ένα υποκατάστημα, κάνουν το όνομα του υποκαταστήματος να οδηγεί σε ένα νέο, διαφορετικό αναγνωριστικό commit-id. κάθε αναγνωριστικό δέσμευσης έχει έναν σύνδεσμο που δείχνει πίσω σε κάποια προηγούμενη ταυτότητα δέσμευσης (commit-id), και αυτό είναι το πράγμα που κάνει ένα "υποκατάστημα" γεμάτο δεσμεύσεις.</p><p>οι συζητήσεις για την επανάληψη της εισόδου ανασυντάσσουν την ιστορία και εντολές όπως το <code>git filter-branch</code> επίσης "ξαναγράφουν το ιστορικό", αλλά δεν το καταστρέφουν καταστρέφοντας το προηγούμενο ιστορικό, αλλά προσθέτοντας νέο ιστορικό. μόλις ολοκληρωθεί η νέα ιστορία, το git θα "μετακινήσει τις ετικέτες γύρω" έτσι ώστε να είναι <em> μοιάζει με </em> το ιστορικό έχει αλλάξει. εάν βρίσκεστε στο υποκατάστημα <code>fix-nasty-bug</code> και κάνετε <code>git rebase</code> και καταφέρετε να καταστρέψετε τα πράγματα, η ετικέτα <code>fix-nasty-bug</code> αναφέρεται τώρα στο ναυάγιο, αλλά οι αρχικές εκδόσεις παραμένουν εκεί. ειδικά το rebase δημιουργεί μια προσωρινή ετικέτα <code>orig\_head</code> (που δεν κινείται, χωρίς διακλάδωση) που σας επιτρέπει να τα βρείτε. η εντολή <code>filter-branch</code> αποθηκεύει επίσης όλα τα αρχικά ονόματα. σε ορισμένες περιπτώσεις, ενδέχεται να μην υπάρχει προφανές όνομα, αλλά οι δεσμεύσεις μπορούν πάντοτε να βρεθούν. εάν είναι απαραίτητο, βρείτε τον εαυτό σας έναν "git guru" και εξηγήστε τι κάνατε και οδήγησε στα συντρίμμια.</p><p>(η εντολή <code>git reflog show</code> μπορεί επίσης να βοηθήσει στην εύρεση αναγνωριστικών commit-commit.)</p><p>εάν έχετε βρει αυτό που πιστεύετε ότι είναι κάποιο ή όλο το προηγούμενο έργο σας, δοκιμάστε:</p><pre><code>git log &lt;commit-id&gt; # orig\_head after a bad rebase, for instance git show &lt;commit-id&gt; # or some long sha1 value you can still see in a window </code></pre><p>αν φαίνεται σωστό ή χρήσιμο, βάλτε το όνομα σε αυτό:</p><pre><code>git branch recover-my-stuff orig\_head </code></pre><p>και όλα είναι και πάλι πίσω! στην πραγματικότητα, τώρα τόσο η κακή εκκαθάρισή σας όσο και η πρωτότυπη εργασία σας βρίσκονται στο git repo "για πάντα" (ή τουλάχιστον, μέχρι να διαγράψετε τα ονόματα κλάδων <em> και </em> αφήστε μερικούς μήνες να πάνε , και στη συνέχεια συλλέγονται τα σκουπίδια). μπορείτε να βάλετε όσα ονόματα σε όσες ανακτηθεί δεσμεύσεις όπως θέλετε. (τα ονόματα υποκαταστημάτων είναι ουσιαστικά δωρεάν, εκτός από το γεγονός ότι τα δεδομένα <code>git branch</code> είναι ακατάλληλα και, φυσικά, διατηρούνται δεσμεύσεις από τη συλλογή απορριμμάτων. μπορείτε επίσης να τοποθετήσετε ετικέτες σε συγκεκριμένα αναγνωριστικά δέσμευσης εάν προτιμάτε αυτά.)</p>
<p>πολύ καλή θέση για τη συγχώνευση με συγκρούσεις - <a href="http://www.gitguys.com/topics/merging-with-a-conflict-conflicts-and-resolutions/">gitguys: συγχώνευση με σύγκρουση - συγκρούσεις και ψηφίσματα</a> </p><p>το blog είναι πραγματικά μεγάλο - επεξηγηματικά, καθαρά παραδείγματα και κατανοητό. σίγουρα αξίζει τον έλεγχο.</p>