“@@ -1 +1 @@” có nghĩa là gì trong đầu ra khác biệt của Git?


103

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.


Bạn có thể mô tả những gì kết quả tệp trong tiêu đề như vậy?
kworr

@kworr đó là một câu hỏi ngớ ngẩn, bất kỳ khác biệt nào ở định dạng thống nhất đều có tiêu đề phạm vi.
Yuval Adam

@YuvalAdam: thực sự định dạng thống nhất khác biệt có nhiều trường hơn cần được điền như [- +] <position>, <lines> và ở đây chúng tôi không có thay đổi nào được hiển thị nhưng những thay đổi này chạm vào dòng đầu tiên của tệp.
kworr

Câu trả lời:


69

Đó 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-time

Dấ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=labeltù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.

68

Phân tích ví dụ đơn giản

Định dạng về cơ bản là giống nhau, diff -ukhá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,6có 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,4có 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 11thứ 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 -pcờ đồ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 12.

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?


À, tôi sẽ đọc @@ -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"
Cloud


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.