Hoàn tác git stash pop dẫn đến xung đột hợp nhất


519

Tôi bắt đầu thực hiện các thay đổi cho cơ sở mã của mình, không nhận ra tôi đang ở trong một nhánh chủ đề cũ. Để chuyển chúng, tôi muốn bỏ chúng và sau đó áp dụng chúng cho một nhánh mới của chủ. Tôi đã từng git stash popchuyển các thay đổi đang thực hiện sang chi nhánh mới này, quên rằng tôi chưa kéo các thay đổi mới thành chủ trước khi tạo chi nhánh mới. Điều này dẫn đến một loạt các xung đột hợp nhất và mất một đống sạch các thay đổi của tôi (kể từ khi tôi sử dụng pop).

Khi tôi tạo lại nhánh mới một cách chính xác, làm thế nào tôi có thể khôi phục các thay đổi được lưu trữ của mình để áp dụng chúng đúng cách?

Câu trả lời:


656

Hóa ra, Git đủ thông minh để không bỏ rơi nếu không áp dụng sạch. Tôi đã có thể đến trạng thái mong muốn với các bước sau:

  1. Để giải quyết các xung đột hợp nhất: git reset HEAD .(lưu ý dấu chấm)
  2. Để lưu hợp nhất xung đột (chỉ trong trường hợp): git stash
  3. Để trở về với chủ: git checkout master
  4. Để lấy những thay đổi mới nhất: git fetch upstream; git merge upstream/master
  5. Để sửa chi nhánh mới của tôi: git checkout new-branch; git rebase master
  6. Để áp dụng các thay đổi được lưu chính xác (hiện là thứ 2 trên ngăn xếp): git stash apply stash@{1}

14
Cảm ơn vô cùng! # 6 thực sự là câu trả lời tôi đang tìm kiếm. Có thể thêm một git stash dropbước cuối cùng để loại bỏ rác không mong muốn từ # 2.
austinmarton

1
# 2 sẽ không hoạt động nếu có các đường dẫn không được trộn, thay vào đó, nó sẽ xuất ra lỗi được mô tả ở đây: stackoverflow.com/questions/5483213/
Étienne

5
Không hoàn toàn đúng - Git sẽ giữ stash trong danh sách stash nếu không áp dụng sạch. Xem các tài liệu này về git stash pop: "Áp dụng trạng thái có thể thất bại với xung đột; trong trường hợp này, nó không bị xóa khỏi danh sách stash. Bạn cần giải quyết xung đột bằng tay và gọi git stash dropthủ công sau đó." ( git-scm.com/docs/git-stash )
Carolyn Conway

4
Lạ thế nào câu trả lời này và câu hỏi được đăng tải trên chính xác phút cùng
gọi tôi

14
@ call-me Đây là điều tôi nghĩ mọi người nên làm thường xuyên hơn! Lưu ý cách biểu mẫu "Đặt câu hỏi" có một hộp kiểm cho phép bạn trả lời câu hỏi của chính mình trong cùng một hình thức :). Điều này đôi khi xảy ra với tôi khi tôi đang trong quá trình soạn thảo một câu hỏi đang làm tôi bối rối, nhưng khi cố gắng điều chỉnh câu hỏi để có ích cho StackOverflow, cuối cùng tôi đã tìm ra giải pháp. Cách đây một thời gian, vì vậy tôi không nhớ nếu đó là trường hợp ở đây, nhưng tôi đoán đó là những gì đã xảy ra.
acjay

340

May mắn git stash popkhông không thay đổi stash trong trường hợp có mâu thuẫn!

Vì vậy, không có gì, để lo lắng, chỉ cần làm sạch mã của bạn và thử lại.

Giả sử cơ sở mã của bạn đã sạch trước đó, bạn có thể quay lại trạng thái đó với: git checkout -f
Sau đó, hãy làm những thứ bạn đã quên, ví dụ: git merge missing-branch
Sau đó, chỉ cần bắn git stash poplại và bạn nhận được cùng một thứ , đó là xung đột trước đó.

Chú ý: Stash là an toàn, tuy nhiên, những thay đổi không được cam kết trong thư mục làm việc thì không. Họ có thể bị rối tung lên.


16
Điều tôi hiểu là bạn chỉ cần dọn dẹp và bật lại, nhưng bạn không thể hoàn tác nó. Nếu pop bị trộn lẫn với các thay đổi không được cam kết khác, thì bạn phải dọn dẹp thủ công.
haridsv

Đây là một giải pháp rất đơn giản và làm việc tuyệt vời cho tôi. Nó giả định rằng bạn có thể hoàn nguyên mọi thứ đã thay đổi cục bộ (không có thay đổi nào trước / sau khi stash được bật lên) mà tôi nghĩ là phù hợp với hầu hết các tình huống. Nếu bạn cần lưu một số thay đổi bổ sung đã xảy ra trước khi nhận ra rằng đây là sự cố, bạn sẽ có thể cam kết các tệp đó trước khi buộc thanh toán trong hầu hết các trường hợp.
Dự án707

Đây không phải là trường hợp của tôi. Tôi gọi git stash popnó là cố gắng tự động hợp nhất, xung đột và giữ nó.
Trevor Hickey

1
@TrevorHickey Điểm của câu trả lời này là stash vẫn như trong trường hợp có xung đột, mà bạn có thể gọi git stash popthường xuyên như bạn cần cho đến khi nó kết thúc mà không có xung đột. Vì vậy, sau cuộc xung đột của bạn, vâng, thư mục làm việc đang bị rối, tuy nhiên, bạn có thể dọn sạch nó và gọi git stash poplại.
flori

5
Lệnh này để hoàn tác stash cuối cùng được áp dụng rất hữu ích : git checkout -f!
Lefi Tarik

16

Hướng dẫn ở đây hơi phức tạp vì vậy tôi sẽ cung cấp một cái gì đó đơn giản hơn:

  1. git reset HEAD --hard Từ bỏ tất cả các thay đổi đối với chi nhánh hiện tại

  2. ... Thực hiện công việc trung gian khi cần thiết

  3. git stash pop Bật lại stash một lần nữa vào một ngày sau đó khi bạn đã sẵn sàng



8
git checkout -f

phải làm việc, nếu trạng thái trước đó của bạn sạch sẽ.

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.