2010-02-07 23 views
35

Tôi muốn tạo bản vá cho 2 bản sửa đổi cuối cùng.Trong git, làm cách nào để tạo một bản vá cho 2 bản chỉnh sửa cuối cùng?

git format-patch -2 

mang lại cho tôi 2 file vá, một cho mỗi phiên bản

git format-patch HEAD~2..HEAD 

cho điều tương tự.

git format-patch -1 HEAD~2..HEAD 

cung cấp một tệp duy nhất, nhưng chỉ chứa thay đổi cho bản sửa đổi mới nhất.

Có cách nào để thực hiện điều này trong git không?

+2

Bạn có thể cho chúng tôi biết thêm về ngữ cảnh của những gì bạn muốn làm không? Bạn có nhận thức được khả năng đè bẹp các cam kết cùng với rebase tương tác không? Nếu vậy, tại sao bạn lại muốn nén một miếng vá mà bạn gửi cho người khác chứ không phải các cam kết tương ứng trong lịch sử của bạn? –

+0

@gbacon: Tôi thực sự đã học về việc rebase ngay sau khi đăng câu hỏi này. Bạn nói đúng rằng đó là một giải pháp tốt hơn cho vấn đề của tôi. Tuy nhiên, nó không thể làm tổn thương để biết làm thế nào để làm điều này. –

+1

@GregBacon: Một điều tôi thường làm là: Làm việc trong một nhánh đặc trưng, ​​với nhiều cam kết nhỏ. Khi đó là thời gian để đẩy nhánh để làm chủ, hãy đánh nó trước. Nhưng trong khi chờ đợi, tôi sử dụng 'git diff master mybranch' để gửi một bản vá để xem xét, trong khi vẫn giữ lại lịch sử cam kết nhỏ của tôi (để tôi sử dụng). –

Trả lời

41
git diff HEAD~2..HEAD > my-patch.diff 

Mặc dù vậy, nó sẽ không có bất kỳ siêu dữ liệu từng cam kết có định dạng vá nào.

+2

Rõ ràng. Điều gì tác giả nên nó có nếu hai cam kết có tác giả khác nhau? Thông báo cam kết cho thay đổi 2 cam kết như thế nào? Ví dụ: –

+0

Lưu ý rằng nếu bạn sử dụng các chi nhánh tính năng, bạn chỉ có thể thực hiện 'git diff master mybranch> my-patch.diff' để tạo bản vá cho nhánh đó. –

0

Bạn có thể làm một cái gì đó như:

 
$ git checkout -b tmp 
$ git reset HEAD~2 
$ git commit -a 

Các cam kết chi nhánh tmp sẽ giống như 2 cá nhân cam kết.

+0

hoặc 'git rebase -i HEAD ~ 2' và bóng quần. – Tobu

+3

Huh, một phiếu bầu xuống trên một câu trả lời tốt hơn 6 tuổi! Đó là một số khảo cổ học nghiêm trọng. Một bình luận sẽ là tốt đẹp để giải thích về chứng hoại tử. –

+0

Tôi không phải là người bỏ phiếu, nhưng tôi cho rằng đó là vì có những cách dễ dàng và an toàn hơn để thực hiện điều đó; 'git reset' có thể loại bỏ thứ gì đó thêm. Việc rebase được đưa ra trong một bình luận sẽ an toàn hơn một chút vì nó ít nhất sẽ nói nếu cây công việc bị bẩn. Điều đó nói rằng, tôi nghĩ câu trả lời này có giá trị. – Smar

32

Sử dụng tùy chọn --stdout và sau đó đưa nó vào một tệp.

Giống như vậy:

git format-patch HEAD~2..HEAD --stdout > changes.patch 

Điều này sẽ giữ cho mỗi cam kết siêu dữ liệu.

+2

Những gì bạn nhận được là tệp mbox (tệp thư nối), không phải tệp vá. Bạn có thể áp dụng nó với 'git am'. Bạn sẽ không thể sử dụng các công cụ chuẩn cho các tệp bản vá. – Tobu

+0

@Tobu: nhưng thường bạn muốn áp dụng các cam kết với 'git am', vì điều đó giữ lại các cam kết như chúng, thay vì một blob mã lớn ... – Smar

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