Sự khác biệt giữa 'git format-patch và' git diff 'là gì?


92

Tôi không thấy sự khác biệt giữa đầu ra của 'git format-patch' và 'git diff', có bất kỳ không? Và tôi sẽ không thể sử dụng 'git diff' để tạo một bản vá và sau đó áp dụng nó bằng git apply sao?

Vấn đề của tôi là tôi đã thêm các thay đổi vào chỉ mục, nhưng rõ ràng git format-patch chỉ chấp nhận các cam kết, vì vậy nếu tôi có thể sử dụng đầu ra của diff, thì tôi có thể sử dụng lệnh này để tạo bản vá cho các thay đổi trong chỉ mục:

git diff --cached > index.patch

Câu trả lời:


129

Một bản vá được tạo bằng git format-patchcũng sẽ bao gồm một số siêu thông tin về cam kết (người cam kết, ngày tháng, thông điệp cam kết, ...) và sẽ chứa các dữ liệu nhị phân khác nhau. Mọi thứ sẽ được định dạng dưới dạng thư để có thể dễ dàng gửi đi. Sau đó, người nhận được nó có thể tạo lại cam kết tương ứng với git amvà tất cả siêu dữ liệu sẽ được giữ nguyên. Nó cũng có thể được áp dụng git applyvì nó là một tập hợp siêu của một khác biệt đơn giản.

Một bản vá được nhồi nhét git diffsẽ là một sự khác biệt đơn giản với ngữ cảnh (suy nghĩ diff -u). Nó cũng có thể được áp dụng với git applynhưng siêu dữ liệu sẽ không được tạo lại (vì chúng không có mặt).

Tóm lại, git format-patchrất hữu ích để truyền một cam kết, trong khi git diffhữu ích để có được sự khác biệt giữa hai cây.


12

Từ hướng dẫn sử dụng, git-format-patch chuẩn bị các bản vá phù hợp để gửi email, trong khi git-diff cho thấy các thay đổi.

Chúng là hai thứ khác nhau và có mục đích khác nhau, chúng chỉ tình cờ xuất ra một định dạng vá lỗi. Nhưng git-format-patchthêm dữ liệu về một cam kết (ngày tháng, tác giả, thông báo cam kết) và gói nó thành một định dạng phù hợp để gửi dưới dạng thư Unix (mặc dù đây chỉ là những tệp, vì vậy chúng có thể được gửi đến các phương thức khác và vẫn được áp dụng bởi git-am).

Đồng thời git-format-patchtạo một tệp bản vá cho mỗi cam kết trong phạm vi mà bạn chỉ định. Những thay đổi này sẽ được thêm vào dưới dạng cam kết vào kho lưu trữ của bạn với git-am.

git-diffchỉ hiển thị sự khác biệt giữa hai trạng thái bạn yêu cầu và có thể được sử dụng để tạo tệp vá. Nhưng đây chỉ là một tệp vá thông thường và việc áp dụng bản vá sẽ chỉ thay đổi trạng thái của thư mục làm việc.

Và có, bạn có thể tạo một bản vá cho chỉ mục của mình theo cách đó.


Cảm ơn. Điều gì đặc biệt về thư UNIX để họ thiết kế bản vá dựa trên nó?
Rafid

7
Không có gì thực sự đặc biệt. Đây chỉ là git được thiết kế bởi Linus Torvalds, người có quy trình làm việc liên quan đến việc gửi và nhận các bản vá bằng email để xác nhận trước khi tích hợp vào nhân Linux.
Sylvain Defresne

Git được thiết kế bởi Linus Torvalds để giữ nguyên nhân Linux. Thư Unix là một định dạng phổ biến.
Abizern

1

Tệp bản vá có thể được tạo bằng git difflệnh, nhưng so sánh với bản vá được tạo bằng git format-patchlệnh, sự khác biệt chính là:

  1. Không có siêu dữ liệu nào về một cam kết (chẳng hạn như ngày tháng, tác giả, thông báo cam kết, v.v.);
  2. Không có thống kê về khác biệt (khác biệt, chẳng hạn như x tệp đã thay đổi, chèn y (+), xóa z (-));
  3. Không có khác biệt nhị phân, chỉ khác biệt về văn bản.

nhập mô tả hình ảnh ở đây

Để tạo tệp vá cho tất cả các tệp đã thay đổi (trong chỉ mục hoặc thư mục làm việc):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Để áp dụng tệp vá đã tạo:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
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.