Tôi đang thu thập dữ liệu từ thông tin trả về từ
git diff <commitId>..<commitId>
và tôi tình cờ gặp @@ -1 +1 @@
Tôi không thể hiểu điều đó đang nói với tôi. Tôi đã tìm kiếm một chút trên Google nhưng vô ích.
Tôi đang thu thập dữ liệu từ thông tin trả về từ
git diff <commitId>..<commitId>
và tôi tình cờ gặp @@ -1 +1 @@
Tôi không thể hiểu điều đó đang nói với tôi. Tôi đã tìm kiếm một chút trên Google nhưng vô ích.
Câu trả lời:
Đó là một định danh khác biệt thống nhất. Điều này được ghi lại bởi GNU Diffutils.
Định dạng đầu ra hợp nhất bắt đầu bằng tiêu đề hai dòng, trông giống như sau:
--- from-file from-file-modification-time +++ to-file to-file-modification-timeDấu thời gian giống như
2002-02-21 23:30:39.942229878 -0800
để cho biết ngày, giờ với giây phân số và múi giờ. Các giây phân số bị bỏ qua trên các máy chủ không hỗ trợ tem thời gian phân số.Bạn có thể thay đổi nội dung của tiêu đề với
--label=label
tùy chọn; xem Xem Tên thay thế .Tiếp theo là một hoặc nhiều điểm khác biệt; mỗi phần hiển thị một khu vực nơi các tệp khác nhau. Các nhóm định dạng thống nhất trông như thế này:
@@ từ-tệp-dòng-số đến-tệp-dòng-số @@ dòng-từ-một-trong-tệp -dòng-từ-một-trong-tệp ...Nếu một phần nhỏ chỉ chứa một dòng, chỉ số dòng bắt đầu của nó xuất hiện. Nếu không, số dòng của nó trông như thế nào . Một con trống được coi là bắt đầu ở dòng sau con ngựa con.
start,count
Nếu một phần nhỏ và ngữ cảnh của nó chứa hai hoặc nhiều dòng, số dòng của nó trông như thế nào . Nếu không, chỉ số dòng cuối của nó xuất hiện. Một khúc gỗ trống được coi là kết thúc ở dòng đứng trước một khúc gỗ.
start,count
Các dòng chung cho cả hai tệp bắt đầu bằng ký tự khoảng trắng. Các dòng thực sự khác nhau giữa hai tệp có một trong các ký tự chỉ báo sau trong cột in bên trái:
- +
Một dòng đã được thêm vào đây vào tệp đầu tiên.- -
Ở đây đã xóa một dòng khỏi tệp đầu tiên.
Phân tích ví dụ đơn giản
Định dạng về cơ bản là giống nhau, diff -u
khác biệt thống nhất.
Ví dụ:
diff -u <(seq -w 16) <(seq -w 16 | grep -Ev '^(02|03|14|15)$')
Ở đây chúng tôi đã loại bỏ các dòng 2, 3, 14 và 15. Đầu ra:
@@ -1,6 +1,4 @@
01
-02
-03
04
05
06
@@ -11,6 +9,4 @@
11
12
13
-14
-15
16
@@ -1,6 +1,4 @@
có nghĩa:
-1,6
có nghĩa là phần này của tệp đầu tiên bắt đầu ở dòng 1 và hiển thị tổng cộng 6 dòng. Do đó, nó hiển thị các dòng từ 1 đến 6.
1
2
3
4
5
6
-
có nghĩa là "cũ", như chúng ta thường gọi nó là diff -u old new
.
+1,4
có nghĩa là phần này của tệp thứ hai bắt đầu ở dòng 1 và hiển thị tổng cộng 4 dòng. Do đó, nó hiển thị các dòng từ 1 đến 4.
+
có nghĩa là "mới".
Chúng tôi chỉ có 4 dòng thay vì 6 vì 2 dòng đã bị loại bỏ! Phần mềm mới chỉ là:
01
04
05
06
@@ -11,6 +9,4 @@
đối với phần thứ hai là tương tự:
trên tệp cũ, chúng ta có 6 dòng, bắt đầu từ dòng 11 của tệp cũ:
11
12
13
14
15
16
trên tệp mới, chúng tôi có 4 dòng, bắt đầu từ dòng 9 của tệp mới:
11
12
13
16
Lưu ý rằng dòng đó là dòng 11
thứ 9 của tệp mới vì chúng tôi đã xóa 2 dòng trên tệp trước đó: 2 và 3.
Tiêu đề một đoạn
Tùy thuộc vào phiên bản git và cấu hình của bạn, bạn cũng có thể nhận được một dòng mã bên cạnh @@
dòng, ví dụ như func1() {
trong:
@@ -4,7 +4,6 @@ func1() {
Điều này cũng có thể đạt được với -p
cờ đồng bằng diff
.
Ví dụ: tệp cũ:
func1() {
1;
2;
3;
4;
5;
6;
7;
8;
9;
}
Nếu chúng tôi xóa dòng 6
, sự khác biệt hiển thị:
@@ -4,7 +4,6 @@ func1() {
3;
4;
5;
- 6;
7;
8;
9;
Lưu ý rằng đây không phải là dòng chính xác cho func1
: nó đã bỏ qua các dòng 1
và 2
.
Tính năng tuyệt vời này thường cho biết chính xác chức năng hoặc lớp mà mỗi phần mềm thuộc về, điều này rất hữu ích để giải thích sự khác biệt.
Thuật toán chọn tiêu đề hoạt động chính xác như thế nào sẽ được thảo luận tại: Đoạn trích trong tiêu đề git diff hunk đến từ đâu?
@@ -1,6 +1,4 @@
là "Bắt đầu từ dòng 1, số dòng cũ là 6 nhưng số dòng mới là 4"
Đó là thông tin phạm vi phân khúc hiện tại cho biết số dòng này bắt đầu và kết thúc.
Đọc http://en.wikipedia.org/wiki/Diff#Unified_format để có giải thích chuyên sâu.