You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: book/07-git-tools/sections/debugging.asc
+22-19Lines changed: 22 additions & 19 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -9,29 +9,32 @@
9
9
Αν εντοπίζουμε ένα σφάλμα στον κώδικά μας και θέλουμε να μάθουμε πότε εισήχθη και γιατί, η επισημείωση (annotation) του αρχείου είναι συχνά το καλύτερο εργαλείο μας.
10
10
Μας δείχνει ποια ήταν η τελευταία υποβολή που τροποποποίησε κάθε γραμμή οποιουδήποτε αρχείου.
11
11
Έτσι, εάν δούμε ότι μια μέθοδος στον κώδικά μας έχει σφάλματα, μπορούμε να επισημειώσουμε το αρχείο με `git blame` για να δούμε πότε άλλαξε τελευταία φορά κάθε γραμμή της μεθόδου και από ποιον.
12
-
Αυτό το παράδειγμα χρησιμοποιεί την επιλογή `-L` για να περιορίσει την έξοδο στις γραμμές 12 έως 22:
12
+
13
+
Το παρακάτω παράδειγμα χρησιμοποιεί την `git blame` για να καθορίσει ποια υποβολή και ποιος υποβολέας ήταν υπεύθυνος για τις γραμμές στο πάνω-επίπεδο του Linux kernel `Makefile` και, επιπλέον, χρησιμοποιεί την επιλογή `-L` για να περιορίσει την έξοδο στις γραμμές 69 έως 82 αυτού του αρχείου:
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
28
32
----
29
33
30
34
Παρατηρούμε ότι το πρώτο πεδίο είναι ο μερικός αριθμός SHA-1 της υποβολής που τροποποίησε τελευταία αυτήν τη γραμμή.
31
35
Τα επόμενα δύο πεδία είναι τιμές που εξάχθηκαν από αυτήν την υποβολή —το όνομα συγγραφέα και η ημερομηνία επεξεργασίας αυτής της υποβολής— για να μπορούμε εύκολα να δούμε ποιος τροποποίησε αυτήν τη γραμμή και πότε.
32
36
Ακολουθούν ο αριθμός γραμμής και το περιεχόμενο του αρχείου.
33
-
Ο αριθμός SHA-1 `^4832fe2` υποδηλώνει ότι οι γραμμές με αυτόν τον αριθμό ήταν στην αρχική υποβολή αυτού του αρχείου.
34
-
Αυτή είναι η υποβολή με την οποία το αρχείο αυτό προστέθηκε για πρώτη φορά σε αυτό το έργο και οι γραμμές αυτές δεν έχουν αλλάξει από τότε.
37
+
Επισής σημειώνουμε ότι `^1da177e4c3f4` γραμμές υποβολής, όπου το `^` πρόθεμα υποδηλώνει ότι οι γραμμές εισήχθησαν στην πρώτη υποβολή του αποθετηρίου και δεν έχουν αλλάξει από τότε.
35
38
Αυτό δημιουργεί μία μικρή σύγχυση, καθώς μέχρι στιγμής έχουμε δει τουλάχιστον τρεις διαφορετικούς τρόπους με τους οποίους το Git χρησιμοποιεί το `^` για να τροποποιήσει τον αριθμό SHA-1 μίας υποβολής, αλλά εδώ σημαίνει αυτό το πράγμα.
36
39
37
40
Ένα άλλο πολύ ωραίο χαρακτηριστικό για το Git είναι ότι δεν παρακολουθεί απόλυτα το όνομα του αρχείου.
Η επισημείωση ενός αρχείου βοηθάει αν ξέρουμε ήδη πού βρίσκεται το πρόβλημα.
71
74
Αν δεν ξέρουμε τι είναι χαλασμένο και υπήρξαν δεκάδες ή εκατοντάδες υποβολές από την τελευταία κατάσταση όπου γνωρίζουμε ότι ο κώδικας λειτουργούσε, πιθανότατα θα στραφούμε προς την `git bisect` για βοήθεια.
72
-
Η εντολή `bisect` (διχοτόμηση) κάνει μια δυαδική αναζήτηση μέσα στο ιστορικό των υποβολών μας για να μας βοηθήσει να εντοπίσουμε το συντομότερο δυνατό ποια είναι υποβολή εισήγαγε ένα πρόβλημα.
75
+
Η εντολή `bisect` (διχοτόμηση) κάνει μια δυαδική αναζήτηση μέσα στο ιστορικό των υποβολών μας για να μας βοηθήσει να εντοπίσουμε το συντομότερο δυνατό ποια υποβολή εισήγαγε ένα πρόβλημα.
73
76
74
77
Ας υποθέσουμε ότι μόλις ωθήσαμε μια έκδοση του κώδικά μας στην παραγωγή, παίρνουμε αναφορές σφαλμάτων σχετικά με κάτι που δεν συνέβαινε στο περιβάλλον ανάπτυξης και δεν μπορούμε να φανταστούμε γιατί ο κώδικας το κάνει αυτό.
75
78
Πηγαίνουμε πίσω στον κώδικά μας και αποδεικνύεται ότι μπορούμε να αναπαραγάγουμε το πρόβλημα, αλλά δεν μπορούμε να καταλάβουμε τι το δημιουργεί.
76
79
Μπορούμε να _διχοτομήσουμε_ τον κώδικα για να το ανακαλύψουμε.
77
80
Αρχικά τρέχουμε την `git bisect start` για να ξεκινήσει η διαδικασία της διοχοτόμησης και στη συνέχεια την `git bisect bad` για να πούμε στο σύστημα ότι η τρέχουσα υποβολή που χρησιμοποιούμε είναι χαλασμένη.
78
-
Στη συνέχεια, πρέπει να πούμε στην `bisect` ποια ήταν η τελευταία γνωστή καλή κατάσταση, χρησιμοποιώντας την `git bisect good [good_commit]`:
81
+
Στη συνέχεια, πρέπει να πούμε στην `bisect` ποια ήταν η τελευταία γνωστή καλή κατάσταση, χρησιμοποιώντας την `git bisect good <good_commit>`:
79
82
80
83
[source,console]
81
84
----
@@ -89,7 +92,7 @@ Bisecting: 6 revisions left to test after this
89
92
Το Git κατάλαβε ότι περίπου 12 υποβολές ήρθαν μεταξύ της υποβολής που σημειώσαμε ως της τελευταίας καλής υποβολής (v1.0) και της τρέχουσας κακής έκδοσης, και μετέβη (checkout) τη μεσαία για εμάς.
90
93
Σε αυτό το σημείο, μπορούμε να εκτελέσουμε κάποια δοκιμασία για να διαπιστώσουμε εάν υπάρχει το πρόβλημα σε αυτήν την υποβολή.
91
94
Εάν υπάρχει, τότε εισήχθη κάποια στιγμή πριν από αυτήν τη μεσαία υποβολή· αν δεν υπάρχει, τότε το πρόβλημα εισήχθη κάποια στιγμή μετά τη μεσαία υποβολή.
92
-
Αποδεικνύεται ότι το πρόβλημα δεν υπάρχει εδώ και το λέμε αυτό στο Git ότι πληκτρολογώντας `git bisect good` και συνεχίζουμε την αναζήτηση του σφάλματος:
95
+
Αποδεικνύεται ότι το πρόβλημα δεν υπάρχει εδώ και το λέμε αυτό στο Git πληκτρολογώντας `git bisect good` και συνεχίζουμε την αναζήτηση του σφάλματος:
93
96
94
97
[source,console]
95
98
----
@@ -108,7 +111,7 @@ Bisecting: 1 revisions left to test after this
108
111
[f71ce38690acf49c1f3c9bea38e09d82a5ce6014] drop exceptions table
109
112
----
110
113
111
-
Αυτή η υποβολή είναι μια χαρά, και τώρα η Git διαθέτει όλες τις πληροφορίες που χρειάζεται για να προσδιορίσει πού εισήχθη το πρόβλημα.
114
+
Αυτή η υποβολή είναι μια χαρά, και τώρα το Git διαθέτει όλες τις πληροφορίες που χρειάζεται για να προσδιορίσει πού εισήχθη το πρόβλημα.
112
115
Μας λέει τον αριθμό SHA-1 της πρώτης κακής υποβολής και μας δείχνει μερικές από τις πληροφορίες της υποβολής και ποια αρχεία τροποποιήθηκαν σε αυτήν την υποβολή, ώστε να μπορούμε να καταλάβουμε τι ήταν αυτό που μπορεί να έχει εισάγει αυτό το σφάλμα:
Copy file name to clipboardExpand all lines: book/07-git-tools/sections/rerere.asc
+17-15Lines changed: 17 additions & 15 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,4 +1,4 @@
1
-
[[rch_rerere]]
1
+
[[r_ref_rerere]]
2
2
=== Rerere
3
3
4
4
Η λειτουργικότητα `git rerere` είναι ένα λίγο κρυμμένο χαρακτηριστικό.
@@ -22,12 +22,12 @@
22
22
$ git config --global rerere.enabled true
23
23
----
24
24
25
-
Μπορούμε επίσης να την ενεργοποιήσουμε δημιουργώντας έναν κατάλογο `.git/rr-cache` σε ένα συγκεκριμένο αποθετήριο, αλλά η ρύθμιση της παραμέτρου με την `config` είναι σαφέστερη και μπορεί να γίνει καθολικά.
25
+
Μπορούμε επίσης να την ενεργοποιήσουμε δημιουργώντας έναν κατάλογο `.git/rr-cache` σε ένα συγκεκριμένο αποθετήριο, αλλά η ρύθμιση της παραμέτρου με την config είναι σαφέστερη και μπορεί να γίνει καθολικά.
26
26
27
27
Τώρα ας δούμε ένα απλό παράδειγμα, παρόμοιο με το προηγούμενο.
28
28
Ας υποθέσουμε ότι έχουμε ένα αρχείο που μοιάζει με αυτό:
29
29
30
-
[source,console]
30
+
[source,ruby]
31
31
----
32
32
#! /usr/bin/env ruby
33
33
@@ -38,7 +38,8 @@ end
38
38
39
39
Σε έναν κλάδο αλλάζουμε τη λέξη "`hello`" σε "`hola`", στη συνέχεια σε έναν άλλο κλάδο αλλάζουμε το "`world`" σε "`mundo`", ακριβώς όπως πριν.
40
40
41
-
image::images/rerere1.png[]
41
+
.Δύο κλάδοι αλλάζουν το ίδιο μέρος ίδιου αρχείου διαφορετικά
42
+
image::images/rerere1.png[Δύο κλάδοι αλλάζουν το ίδιο μέρος ίδιου αρχείου διαφορετικά]
42
43
43
44
Όταν συγχωνεύσουμε τους δύο κλάδους, θα πάρουμε σύγκρουση συγχώνευσης:
Τώρα μπορούμε να επιλύσουμε τη σύγκρουση (ας πούμε ότι αποφασίζουμε να είναι `puts 'hola mundo'`) και μπορούμε να εκτελέσουμε ξανά την εντολή `rerere diff` για να δούμε τι θα θυμάται η `rerere`:
113
+
Τώρα μπορούμε να επιλύσουμε τη σύγκρουση (ας πούμε ότι αποφασίζουμε να είναι `puts 'hola mundo'`) και μπορούμε να εκτελέσουμε ξανά την εντολή `git rerere diff` για να δούμε τι θα θυμάται η `rerere`:
113
114
114
115
[source,console]
115
116
----
@@ -141,12 +142,13 @@ Recorded resolution for 'hello.rb'.
141
142
[master 68e16e5] Merge branch 'i18n'
142
143
----
143
144
144
-
Βλέπουμε ότι αναφέρει `Recorded resolution for FILE`.
145
+
Βλέπουμε ότι αναφέρει "Recorded resolution for FILE".
145
146
146
-
image::images/rerere2.png[]
147
+
.Καταγραφή επίλυσης για το FILE
148
+
image::images/rerere2.png[Καταγραφή επίλυσης για το FILE]
147
149
148
150
Τώρα ας αναιρέσουμε αυτήν τη συγχώνευση και στη συνέχεια ας αλλάξουμε τη βάση του θεματικού κλάδου στον κύριο κλάδο.
149
-
Μπορούμε να επαναφέρουμε τον κλάδο μας χρησιμοποιώντας την `reset` όπως είδαμε στην ενότητα <<r_git_reset>>.
151
+
Μπορούμε να επαναφέρουμε τον κλάδο μας χρησιμοποιώντας την `git reset` όπως είδαμε στην ενότητα <<ch07-git-tools#r_git_reset>>.
150
152
151
153
[source,console]
152
154
----
@@ -177,9 +179,8 @@ Patch failed at 0001 i18n one word
177
179
Τώρα, πήραμε την ίδια σύγκρουση συγχώνευσης όπως αναμέναμε, αλλά επιπλέον υπάρχει η γραμμή `Resolved FILE using previous resolution`.
178
180
Αν εξετάσουμε το αρχείο, θα δούμε ότι έχει ήδη επιλυθεί, δεν υπάρχουν επισημάνσεις σύγκρουσης συγχώνευσης.
179
181
180
-
[source,console]
182
+
[source,ruby]
181
183
----
182
-
$ cat hello.rb
183
184
#! /usr/bin/env ruby
184
185
185
186
def hello
@@ -206,9 +207,10 @@ index a440db6,54336ba..0000000
Μπορούμε επίσης να ξαναδημιουργήσουμε την κατάσταση σύγκρουσης του αρχείου με την εντολή `checkout`:
213
+
Μπορούμε επίσης να ξαναδημιουργήσουμε την κατάσταση σύγκρουσης του αρχείου με την εντολή `git checkout`:
212
214
213
215
[source,console]
214
216
----
@@ -225,8 +227,8 @@ def hello
225
227
end
226
228
----
227
229
228
-
Είδαμε ένα παράδειγμα αυτού στην ενότητα <<r_advanced_merging>>.
229
-
Προς το παρόν, όμως, ας την ξαναεπιλύσουμε τρέχοντας την `rerere` ξανά:
230
+
Είδαμε ένα παράδειγμα αυτού στην ενότητα <<ch07-git-tools#r_advanced_merging>>.
231
+
Προς το παρόν, όμως, ας την ξαναεπιλύσουμε τρέχοντας την `git rerere` ξανά:
230
232
231
233
[source,console]
232
234
----
@@ -250,5 +252,5 @@ $ git rebase --continue
250
252
Applying: i18n one word
251
253
----
252
254
253
-
Έτσι, εάν κάνουμε πολλές συγχωνεύσεις ή θέλουμε o θεματικός κλάδος μας να συμβαδίζει με τον κύριο κλάδο μας χωρίς να έχουμε πάμπολλες συγχωνεύσεις, μπορούμε είτε να κάνουμε συχνά αλλαγές βάσης, είτε να ενεργοποιήσουμε την `rerere` για να κάνουμε πιο εύκολη τη ζωή μας.
255
+
Έτσι, εάν κάνουμε πολλές συγχωνεύσεις ή θέλουμε o θεματικός κλάδος μας να συμβαδίζει με τον `master` κλάδο μας χωρίς να έχουμε πάμπολλες συγχωνεύσεις, μπορούμε είτε να κάνουμε συχνά αλλαγές βάσης, είτε να ενεργοποιήσουμε την `rerere` για να κάνουμε πιο εύκολη τη ζωή μας.
0 commit comments