2013-06-11 24 views
7

Tôi có tình trạng này: Làm việc trên một số testBranch trong một thời gian và tôi muốn đồng bộ hóa với thầy vì vậy tôi đã làm testBranch thanh toán git và git merge master/testBranchUndo git fast forward merge

Bây giờ chi nhánh của tôi được đồng bộ hóa với chủ nhưng sau đó tôi phát hiện ra rằng tôi muốn hoàn tác việc hợp nhất và vấn đề đó là hợp nhất được thực hiện với tiến nhanh và giờ đây lịch sử cam kết của tôi được trộn lẫn với các commit chính và các cam kết testBranch và tôi không biết cách hoàn nguyên về trạng thái trước khi hợp nhất vào testBranch của tôi.

Nhờ sự giúp đỡ

+0

Cam kết có được hợp nhất từ ​​'master/testBranch' có vị trí * ở đầu * của' testBranch' của bạn hay bạn đã quản lý để ghi lại một số cam kết cục bộ của riêng bạn trên những gì đã được hợp nhất? Cách phục hồi phụ thuộc nhiều vào điều này. – kostix

Trả lời

4

Nếu bạn biết về một phiên bản mà bạn muốn testBranch địa phương của bạn, nó cũng đơn giản như:

git checkout testBranch 
git reset --hard <revision> 

Nếu bạn có những thay đổi trộn lẫn trong tương tự (lâu đời nhất trên đỉnh):

<point> 
<your_change_a> 
<change_from_someone_else> 
<your_change_b> 
<testBranch> 

Bạn có thể:

git checkout testBranch 
git reset --hard <point> 
git cherry-pick <your_change_a> 
git cherry-pick <your_change_b> 
+1

Điều này sẽ hoạt động. Tôi cũng khuyên bạn nên sử dụng trình xem đồ họa Git như gitg hoặc gitk để có cái nhìn tổng quan về những thay đổi bạn muốn hoàn tác. – RyPeck

+1

Cảm ơn câu trả lời của bạn, nhưng tôi đã tìm thấy một giải pháp khác (tôi đã không thử của bạn nhưng tôi cho rằng nó hoạt động). Giải pháp được tìm thấy trong blog này: http://blog.tplus1.com/blog/2011/09/23/undo-a-fast-forward-git-merge/ ... hy vọng nó giúp người khác đến :) .. –

16

git reflog show testBranch

sẽ hiển thị quá trình hợp nhất Chuyển tiếp nhanh làm mục cuối cùng ({0}). Sau khi thực hiện chắc chắn đây là trường hợp, kiểm tra testBranch và sau đó chỉ cần làm

git reset --keep [email protected]{1}

để trở lại trạng thái trước đó.

+0

Đây là một câu trả lời hay. Tôi sẽ thêm rằng điều quan trọng là phải đảm bảo bạn kiểm tra testBranch trước khi chạy 'git reset' – jbll

+0

Cách tiếp cận dễ hiểu và dễ hiểu! Điều này sẽ được đánh dấu là câu trả lời – anthonymonori