Skip to content

Commit ca04f97

Browse files
committed
update 4 more files of 07-git-tools module
1 parent c017bb8 commit ca04f97

File tree

5 files changed

+186
-153
lines changed

5 files changed

+186
-153
lines changed

book/07-git-tools/sections/debugging.asc

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,32 @@
99
Αν εντοπίζουμε ένα σφάλμα στον κώδικά μας και θέλουμε να μάθουμε πότε εισήχθη και γιατί, η επισημείωση (annotation) του αρχείου είναι συχνά το καλύτερο εργαλείο μας.
1010
Μας δείχνει ποια ήταν η τελευταία υποβολή που τροποποποίησε κάθε γραμμή οποιουδήποτε αρχείου.
1111
Έτσι, εάν δούμε ότι μια μέθοδος στον κώδικά μας έχει σφάλματα, μπορούμε να επισημειώσουμε το αρχείο με `git blame` για να δούμε πότε άλλαξε τελευταία φορά κάθε γραμμή της μεθόδου και από ποιον.
12-
Αυτό το παράδειγμα χρησιμοποιεί την επιλογή `-L` για να περιορίσει την έξοδο στις γραμμές 12 έως 22:
12+
13+
Το παρακάτω παράδειγμα χρησιμοποιεί την `git blame` για να καθορίσει ποια υποβολή και ποιος υποβολέας ήταν υπεύθυνος για τις γραμμές στο πάνω-επίπεδο του Linux kernel `Makefile` και, επιπλέον, χρησιμοποιεί την επιλογή `-L` για να περιορίσει την έξοδο στις γραμμές 69 έως 82 αυτού του αρχείου:
1314

1415
[source,console]
1516
----
16-
$ git blame -L 12,22 simplegit.rb
17-
^4832fe2 (Scott Chacon 2008-03-15 10:31:28 -0700 12) def show(tree = 'master')
18-
^4832fe2 (Scott Chacon 2008-03-15 10:31:28 -0700 13) command("git show #{tree}")
19-
^4832fe2 (Scott Chacon 2008-03-15 10:31:28 -0700 14) end
20-
^4832fe2 (Scott Chacon 2008-03-15 10:31:28 -0700 15)
21-
9f6560e4 (Scott Chacon 2008-03-17 21:52:20 -0700 16) def log(tree = 'master')
22-
79eaf55d (Scott Chacon 2008-04-06 10:15:08 -0700 17) command("git log #{tree}")
23-
9f6560e4 (Scott Chacon 2008-03-17 21:52:20 -0700 18) end
24-
9f6560e4 (Scott Chacon 2008-03-17 21:52:20 -0700 19)
25-
42cf2861 (Magnus Chacon 2008-04-13 10:45:01 -0700 20) def blame(path)
26-
42cf2861 (Magnus Chacon 2008-04-13 10:45:01 -0700 21) command("git blame #{path}")
27-
42cf2861 (Magnus Chacon 2008-04-13 10:45:01 -0700 22) end
17+
$ git blame -L 69,82 Makefile
18+
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 69) ifeq ("$(origin V)", "command line")
19+
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 70) KBUILD_VERBOSE = $(V)
20+
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71) endif
21+
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 72) ifndef KBUILD_VERBOSE
22+
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 73) KBUILD_VERBOSE = 0
23+
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 74) endif
24+
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 75)
25+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 76) ifeq ($(KBUILD_VERBOSE),1)
26+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 77) quiet =
27+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 78) Q =
28+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 79) else
29+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 80) quiet=quiet_
30+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 81) Q = @
31+
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 82) endif
2832
----
2933

3034
Παρατηρούμε ότι το πρώτο πεδίο είναι ο μερικός αριθμός SHA-1 της υποβολής που τροποποίησε τελευταία αυτήν τη γραμμή.
3135
Τα επόμενα δύο πεδία είναι τιμές που εξάχθηκαν από αυτήν την υποβολή —το όνομα συγγραφέα και η ημερομηνία επεξεργασίας αυτής της υποβολής— για να μπορούμε εύκολα να δούμε ποιος τροποποίησε αυτήν τη γραμμή και πότε.
3236
Ακολουθούν ο αριθμός γραμμής και το περιεχόμενο του αρχείου.
33-
Ο αριθμός SHA-1 `^4832fe2` υποδηλώνει ότι οι γραμμές με αυτόν τον αριθμό ήταν στην αρχική υποβολή αυτού του αρχείου.
34-
Αυτή είναι η υποβολή με την οποία το αρχείο αυτό προστέθηκε για πρώτη φορά σε αυτό το έργο και οι γραμμές αυτές δεν έχουν αλλάξει από τότε.
37+
Επισής σημειώνουμε ότι `^1da177e4c3f4` γραμμές υποβολής, όπου το `^` πρόθεμα υποδηλώνει ότι οι γραμμές εισήχθησαν στην πρώτη υποβολή του αποθετηρίου και δεν έχουν αλλάξει από τότε.
3538
Αυτό δημιουργεί μία μικρή σύγχυση, καθώς μέχρι στιγμής έχουμε δει τουλάχιστον τρεις διαφορετικούς τρόπους με τους οποίους το Git χρησιμοποιεί το `^` για να τροποποιήσει τον αριθμό SHA-1 μίας υποβολής, αλλά εδώ σημαίνει αυτό το πράγμα.
3639

3740
Ένα άλλο πολύ ωραίο χαρακτηριστικό για το Git είναι ότι δεν παρακολουθεί απόλυτα το όνομα του αρχείου.
@@ -69,13 +72,13 @@ ad11ac80 GITPackUpload.m (Scott 2009-03-24 150)
6972

7073
Η επισημείωση ενός αρχείου βοηθάει αν ξέρουμε ήδη πού βρίσκεται το πρόβλημα.
7174
Αν δεν ξέρουμε τι είναι χαλασμένο και υπήρξαν δεκάδες ή εκατοντάδες υποβολές από την τελευταία κατάσταση όπου γνωρίζουμε ότι ο κώδικας λειτουργούσε, πιθανότατα θα στραφούμε προς την `git bisect` για βοήθεια.
72-
Η εντολή `bisect` (διχοτόμηση) κάνει μια δυαδική αναζήτηση μέσα στο ιστορικό των υποβολών μας για να μας βοηθήσει να εντοπίσουμε το συντομότερο δυνατό ποια είναι υποβολή εισήγαγε ένα πρόβλημα.
75+
Η εντολή `bisect` (διχοτόμηση) κάνει μια δυαδική αναζήτηση μέσα στο ιστορικό των υποβολών μας για να μας βοηθήσει να εντοπίσουμε το συντομότερο δυνατό ποια υποβολή εισήγαγε ένα πρόβλημα.
7376

7477
Ας υποθέσουμε ότι μόλις ωθήσαμε μια έκδοση του κώδικά μας στην παραγωγή, παίρνουμε αναφορές σφαλμάτων σχετικά με κάτι που δεν συνέβαινε στο περιβάλλον ανάπτυξης και δεν μπορούμε να φανταστούμε γιατί ο κώδικας το κάνει αυτό.
7578
Πηγαίνουμε πίσω στον κώδικά μας και αποδεικνύεται ότι μπορούμε να αναπαραγάγουμε το πρόβλημα, αλλά δεν μπορούμε να καταλάβουμε τι το δημιουργεί.
7679
Μπορούμε να _διχοτομήσουμε_ τον κώδικα για να το ανακαλύψουμε.
7780
Αρχικά τρέχουμε την `git bisect start` για να ξεκινήσει η διαδικασία της διοχοτόμησης και στη συνέχεια την `git bisect bad` για να πούμε στο σύστημα ότι η τρέχουσα υποβολή που χρησιμοποιούμε είναι χαλασμένη.
78-
Στη συνέχεια, πρέπει να πούμε στην `bisect` ποια ήταν η τελευταία γνωστή καλή κατάσταση, χρησιμοποιώντας την `git bisect good [good_commit]`:
81+
Στη συνέχεια, πρέπει να πούμε στην `bisect` ποια ήταν η τελευταία γνωστή καλή κατάσταση, χρησιμοποιώντας την `git bisect good <good_commit>`:
7982

8083
[source,console]
8184
----
@@ -89,7 +92,7 @@ Bisecting: 6 revisions left to test after this
8992
Το Git κατάλαβε ότι περίπου 12 υποβολές ήρθαν μεταξύ της υποβολής που σημειώσαμε ως της τελευταίας καλής υποβολής (v1.0) και της τρέχουσας κακής έκδοσης, και μετέβη (checkout) τη μεσαία για εμάς.
9093
Σε αυτό το σημείο, μπορούμε να εκτελέσουμε κάποια δοκιμασία για να διαπιστώσουμε εάν υπάρχει το πρόβλημα σε αυτήν την υποβολή.
9194
Εάν υπάρχει, τότε εισήχθη κάποια στιγμή πριν από αυτήν τη μεσαία υποβολή· αν δεν υπάρχει, τότε το πρόβλημα εισήχθη κάποια στιγμή μετά τη μεσαία υποβολή.
92-
Αποδεικνύεται ότι το πρόβλημα δεν υπάρχει εδώ και το λέμε αυτό στο Git ότι πληκτρολογώντας `git bisect good` και συνεχίζουμε την αναζήτηση του σφάλματος:
95+
Αποδεικνύεται ότι το πρόβλημα δεν υπάρχει εδώ και το λέμε αυτό στο Git πληκτρολογώντας `git bisect good` και συνεχίζουμε την αναζήτηση του σφάλματος:
9396

9497
[source,console]
9598
----
@@ -108,7 +111,7 @@ Bisecting: 1 revisions left to test after this
108111
[f71ce38690acf49c1f3c9bea38e09d82a5ce6014] drop exceptions table
109112
----
110113

111-
Αυτή η υποβολή είναι μια χαρά, και τώρα η Git διαθέτει όλες τις πληροφορίες που χρειάζεται για να προσδιορίσει πού εισήχθη το πρόβλημα.
114+
Αυτή η υποβολή είναι μια χαρά, και τώρα το Git διαθέτει όλες τις πληροφορίες που χρειάζεται για να προσδιορίσει πού εισήχθη το πρόβλημα.
112115
Μας λέει τον αριθμό SHA-1 της πρώτης κακής υποβολής και μας δείχνει μερικές από τις πληροφορίες της υποβολής και ποια αρχεία τροποποιήθηκαν σε αυτήν την υποβολή, ώστε να μπορούμε να καταλάβουμε τι ήταν αυτό που μπορεί να έχει εισάγει αυτό το σφάλμα:
113116

114117
[source,console]

book/07-git-tools/sections/rerere.asc

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[[rch_rerere]]
1+
[[r_ref_rerere]]
22
=== Rerere
33

44
Η λειτουργικότητα `git rerere` είναι ένα λίγο κρυμμένο χαρακτηριστικό.
@@ -22,12 +22,12 @@
2222
$ git config --global rerere.enabled true
2323
----
2424

25-
Μπορούμε επίσης να την ενεργοποιήσουμε δημιουργώντας έναν κατάλογο `.git/rr-cache` σε ένα συγκεκριμένο αποθετήριο, αλλά η ρύθμιση της παραμέτρου με την `config` είναι σαφέστερη και μπορεί να γίνει καθολικά.
25+
Μπορούμε επίσης να την ενεργοποιήσουμε δημιουργώντας έναν κατάλογο `.git/rr-cache` σε ένα συγκεκριμένο αποθετήριο, αλλά η ρύθμιση της παραμέτρου με την config είναι σαφέστερη και μπορεί να γίνει καθολικά.
2626

2727
Τώρα ας δούμε ένα απλό παράδειγμα, παρόμοιο με το προηγούμενο.
2828
Ας υποθέσουμε ότι έχουμε ένα αρχείο που μοιάζει με αυτό:
2929

30-
[source,console]
30+
[source,ruby]
3131
----
3232
#! /usr/bin/env ruby
3333
@@ -38,7 +38,8 @@ end
3838

3939
Σε έναν κλάδο αλλάζουμε τη λέξη "`hello`" σε "`hola`", στη συνέχεια σε έναν άλλο κλάδο αλλάζουμε το "`world`" σε "`mundo`", ακριβώς όπως πριν.
4040

41-
image::images/rerere1.png[]
41+
.Δύο κλάδοι αλλάζουν το ίδιο μέρος ίδιου αρχείου διαφορετικά
42+
image::images/rerere1.png[Δύο κλάδοι αλλάζουν το ίδιο μέρος ίδιου αρχείου διαφορετικά]
4243

4344
Όταν συγχωνεύσουμε τους δύο κλάδους, θα πάρουμε σύγκρουση συγχώνευσης:
4445

@@ -109,7 +110,7 @@ $ git ls-files -u
109110
100644 54336ba847c3758ab604876419607e9443848474 3 hello.rb
110111
----
111112

112-
Τώρα μπορούμε να επιλύσουμε τη σύγκρουση (ας πούμε ότι αποφασίζουμε να είναι `puts 'hola mundo'`) και μπορούμε να εκτελέσουμε ξανά την εντολή `rerere diff` για να δούμε τι θα θυμάται η `rerere`:
113+
Τώρα μπορούμε να επιλύσουμε τη σύγκρουση (ας πούμε ότι αποφασίζουμε να είναι `puts 'hola mundo'`) και μπορούμε να εκτελέσουμε ξανά την εντολή `git rerere diff` για να δούμε τι θα θυμάται η `rerere`:
113114

114115
[source,console]
115116
----
@@ -141,12 +142,13 @@ Recorded resolution for 'hello.rb'.
141142
[master 68e16e5] Merge branch 'i18n'
142143
----
143144

144-
Βλέπουμε ότι αναφέρει `Recorded resolution for FILE`.
145+
Βλέπουμε ότι αναφέρει "Recorded resolution for FILE".
145146

146-
image::images/rerere2.png[]
147+
.Καταγραφή επίλυσης για το FILE
148+
image::images/rerere2.png[Καταγραφή επίλυσης για το FILE]
147149

148150
Τώρα ας αναιρέσουμε αυτήν τη συγχώνευση και στη συνέχεια ας αλλάξουμε τη βάση του θεματικού κλάδου στον κύριο κλάδο.
149-
Μπορούμε να επαναφέρουμε τον κλάδο μας χρησιμοποιώντας την `reset` όπως είδαμε στην ενότητα <<r_git_reset>>.
151+
Μπορούμε να επαναφέρουμε τον κλάδο μας χρησιμοποιώντας την `git reset` όπως είδαμε στην ενότητα <<ch07-git-tools#r_git_reset>>.
150152

151153
[source,console]
152154
----
@@ -177,9 +179,8 @@ Patch failed at 0001 i18n one word
177179
Τώρα, πήραμε την ίδια σύγκρουση συγχώνευσης όπως αναμέναμε, αλλά επιπλέον υπάρχει η γραμμή `Resolved FILE using previous resolution`.
178180
Αν εξετάσουμε το αρχείο, θα δούμε ότι έχει ήδη επιλυθεί, δεν υπάρχουν επισημάνσεις σύγκρουσης συγχώνευσης.
179181

180-
[source,console]
182+
[source,ruby]
181183
----
182-
$ cat hello.rb
183184
#! /usr/bin/env ruby
184185
185186
def hello
@@ -206,9 +207,10 @@ index a440db6,54336ba..0000000
206207
end
207208
----
208209

209-
image::images/rerere3.png[]
210+
.Αυτόματη επίλυση σύγκγουσγη συγχώνευσης χρησιμοποιώντας προηγούμενη επίλυση
211+
image::images/rerere3.png[Αυτόματη επίλυση σύγκγουσγη συγχώνευσης χρησιμοποιώντας προηγούμενη επίλυση]
210212

211-
Μπορούμε επίσης να ξαναδημιουργήσουμε την κατάσταση σύγκρουσης του αρχείου με την εντολή `checkout`:
213+
Μπορούμε επίσης να ξαναδημιουργήσουμε την κατάσταση σύγκρουσης του αρχείου με την εντολή `git checkout`:
212214

213215
[source,console]
214216
----
@@ -225,8 +227,8 @@ def hello
225227
end
226228
----
227229

228-
Είδαμε ένα παράδειγμα αυτού στην ενότητα <<r_advanced_merging>>.
229-
Προς το παρόν, όμως, ας την ξαναεπιλύσουμε τρέχοντας την `rerere` ξανά:
230+
Είδαμε ένα παράδειγμα αυτού στην ενότητα <<ch07-git-tools#r_advanced_merging>>.
231+
Προς το παρόν, όμως, ας την ξαναεπιλύσουμε τρέχοντας την `git rerere` ξανά:
230232

231233
[source,console]
232234
----
@@ -250,5 +252,5 @@ $ git rebase --continue
250252
Applying: i18n one word
251253
----
252254

253-
Έτσι, εάν κάνουμε πολλές συγχωνεύσεις ή θέλουμε o θεματικός κλάδος μας να συμβαδίζει με τον κύριο κλάδο μας χωρίς να έχουμε πάμπολλες συγχωνεύσεις, μπορούμε είτε να κάνουμε συχνά αλλαγές βάσης, είτε να ενεργοποιήσουμε την `rerere` για να κάνουμε πιο εύκολη τη ζωή μας.
255+
Έτσι, εάν κάνουμε πολλές συγχωνεύσεις ή θέλουμε o θεματικός κλάδος μας να συμβαδίζει με τον `master` κλάδο μας χωρίς να έχουμε πάμπολλες συγχωνεύσεις, μπορούμε είτε να κάνουμε συχνά αλλαγές βάσης, είτε να ενεργοποιήσουμε την `rerere` για να κάνουμε πιο εύκολη τη ζωή μας.
254256

0 commit comments

Comments
 (0)