Lệnh git diff hiển thị sự khác biệt giữa các tệp trong hai lần cam kết hoặc giữa kho lưu trữ hiện tại của bạn và một lần cam kết trước đó. Lệnh này hiển thị các thay đổi được biểu thị bằng tiêu đề và siêu dữ liệu cho các tệp đã thay đổi.
Khi đang làm việc với hệ thống kiểm soát phiên bản Git, bạn có thể muốn so sánh dữ liệu trong kho lưu trữ của mình với một nguồn dữ liệu khác. Ví dụ:bạn có thể muốn so sánh hai cam kết khác nhau với nhau hoặc hai tệp.
Đó là nơi xuất hiện của hàm khác biệt. Khác biệt là một hàm chấp nhận hai đầu vào và trình bày những thay đổi tồn tại giữa các nguồn dữ liệu đó. Các hàm khác biệt có thể được thực thi trên các nhánh, tệp và cam kết.
Hướng dẫn này sẽ thảo luận, với các ví dụ, những điều cơ bản về khác biệt với Git và cách sử dụng lệnh git diff. Khi đọc xong hướng dẫn này, bạn sẽ trở thành chuyên gia sử dụng lệnh git diff.
Lệnh Git Diff
Lệnh git diff hiển thị sự khác biệt giữa các tệp trong hai lần cam kết hoặc giữa một lần cam kết và kho lưu trữ hiện tại của bạn. Bạn có thể xem văn bản nào đã được thêm vào, xóa khỏi và thay đổi trong một tệp.
Đây là cú pháp của lệnh git diff:
git diff
Theo mặc định, lệnh git diff sẽ hiển thị bất kỳ thay đổi nào chưa được cam kết đối với kho lưu trữ của bạn.
Chúng tôi có thể thấy các dòng đã xóa khỏi tệp gốc của chúng tôi cũng như bất kỳ dòng nào được thêm vào hoặc thay đổi trong tệp gốc của chúng tôi. Thông thường, Git diff được sử dụng để so sánh các nhánh trong kho lưu trữ Git.
81% người tham gia cho biết họ cảm thấy tự tin hơn về triển vọng công việc công nghệ của mình sau khi tham gia một cuộc thi đào tạo. Kết hợp với bootcamp ngay hôm nay.
Sinh viên tốt nghiệp bootcamp trung bình đã dành ít hơn sáu tháng để chuyển đổi nghề nghiệp, từ khi bắt đầu bootcamp đến khi tìm được công việc đầu tiên của họ.
Chênh lệch Git giữa các cam kết
Bạn có thể so sánh các tệp giữa hai cam kết Git bằng cách chỉ định tên của tham chiếu đề cập đến các cam kết mà bạn muốn so sánh. Giới thiệu có thể là ID cam kết hoặc HEAD, đề cập đến chi nhánh hiện tại.
git diff <commit1> <commit2>
Hãy so sánh hai cam kết trong kho lưu trữ Git của chúng tôi.
Để làm như vậy, trước tiên bạn cần truy xuất ID của các cam kết có tệp mà bạn muốn so sánh. Bạn có thể thực hiện tác vụ này bằng cách sử dụng lệnh git log –pretty =oneline, lệnh này trả về một bản tóm tắt ngắn gọn về tất cả các cam kết trong một repo:
git log --pretty=oneline
Lệnh này trả về:
5141ea9c41cdc7152408bfcab54a910f34441855 (HEAD ->; master) feat: Update README.md 749055ee99df2aa6f5adc4cbe4bfc708395f1c2e docs: Create README.md
Bây giờ, giả sử chúng ta muốn so sánh hai cam kết này. Chúng ta có thể làm như vậy bằng lệnh này:
git diff 5141ea9c41cdc7152408bfcab54a910f34441855 749055ee99df2aa6f5adc4cbe4bfc708395f1c2e
Lệnh trên sẽ thực hiện một hoạt động khác nhau trên hai cam kết của chúng ta.
Chênh lệch Git giữa các nhánh
Để so sánh hai nhánh Git bằng lệnh diff, hãy chỉ định hai nhánh bạn muốn so sánh làm đối số. Bạn cần sử dụng hai dấu chấm giữa mỗi tên chi nhánh. Những dấu chấm này cho biết rằng bạn muốn đọc cam kết mới nhất trong mỗi nhánh và so sánh chúng:
git diff <branch1>..<branch2>
Giả sử chúng tôi muốn so sánh nhánh “chính” với một nhánh có tên “dev-v0.9” trong kho lưu trữ của chúng tôi. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
git diff master dev-v0.9
Khi lệnh này được thực thi, một sự khác biệt sẽ được chạy giữa các nhánh “chính” và “dev-v0.9” trong cơ sở mã của chúng tôi.
Tương tự, bạn có thể so sánh các tệp cụ thể trên hai nhánh khác nhau. Để làm như vậy, bạn có thể sử dụng cú pháp tương tự như trên và chỉ định thêm tệp mà bạn muốn so sánh.
Giả sử chúng tôi muốn so sánh tệp README.md trên các nhánh “chính” và “dev-v0.9” của chúng tôi. Chúng tôi có thể làm như vậy bằng cách sử dụng mã này:
git diff master dev-v0.9 ./README.md
Thao tác này sẽ so sánh tệp README.md (nằm trong thư mục hiện tại của chúng tôi, được biểu thị bằng cú pháp “./”) trên các nhánh “chính” và “dev-v0.9”.
Ví dụ về lệnh Git Diff
Giả sử chúng tôi đã khởi tạo một kho lưu trữ trống và chúng tôi muốn bắt đầu kho lưu trữ của mình bằng tệp README.md. Chúng tôi đã tạo tệp README.md trong kho lưu trữ của chúng tôi có chứa câu sau:
Đây là một ví dụ về tính năng khác biệt của Git.
Chuẩn bị tệp và cam kết
Chúng ta sẽ tạo một cam kết với tệp này bằng lệnh git commit:
git commit
Điều này cho phép chúng tôi lưu những thay đổi mà chúng tôi đã thực hiện đối với kho lưu trữ của mình. Lệnh git trả về:
[master (root-commit) 749055e] docs: Create README.md 1 file changed, 1 insertion(+) create mode 100644 README.md
Nếu chúng ta chạy lệnh git diff ở giai đoạn này, sẽ không có gì xảy ra. Điều này là do kho lưu trữ của chúng tôi đã được khởi tạo và không có thay đổi nào giữa bất kỳ tệp nào trong kho lưu trữ của chúng tôi. Bây giờ chúng ta đã có một kho lưu trữ cơ bản, chúng ta có thể thay đổi nội dung của các tệp trong kho của mình. Điều này sẽ cho phép chúng tôi thấy lệnh git diff đang hoạt động.
Giả sử chúng ta muốn thêm câu "Chúng tôi vừa thêm dòng này vào tệp của mình." vào tệp README.md. Chúng tôi có thể làm như vậy bằng cách sử dụng lệnh này:
echo "We just added this line to our file." >> README.md
Lệnh trên thêm câu của chúng ta vào tệp README.md.
Điều này có nghĩa là bây giờ có sự khác biệt giữa tệp README.md ban đầu của chúng tôi và tệp README.md hiện tại trong kho lưu trữ của chúng tôi.
Bằng cách thực hiện lệnh git diff, chúng ta có thể thấy sự khác biệt giữa hai tệp này. Theo mặc định, lệnh git diff tạo ra sự khác biệt cho tất cả các tệp giữa cam kết mới nhất và trạng thái hiện tại của kho lưu trữ.
Chạy Git Chênh lệch giữa các cam kết
Khi chúng tôi chạy lệnh, phản hồi sau được trả về:
diff --git a/README.md b/README.md index f808522..f08e544 100644 --- a/README.md +++ b/README.md @@ -1 +1,2 @@ +We have just added this line to our file.
Đây là một ví dụ về tính năng khác biệt của Git.
Đây là kết quả điển hình từ lệnh git diff. Kết quả của chúng tôi cho thấy những gì đã được thêm vào hoặc xóa trong tệp của chúng tôi ở định dạng khác biệt kết hợp.
Lệnh git diff trả về danh sách tất cả các thay đổi trong tất cả các tệp giữa lần cam kết cuối cùng và kho lưu trữ hiện tại của chúng tôi.
Nếu bạn muốn truy xuất các thay đổi được thực hiện đối với một tệp cụ thể trong kho lưu trữ, bạn có thể chỉ định tệp đó làm tham số thứ ba. Giả sử chúng ta chỉ muốn xem các thay đổi được thực hiện đối với tệp README.md.
Trong ví dụ này, chúng tôi chỉ thay đổi tệp README.md, vì vậy, chỉ những thay đổi đó sẽ được hiển thị. Nhưng nếu chúng tôi đang làm việc với một repo lớn hơn, chúng tôi có thể chỉ muốn so sánh những thay đổi trong một tệp. Để làm như vậy, chúng ta có thể sử dụng lệnh này:
git diff README.md
Lệnh này cho phép chúng tôi so sánh phiên bản hiện tại của tệp README.md với phiên bản cuối cùng được cam kết với hệ thống lưu trữ của chúng tôi.
Phân tích chênh lệch Git
Git diffs có một số thành phần mà chúng ta có thể sử dụng để phân tích những thay đổi giữa một tệp trong kho lưu trữ. Hãy chia nhỏ chúng ra, tham khảo ví dụ trước của chúng tôi.
Tệp đầu vào
Thành phần đầu tiên của khác biệt của chúng tôi là tệp đầu vào . Phần khác biệt này cho chúng ta biết tệp nào đang được so sánh trong phần khác biệt.
Chúng tôi đang so sánh tệp README.md trong phiên bản mã hiện tại của chúng tôi với tệp README.md trong phiên bản mã cuối cùng của chúng tôi. Điều này được nêu trên dòng đầu tiên của mã của chúng tôi:
diff --git a/README.md b/README.md
Siêu dữ liệu
Tiếp theo, khác biệt của chúng tôi chứa siêu dữ liệu cho kho lưu trữ Git của chúng tôi. Siêu dữ liệu này hiển thị các nhãn phiên bản đối tượng được Git sử dụng để theo dõi những thay đổi bạn đã thực hiện đối với tệp.
Thông tin này hiếm khi được sử dụng trong hầu hết các trường hợp của lệnh khác biệt. Trong ví dụ trên của chúng tôi, siêu dữ liệu trông giống như sau:
index f808522..f08e544 100644
Thay đổi điểm đánh dấu
Phần tiếp theo của đầu ra khác biệt Git là điểm đánh dấu thay đổi . Các điểm đánh dấu mẫu tệp này cho chúng tôi biết loại thay đổi nào đã được thực hiện đối với tệp của chúng tôi. Các điểm đánh dấu thay đổi cho ví dụ trên của chúng tôi là:
--- a/README.md +++ b/README.md
Các điểm đánh dấu này cho chúng tôi biết rằng các thay đổi từ a / README.md đã được thực hiện (biểu thị bằng dấu trừ), được phản ánh trong b / README.md (biểu thị bằng dấu cộng).
Thay đổi mã
Cuối cùng, điểm khác biệt của chúng tôi trả về danh sách các thay đổi được thực hiện đối với mã của chúng tôi . Không giống như so sánh toàn bộ tệp, khác biệt chỉ hiển thị các phần của tệp đã được thay đổi. Trong ví dụ của chúng tôi, chúng tôi đã thêm một dòng vào tệp của mình, dòng này trả về kết quả sau:
@@ -1 +1,2 @@ This is an example of the Git diff feature. +We have just added this line to our file.
Dòng đầu tiên là bản tóm tắt các thay đổi được thực hiện đối với tệp của chúng tôi. Điều này cho chúng tôi biết rằng chúng tôi đã thêm một dòng mã vào tệp của mình (+1) bắt đầu từ dòng thứ hai (2).
Sau đó, chúng tôi sẽ hiển thị danh sách các thay đổi được thực hiện. Như bạn có thể thấy, vì chúng tôi đã thêm dòng “Chúng tôi vừa thêm dòng này vào tệp của mình.”, Dòng đó xuất hiện trong khác biệt của chúng tôi. Dấu cộng cho chúng tôi biết rằng chúng tôi đã thêm dòng đó vào tệp.
Kết luận
Diffing là một chức năng hữu ích trong Git cho phép bạn so sánh hai tệp, nhánh hoặc cam kết trong kho lưu trữ Git. Điều này cho phép bạn xem những thay đổi nào đã được thực hiện kể từ một thời điểm nhất định trong kho lưu trữ của bạn.
Hướng dẫn này đã thảo luận những điều cơ bản về khác biệt với Git và cách sử dụng lệnh git diff để thực hiện thao tác khác biệt. Giờ đây, bạn đã được trang bị kiến thức cần thiết để bắt đầu sử dụng lệnh git diff như một chuyên gia!
Để biết thêm tài nguyên học tập trên Git, hãy xem hướng dẫn Cách học Git của chúng tôi.