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.
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.
Câu trả lời:
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ó G
vẻ tốt, bây giờ chúng tôi muốn đồng bộ hóa với đầu master
chi 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ó H
vẻ 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 master
con 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ử!
Bạn có thể làm điều đó, như thế này:
Đó là:
git reset --hard SHA1
git merge branchname
git commit
git push --force remotename branchname
Chỉ cần nhớ rằng git push --force
sẽ 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.)
git push --force
là không an toàn
git merge --abort
và sau đó bạn có thể hợp nhất lại
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