Làm cách nào tôi có thể định dạng bản vá với những gì tôi bỏ đi


140

Trong git, tôi bỏ đi những thay đổi của mình. Có thể là tôi có thể tạo ra một bản vá với những gì tôi bỏ đi? Và sau đó áp dụng bản vá đó trong một số kho lưu trữ khác (đồng nghiệp của tôi)?

Tôi biết git format-patch -1, nhưng tôi nghĩ rằng đó là vì những gì tôi đã cam kết. Nhưng tôi đang tìm kiếm điều tương tự cho những thay đổi mà tôi đã bỏ đi.

Và làm thế nào tôi có thể áp dụng một bản vá trong kho lưu trữ khác?

Câu trả lời:


155

Chắc chắn, git stash showhỗ trợ này:

git stash show -p

Vì vậy, sử dụng

git stash list

để tìm ra số lượng stash mà bạn muốn xuất dưới dạng bản vá, sau đó

git stash show -p stash@{<number>} > <name>.patch

để xuất khẩu nó.

Ví dụ:

git stash show -p stash@{3} > third_stash.patch

1
Tôi có một câu hỏi liên quan về việc áp dụng một bản vá. Giả sử bản vá của tôi chạm vào nhiều tệp. Có cách nào để áp dụng bản vá 'tương tác' không? Chọn tập tin nào của bản vá tôi nên áp dụng bản vá? Tôi có thể làm điều đó?
Silverburgh

1
@silverburgh: Tôi đã xem qua nhanh man patchvà tôi không thấy bất kỳ tùy chọn nào cho ứng dụng vá tương tác. Tuy nhiên, vì các tệp vá là chính các tệp văn bản đơn giản, thông thường những gì người ta sẽ làm là chỉnh sửa bản vá trong trình chỉnh sửa văn bản để cắt bỏ các phần có liên quan để áp dụng patch. Cách khác, nếu bạn đang áp dụng bản vá vào kho lưu trữ Git khác, bạn có thể áp dụng tất cả và sau đó chọn lọc git checkoutcác tệp mà bạn không muốn thay đổi ( git checkoutvới tên tệp sẽ loại bỏ các thay đổi không được thực hiện).
Greg Hewgill

1
@silverburgh bạn có thể hạn chế tập hợp các tệp được vá bằng cách sử dụng thông số "--exclude" và "--include" của git.
Kelvin

@silverburgh bạn có thể làm như sau giả sử bạn có một bản vá. áp dụng các bản vá đầy đủ và sau đó làm git add --interactive ${YOUR_FILES}và nó sẽ cho bạn cơ hội để cam kết một phần.
Alex

15
Cảm ơn. Điều này làm việc cho tôi:git stash show -p stash@{1} > patch.txt
Ryan

63

Câu trả lời này cung cấp thông tin về cả việc lưu bản vá và áp dụng nó ở nơi bạn muốn sử dụng.

Để bỏ đầu ra trong một tệp:

 git stash show -p --color=never > my-patch-name.patch

Xác nhận bản vá có vẻ tốt:

git apply --stat my-patch-name.patch

Xác nhận không có lỗi:

git apply --check my-patch-name.patch

Áp dụng các bản vá

git apply my-patch-name.patch

Cái này làm việc cho tôi với các tệp mã văn bản đơn giản, nhưng tôi phải tính đến khoảng trắng. Xác minh bản vá có vẻ tốt: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch Áp dụng bản vá: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland

Giải thích hay và súc tích. Để nó hoạt động, tôi phải ở trong repo root khi áp dụng bản vá, người khác git applyđã không nhận diff.
Tối đa

16

Sử dụng

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

để có được một danh sách các công cụ được sắp xếp gần đây của bạn. Git thực sự tạo ra các đối tượng cam kết khi bạn stash.

Họ cam kết như mọi thứ khác. Bạn có thể kiểm tra chúng trong một chi nhánh:

$> git checkout -b with_stash stash@{0}

Sau đó, bạn có thể xuất bản chi nhánh này và đồng nghiệp của bạn có thể hợp nhất hoặc chọn lấy cam kết đó.


13

Các giải pháp trên sẽ không hoạt động đối với dữ liệu nhị phân. Sau đây thêm hỗ trợ cho nó:

git stash show stash@{0} -p --binary

Biên tập

Lưu ý: Tôi chỉ muốn thêm một bình luận để trả lời ở trên nhưng danh tiếng của tôi là không đủ.


3

Tôi tin rằng đây có thể là một trong những udpates từ Git gần đây. bạn không phải vá những thay đổi mà bạn đã bỏ đi nữa. bạn chỉ có thể áp dụng các thay đổi được lưu trữ của mình trên một nhánh khác.

nói trên nhánh A bạn đã bỏ đi một số thay đổi, được gọi là stash @ {1}.

bây giờ bạn chuyển sang chi nhánh B. bạn chỉ có thể làm:

$git stash apply stash@{1}

điều này áp dụng chi nhánh A của bạn thay đổi lên chi nhánh B.

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.