2008-11-16 25 views
11

Tôi làm cách nào để nhận bản vá từ cam kết để gửi cho nhà phát triển khác? Và làm cách nào để tránh xung đột tốt nhất với bản vá này khi sáp nhập cây của chúng tôi vào một ngày sau đó?Làm cách nào để gửi bản vá cho nhà phát triển khác và tránh xung đột hợp nhất?

Nếu bạn biết làm thế nào xin vui lòng giải thích làm thế nào để làm điều này trong VCS của bạn lựa chọn như lật đổ, git, Mercurial, bzr hoặc vv

Trả lời

18

Trong git bạn có thể đường ống đầu ra của git-diff giữa hai cam kết như thế này:

git diff fa1afe1 deadbeef > patch.diff 

Gửi patch.diff cho nhà phát triển và để cho anh ta git-apply nó để không gian làm việc của mình như thế này:

git apply patch.diff 

Nếu nhà phát triển khác đã có các cam kết có sẵn trong kho lưu trữ của mình, anh ấy luôn có thể tự mình thêm vào đó mà không cần hợp nhất như sau:

git apply < git diff fa1afe1 deadbeef 

Sau đó, bạn có thể addcommit các thay đổi trong khác biệt the usual way.


Bây giờ, đây là phần thú vị khi bạn phải hợp nhất bản vá lại cho nhánh chính (công khai). Hãy xem xét những cây sửa đổi sau đây C* là vá áp dụng từ C trong ngành thạc sĩ:

A---B---C---D   master, public/master 
    \ 
     E---C*---F  feature_foo 

Bạn có thể sử dụng git-rebase để cập nhật các chi nhánh chủ đề (trong ví dụ này tên feature_foo) với nó là đầu thượng nguồn. Điều đó có nghĩa là khi bạn gõ vào như sau:

git rebase master feature_foo 

Git sẽ sắp xếp lại các cây sửa đổi như thế này và cũng sẽ áp dụng các bản vá chính nó:

A---B---C---D   master, public/master 
      \ 
       E*---F* feature_foo 

sáp nhập vào chi nhánh thượng nguồn bây giờ sẽ là một hợp nhất nhanh về phía trước. Ngoài ra, hãy kiểm tra xem các cam kết mới E*F* có hoạt động tương ứng với EF trước đó không.

Bạn có thể làm điều tương tự với nhánh của nhà phát triển khác bằng các bước tương tự nhưng thay vì thực hiện trên repo công khai, bạn sẽ là fetching sửa đổi từ kho của nhà phát triển. Bằng cách này, bạn sẽ không phải hỏi nhà phát triển khác về một bản vá nếu nó đã có sẵn từ những gì ông đã xuất bản tại repo của mình.

Xin lưu ý rằng không bao giờ rebase một nhánh công cộng vì lệnh sẽ viết lại lịch sử git mà bạn không muốn làm trên các nhánh mà mọi người phụ thuộc và sẽ tạo ra một mớ hỗn độn khi sáp nhập vào kho từ xa. Cũng đừng bao giờ quên integrate often để những người khác trong nhóm của bạn có thể tham gia vào các thay đổi của bạn.

+0

Phát hiện ra sau đó bạn có thể làm điều tương tự với định dạng git-patch để định dạng bản vá và git sáng để áp dụng và cam kết bản vá. Ví dụ: định dạng git-patch -k --stdout R1 ... R2 | git am -3 -k – Spoike

2

Trong SVN bạn chỉ có thể thực hiện thay đổi sau đó trước khi cam, ống đầu ra của diff svn vào một tập tin như vậy

svn diff > mypatch.diff 

sau đó bạn có thể trở lại các thay đổi và áp dụng các bản vá vào một ngày sau sử dụng

patch -p0 -i mypatch.diff 

như mọi khi không mù quáng áp dụng p atches để mã của bạn và luôn luôn kiểm tra chúng đầu tiên.

Bạn cũng có thể thấy rằng bản vá sẽ phá vỡ mã nguồn của bạn nếu các tệp nguồn đã thay đổi đáng kể kể từ khi bản vá được thực hiện.

Bạn cũng không thể đảm bảo rằng sẽ không có xung đột hợp nhất khi bạn cố gắng kiểm tra mã.

2

bzr xử lý gửi một "chỉ thị hợp nhất", có nghĩa là nó sẽ gửi các bản vá cho bạn để bên kia có thể chỉ cần bấm vào nút "OK" để merge và có ít futzing xung quanh với bản vá/áp dụng, vv

chỉ: $ bzr send -o mycode.patch

+0

bzr gửi chỉ tạo ra một chỉ thị hợp nhất giữa hai nhánh khác nhau. Tôi đang tìm cách tạo ra các bản vá lỗi như cam kết đơn lẻ hoặc lựa chọn anh đào và cách hợp nhất hoạt động khi áp dụng các bản vá đó. – Spoike

2

Trong Subversion không có cách nào tốt đẹp để thực hiện việc này. Có, bạn có thể sử dụng bản vá svn diff + nhưng điều này sẽ chỉ trì hoãn các vấn đề của bạn cho đến khi bạn sắp hợp nhất và sau đó rất có thể là bạn đã quên nó.

Cách bạn thực hiện trong Subversion sẽ là tạo chi nhánh, thực hiện cam kết trên nhánh và yêu cầu người nhận bản vá chuyển sang nhánh. Sau đó, bạn có thể hợp nhất các chi nhánh trở lại thân cây theo cách thông thường.

Các vấn đề liên quan