Một bản vá trong kiểm soát phiên bản git là gì?


136

Tôi chưa quen với cả điều khiển git và phiên bản vì vậy tôi đang cố gắng tìm ra bản vá là gì và nó khác với các hoạt động còn lại tôi làm trong git như thế nào?

Khi nào tôi áp dụng một bản vá? Có xảy ra mỗi khi tôi cam kết không?

Câu trả lời:


116

Bạn có thể thấy trong bài đăng trên blog này cách bạn có thể tạo một bản vá (tập hợp các thay đổi bạn muốn giao tiếp và áp dụng cho một repo khác)

git vá
(ảnh từ bài đăng trên blog năm 2008 " Bioruby with git: nó sẽ hoạt động như thế nào? ", được xuất bản bởi Jan AERTS )

Xem thêm Đóng góp cho Rails với Git như một ví dụ cụ thể khác.

Ngày nay, yêu cầu kéo GitHub giúp dễ dàng áp dụng các bản vá trên repos GitHub, rất hữu ích khi bạn không phải là người đóng góp trực tiếp (tức là bạn không có quyền đẩy trực tiếp vào repo).
Trên thực tế, gần đây GitHub đã giới thiệu " Email yêu cầu kéo tốt hơn " để cải thiện thông báo về các bản vá mới.


4
Một câu trả lời hay và một câu trả lời cho tôi rằng 'bản vá' GIT không phải là thứ tôi đang tìm kiếm.
RonLugge

91

Patch là một chương trình Unix cập nhật các tệp văn bản theo các hướng dẫn có trong một tệp riêng biệt, được gọi là tệp vá.

Vì vậy, nói cách khác, nó có thể có nghĩa là tệp có hướng dẫn hoặc chương trình xử lý tệp đó và áp dụng nó vào một cái gì đó.

Bây giờ, một tập tin vá là gì? Giả sử bạn có một tệp văn bản có 2 dòng:

This is line A.
This is line B, or otherwise #2.

Sau đó, bạn thay đổi dòng đầu tiên và bây giờ tệp của bạn trông như thế này:

This is SPARTA.
This is line B, or otherwise #2.

Làm thế nào bạn sẽ mô tả sự thay đổi nội dung của tập tin? Bạn có thể nói rằng dòng đầu tiên "Đây là dòng A." đã được thay thế bằng "Đây là SPARTA." hoặc thậm chí từ cuối cùng "A" của dòng đầu tiên được thay thế bằng một từ khác "SPARTA". Và đó là chính xác những gì diff nói với chúng tôi. Giả sử tôi có hai phiên bản của tệp này, một phiên bản gọi là file1.txt và một phiên bản khác là file2.txt, sau đó tôi chạy diff và nhận được điều này:

$ diff -u file1.txt file2.txt 
--- file1.txt   2011-11-26 11:07:03.131010360 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.

Có một mô tả về các thay đổi, bạn có thể áp dụng nó cho một nội dung ban đầu và nhận được một nội dung được sửa đổi. Và những thay đổi đó, được đặt ở định dạng hợp nhất mà các chương trình giống như "vá" có thể hiểu được, được gọi là tệp vá. Nó giống như thay vì lấy một con cá từ một người mà họ dạy bạn cách câu cá, để bạn có thể tự mình đào con cá đó ra khỏi vùng nước. Bây giờ, hãy áp dụng bản vá của chúng tôi cho file1.txt để làm cho nó trông giống hệt như file2.txt:

$ cat file1.txt 
This is line A.
This is line B, or otherwise #2.
$ cat file2.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ diff -u file1.txt file2.txt > changes.patch
$ cat changes.patch 
--- file1.txt   2011-11-26 11:09:38.651010370 -0500
+++ file2.txt   2011-11-26 11:07:13.171010362 -0500
@@ -1,2 +1,2 @@
-This is line A.
+This is SPARTA.
 This is line B, or otherwise #2.
$ patch < changes.patch 
patching file file1.txt
$ cat file1.txt 
This is SPARTA.
This is line B, or otherwise #2.
$ 

Bạn có thể nghĩ rằng sẽ dễ dàng hơn khi chỉ có hai phiên bản của tệp này. Vâng, trong trường hợp đơn giản đó là sự thật. Nhưng khi bạn có rất nhiều tệp và những tệp đó rất lớn, sẽ hiệu quả hơn rất nhiều khi có một vài dòng thay đổi thay vì hai bản sao của toàn bộ.

Khi nói về git, file patch vẫn có nghĩa tương tự, nhưng tự mình sử dụng diff + patch sẽ là một cơn ác mộng. Ví dụ, bạn sẽ luôn phải có hai phiên bản của tệp (hoặc thậm chí toàn bộ kho lưu trữ) để kiểm tra để so sánh chúng. Nghe có vẻ không tốt, phải không? Vì vậy, git sẽ giải quyết tất cả công việc khó khăn cho bạn - nó so sánh tệp cục bộ của bạn với kho lưu trữ bạn đang làm việc và có thể hiển thị nó cho bạn dưới dạng "diff" hoặc áp dụng "diff" như một patch aka cam kết thay đổi của bạn, hoặc thậm chí cho phép bạn áp dụng một số tệp vá mà bạn đã có. Không đi sâu vào chi tiết, theo nghĩa này, git hoàn toàn giống với các hệ thống kiểm soát phiên bản khác như SVN, hoặc thậm chí CVS hoặc lực lượng.

Hy vọng nó giúp!


Không bao giờ biết git sử dụng patchchương trình tích hợp. Tôi nghĩ rằng git đã thực hiện riêng của mình.
radiantshaw

43

Một bản vá là một tệp nhỏ chỉ ra những thay đổi được thực hiện trong kho lưu trữ. Nó thường được sử dụng khi ai đó bên ngoài nhóm của bạn có quyền truy cập chỉ đọc nhưng có sẵn một thay đổi mã tốt. Anh ta sau đó tạo ra một bản vá và gửi nó cho bạn. Bạn áp dụng nó và đẩy nó vào kho git. Mọi người sau đó được hưởng lợi từ phiên bản cập nhật và tác giả của bản vá không cần truy cập đọc / ghi.

Nó thực sự chủ yếu là một thứ bảo mật (ít nhất, đó là những gì mọi người sử dụng nó cho).


1
Thông tin bổ sung: Mặc dù git không sử dụng các bản vá trong nội bộ, một mục tiêu thiết kế cho git là giúp dễ dàng trao đổi các bản vá (vì nhiều dự án hoạt động theo cách đó, ví dụ như Linux và git). Vì vậy, git có các lệnh đặc biệt để xử lý các bản vá ( git diffhiển thị các thay đổi dưới dạng các bản vá theo mặc định, git applycho phép bạn áp dụng một bản vá, v.v.).
sleske

Chúc mừng! Bạn thực sự đóng đinh nó liên quan đến những gì các bản vá được sử dụng cho, nghĩa là, một phương tiện để gửi các thay đổi đến kho lưu trữ mà tác giả của các thay đổi không có quyền truy cập ghi. Do đó, mô hình yêu cầu ngã ba và kéo của GitHub là sự thay thế cho mô hình vá phân phối thay đổi. Vì vậy, tôi tin rằng các bản vá chỉ hữu ích bên ngoài bối cảnh của các công cụ như GitHub.
mljrg

8

Một tệp vá đại diện cho một tập hợp các thay đổi có thể được áp dụng cho bất kỳ chi nhánh nào, theo bất kỳ thứ tự nào. Bằng cách sử dụng bản vá, bạn sẽ nhận được sự khác biệt giữa một hoặc nhiều tệp. Và sau này, bạn có thể áp dụng các khác biệt (bản vá) để nhận các thay đổi trên các tệp mới. Có nhiều cách sử dụng cho một bản vá trong Git. Nếu bạn có những thay đổi không được cam kết trong thư mục làm việc của mình và bạn cần lấy những thay đổi đó để áp dụng ở một nơi khác, chỉ cần tạo một bản vá và áp dụng bản vá.

git diff > mypatch.patch

Nếu bạn có tệp mới trong kho lưu trữ của mình (không bị theo dõi), thì bạn nên tạo giai đoạn tệp trước khi tạo bản vá (không cam kết) và sử dụng lệnh sau

git diff --cached > mypatch.patch 

Sau này bạn có thể áp dụng bản vá:

git apply mypatch.patch

Nếu bạn muốn thực hiện một số thay đổi đối với kho git, rằng bạn không có quyền ghi, chỉ cần thực hiện các thay đổi và tạo một bản vá giữa cả hai và gửi bản vá cho ai đó có quyền áp dụng bản vá, bằng cách này thay đổi của bạn nên được thêm vào kho git đó.


Trình diễn tốt hơn: robot . Dùtbot.com / . Tóm tắt ví dụ cơ bản của tôi: git format-patch <base_commit_or_branch_name>= kết thúc tất cả các cam kết từ bây giờ trở lại <base_commit_or_branch_name> thành các tệp đẹp và gọn gàng chứa khác biệt cũng như các thông điệp cam kết, để dễ dàng gửi (ví dụ: qua email) cho người khác muốn vá chúng cơ sở mã của họ. Sau đó, người nhận vá hệ thống của họ bằng tệp của bạn:cat *.patch | git am
Gabriel Staples

7

Một bản vá là một tập hợp các khác biệt giữa một hoặc nhiều tệp, để hiển thị những gì khác nhau giữa chúng. Bạn thường chỉ tạo ra một bản vá để cho ai đó thấy những gì bạn đã thay đổi. Một ví dụ về thời điểm bạn có thể làm điều này là khi bạn tìm và sửa một lỗi trong ứng dụng nguồn mở và sau đó đăng bản sửa lỗi lên trình theo dõi lỗi của họ.

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.