Có cách nào để làm lại một sự hợp nhất trong git?


17

Vì vậy, tôi đã phạm một sai lầm khá lớn. Tôi đã thực hiện một cam kết, kéo, sáp nhập (nhưng làm rối mã trong khi làm như vậy) và sau đó đẩy. Tôi muốn làm lại sự hợp nhất đó và lấy mã đúng. Có cách nào để làm điều này?

Tôi sử dụng bitbucket.

git 

10
Chỉ cần một lưu ý - đây thực sự là chủ đề về SO, và không nên được di chuyển. Thỉnh thoảng hãy thử đọc các trang trợ giúp của riêng bạn và lưu ý các công cụ phần mềm thường được các lập trình viên sử dụng . Điều đó nói rằng, nó cũng thuộc chủ đề ở đây - SwiftCore, đừng cảm thấy tồi tệ vì nó đã được di chuyển, đó không phải là lỗi của bạn.
Bob

Câu trả lời:


13

Không chắc đây có phải là cách "may mắn" để làm điều đó không, nhưng đây là những gì tôi đã làm để giải quyết vấn đề tương tự mà không phải "ép buộc" hay bất cứ điều gì thô thiển như thế.

Giả sử lịch sử của bạn trông giống như thế này (và M là hợp nhất hoàn hảo):

-A--B--C--M (master points here)
  \      /
   D----E

Chạy git checkout -b merge_fix <commit ID E>tạo ra một nhánh trước khi chúng tôi thực hiện bất kỳ sai lầm:

-A--B--C--M (master points here)
  \      /
   D----E (HEAD and merge_fix point here)

Bây giờ, hãy thực hiện lại việc hợp nhất trên chi nhánh mới của chúng tôi. Chúng ta không thể hợp nhất master, vì vậy chúng ta cần chọn thủ công trước khi hợp nhất xấu: git merge <commit ID C>Đừng phạm sai lầm giống như lần trước bạn đã làm!

-A--B--C--M (master points here)
  \      X
   D----E-G (HEAD and merge_fix point here)

Giả sử rằng cam kết có Gvẻ tốt, bây giờ chúng tôi muốn đồng bộ hóa với đầu masterchi nhánh. Lệnh này yêu cầu git bỏ qua các thay đổi đã được thực hiện để làm chủ và buộc các thay đổi của chúng tôi trở thành kết quả hợp nhất:git merge -s ours master

-A--B--C--M (master points here)
  \      X  \
   D----E-G--H (HEAD and merge_fix point here)

Cuối cùng, (một lần nữa giả định rằng cam kết có Hvẻ tốt, chúng tôi muốn chuyển tiếp nhanh masterđể bao gồm hợp nhất cố định của chúng tôi:

git checkout master
git merge merge_fix

Điều này thực sự chỉ di chuyển mastercon trỏ nhánh tới H, nhưng tôi sẽ tận dụng cơ hội để làm sạch nghệ thuật ASCII của mình một chút:

-A--B--C--M--H (HEAD, master, and merge_fix all point here)
  \      X  /
   D----E--G

Và bạn có nó rồi đấy! bạn đã thực hiện lại hợp nhất thành công mà không làm mất hiệu lực lịch sử!


6

Bạn có thể làm điều đó, như thế này:

  1. Đặt lại cam kết trước khi hợp nhất của bạn.
  2. Thực hiện hợp nhất một lần nữa
  3. Lực đẩy

Đó là:

git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname

Chỉ cần nhớ rằng git push --forcesẽ viết lại bất cứ điều gì bạn có ở chi nhánh từ xa và những người khác sử dụng chi nhánh đó cũng có thể bị ảnh hưởng bởi điều này. (Thông thường bạn không nên làm điều này.)


6
Chỉ cần nhớ làm git push --forcelà không an toàn
Zepplock

1

git merge --abort và sau đó bạn có thể hợp nhất lại


Tôi vừa nhận được thông báo "không có hợp nhất để hủy bỏ"

3
Điều này chỉ có thể được thực hiện khi có xung đột hợp nhất.
chanchal118

Tại sao lại trừ đi một? Điều này đã giúp tôi.
swdev

Bởi vì câu hỏi là về khi bạn đã hoàn thành việc hợp nhất (không chính xác) và đẩy.
Robin Green

-1

Vui lòng kiểm tra hy vọng nó hữu ích cho bạn

https://www.kernel.org/pub/software/scm/git/docs/howto/revert-branch-rebase.html

Mặc dù điều này có thể trả lời câu hỏi OP, nhưng câu trả lời chỉ liên kết không được chấp nhận tốt trên SO. Tuy nhiên, bạn có thể trích dẫn trong câu trả lời của bạn hầu hết các trích đoạn có liên quan từ liên kết.

Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Pranav
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.