Nhìn vào biểu đồ cam kết của bạn (với gitk hoặc một chương trình tương tự). Bạn sẽ thấy các xác nhận từ yêu cầu kéo và bạn sẽ thấy các cam kết của riêng bạn và một cam kết hợp nhất (nếu đó không phải là một hợp nhất chuyển tiếp nhanh). Bạn chỉ cần tìm các cam kết cuối cùng của riêng mình trước khi hợp nhất và đặt lại chi nhánh cho cam kết này.
(Nếu bạn có reflog của chi nhánh, việc tìm kiếm cam kết trước khi hợp nhất sẽ dễ dàng hơn nữa.)
(Chỉnh sửa sau khi có thêm thông tin trong bình luận :)
Được rồi, hãy nhìn vào biểu đồ:
Tôi giả sử cam kết cuối cùng (ngoài cùng bên phải) là sự hợp nhất sai của bạn bằng yêu cầu kéo , đã hợp nhất dòng màu xanh nhìn thấy ở đây. Cam kết tốt cuối cùng của bạn sẽ là lần trước trên dòng màu đen, ở đây được đánh dấu màu đỏ:
Đặt lại cam kết này, và bạn sẽ ổn thôi.
Điều này có nghĩa là, trong bản sao làm việc tại địa phương của bạn, hãy làm điều này (sau khi đảm bảo rằng bạn không còn những thứ không được cam kết nữa, ví dụ như bởi git stash):
git checkout master
git reset --hard 7a62674ba3df0853c63539175197a16122a739ef
gitk
Bây giờ hãy xác nhận rằng bạn thực sự đang thực hiện cam kết mà tôi đã đánh dấu ở đó và bạn sẽ không thấy bất kỳ thứ gì được kéo trong tổ tiên của nó.
git push -f origin master
(nếu điều khiển từ xa github của bạn được đặt tên origin
- khác thay đổi tên).
Bây giờ mọi thứ sẽ nhìn đúng trên github, quá. Các cam kết vẫn sẽ nằm trong kho lưu trữ của bạn, nhưng không thể truy cập được bởi bất kỳ chi nhánh nào, do đó sẽ không gây hại gì ở đó. (Và tất nhiên chúng sẽ vẫn còn trên kho của RogerPaladin.)
(Có thể có một cách cụ thể chỉ dành cho web của Github để làm điều tương tự, nhưng tôi không quá quen thuộc với Github và hệ thống quản lý yêu cầu kéo của nó.)
Lưu ý rằng nếu bất kỳ ai khác có thể đã kéo chủ của bạn với cam kết sai, thì họ sẽ gặp vấn đề tương tự như bạn hiện có và không thể thực sự đóng góp lại. trước khi đặt lại phiên bản chính mới của bạn.
Nếu có khả năng điều này xảy ra hoặc đơn giản là bạn muốn tránh mọi vấn đề, hãy sử dụng git revert
lệnh thay vìgit reset
, để hoàn nguyên các thay đổi bằng một cam kết mới, thay vì đặt lại về một lỗi cũ. (Một số người nghĩ rằng bạn không bao giờ nên thiết lập lại với các chi nhánh đã xuất bản.) Xem các câu trả lời khác cho câu hỏi này về cách thực hiện việc này.
Cho tương lai:
Nếu bạn chỉ muốn một số cam kết của chi nhánh RogerPaladin, hãy cân nhắc sử dụng cherry-pick
thay vì merge
. Hoặc liên lạc với RogerPaladin để chuyển chúng đến một chi nhánh riêng và gửi yêu cầu kéo mới.