Phục hồi hợp nhất Git


225
develop branch
--> dashboard (working branch)

Tôi sử dụng git merge --no-ff developđể hợp nhất mọi thay đổi ngược dòng vào bảng điều khiển

nhật ký git:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

Hợp nhất có khoảng hơn 50 cam kết trong đó và tôi tự hỏi làm thế nào để hoàn nguyên hợp nhất để bảng điều khiển quay trở lại trạng thái hợp nhất trước

Phần thứ hai của điều này là, nếu tôi không hợp nhất với --no-ff, tôi sẽ không nhận được cam kết ' Hợp nhất chi nhánh' phát triển 'thành bảng điều khiển ' .. Làm thế nào để tôi quay lại hợp nhất?


3
Có thể trùng lặp hoàn tác hợp nhất Git? .

Câu trả lời:


320

Hoàn nguyên một cam kết hợp nhất đã được đề cập thấu đáo trong các câu hỏi khác. Khi bạn thực hiện hợp nhất chuyển tiếp nhanh, lần thứ hai bạn mô tả, bạn có thể sử dụng git resetđể quay lại trạng thái trước đó:

git reset --hard <commit_before_merge>

Bạn có thể tìm thấy <commit_before_merge>với git reflog, git loghoặc, nếu bạn cảm thấy moxy (và chưa làm gì khác):git reset --hard HEAD@{1}


6
cảm ơn vì đã trả lời nhanh .. nhìn vào nhật ký git, cam kết trước khi hợp nhất là 50+ cam kết trở lại, vì sự hợp nhất git phát triển thực sự đặt trong tất cả các cam kết khác. Tôi đoán những gì tôi không nhận được là, nếu tôi không biết sự hợp nhất đó ở đâu - làm thế nào để tôi tìm thấy nó? Bạn đề cập đến việc tìm kiếm commit_b Before_merge .. Tôi đoán tôi không hiểu phần đó
cgmckeever

4
có vẻ như với git reflog trông giống như nó tóm tắt những cái đầu cuối một cách độc đáo, và cho phép tôi biết nơi tôi cần đặt lại. git log dường như có quá nhiều độ chi tiết để xác định vị trí cần đặt lại. Cảm ơn
cgmckeever

1
Vâng, reflog'một phao cứu sinh. HEAD@{1}chỉ mô tả trạng thái gần đây thứ hai của HEAD, hoặc kỹ thuật hơn: "Một ref được theo sau bởi hậu tố @ với một đặc tả thứ tự được đặt trong một cặp giằng (ví dụ {1}, {15}) chỉ định giá trị trước đó của n tham khảo. "
Christopher

4
Điều gì về việc đẩy hoàn nguyên đến điều khiển từ xa? Tôi không thấy nó sẽ hoạt động như thế nào.
Anton Savelyev

2
Đây là vô vọng. Nó phá hủy tất cả các cam kết sau khi hợp nhất.
aaa90210

151

Từ đây:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

Git Revert thêm một cam kết mới khôi phục lại cam kết đã chỉ định.

Sử dụng -m 1 cho nó biết rằng đây là một sự hợp nhất và chúng tôi muốn quay trở lại cam kết cha mẹ trên nhánh chính. Bạn sẽ sử dụng -m 2 để chỉ định nhánh phát triển.


30
Lưu ý rằng bạn không thể hợp nhất lại chi nhánh sau đó, vì các tài liệu nói: "Hoàn nguyên một cam kết hợp nhất tuyên bố rằng bạn sẽ không bao giờ muốn các thay đổi cây do hợp nhất mang lại. Do đó, việc hợp nhất sau này sẽ chỉ mang lại các thay đổi về cây bởi các cam kết không phải là tổ tiên của hợp nhất được hoàn nguyên trước đó. Điều này có thể hoặc không thể là những gì bạn muốn. "
Dalibor Karlović

23
@ DaliborKarlović Câu nói đó hơi khắc nghiệt. Bạn chắc chắn có thể mang lại những thay đổi đó sau, mẹo là hoàn nguyên cam kết hoàn nguyên. Thông tin thêm ở đây trong phần "Hoàn nguyên hoàn nguyên"
Hilikus

3
Đáng buồn thay, hereliên kết trong bình luận @Hilikus không còn hiệu lực. Trang web tuyên bố nội dung đã được chuyển đến một cuốn sách ( git-scm.com/book/en/v2 ) nhưng nếu vậy, việc xác định vị trí trong đó là không tầm thường.
Jesse Chisholm

@ DaliborKarlović đây có phải là trường hợp câu trả lời ở trên từ @Christopher?
James B

3
Nội dung hợp nhất hoàn tác đã được chuyển đến đây
SEK

28

Chỉ cần đặt lại cam kết hợp nhất với git reset --hard HEAD^.

Nếu bạn sử dụng --no-ff git luôn tạo ra một sự hợp nhất, ngay cả khi bạn không cam kết bất cứ điều gì ở giữa. Nếu không có --no-ff git sẽ chỉ tiến nhanh, có nghĩa là các nhánh của bạn sẽ được đặt thành CHÍNH của nhánh được hợp nhất. Để giải quyết vấn đề này, hãy tìm id xác thực mà bạn muốn hoàn nguyên và git reset --hard $COMMITID.


1
Giải pháp tốt nếu bạn không biết cam kết trước khi hợp nhất.
iglesiasedd

Làm việc cho tôi vì tôi không biết id id. 1
Anant Singh --- Sống đến

nếu hợp nhất không mong muốn đã được cam kết từ xa, tôi đã sử dụng git push -f để cập nhật nhánh từ xa sau khi hoàn nguyên.
zumek

16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

Nhưng có thể có tác dụng phụ không mong muốn. Xem --mainline parent-numbertùy chọn trong git-scm.com/docs/git-revert

Có lẽ một cách đơn giản nhưng hiệu quả sẽ là kiểm tra cha mẹ bên trái của cam kết đó, tạo một bản sao của tất cả các tệp, kiểm tra HEADlại và thay thế tất cả nội dung bằng các tệp cũ. Sau đó, git sẽ cho bạn biết những gì đang được khôi phục và bạn tạo cam kết hoàn nguyên của riêng bạn :)!


1
+1 vì câu trả lời này không gây rối với lịch sử như thiết lập lại (thực sự quan trọng nếu bạn đã được đẩy đến từ xa). Nhưng những tác dụng phụ bất ngờ tôi nên mong đợi?
pedromanoel

3
Đây có phải là tác dụng phụ bạn đã đề cập? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
pedromanoel

1
Bạn nói git resetlà giải pháp, nhưng cũng đề cập rằng nó có thể có tác dụng phụ không mong muốn. Tuy nhiên, liên kết đó là từ git revertchứ không phải git reset:)
Đánh dấu

2
Xin lưu ý, git reset không có cờ -m. Cũng lưu ý @JorgeOrpinel tham chiếu các tài liệu git-Revert, không phải git-reset. Tôi nghĩ anh ta có ý nói git revertkhônggit reset
Devin Gleason Lambert

Cách tránh Mainline đã được chỉ định nhưng cam kết 1234xyz không phải là lỗi hợp nhất .
Achal

0

Nếu bạn đã hợp nhất nhánh, sau đó hoàn nguyên hợp nhất bằng cách sử dụng yêu cầu kéo và hợp nhất yêu cầu kéo đó để hoàn nguyên.

Cách dễ nhất tôi cảm thấy là:

  1. Lấy ra một nhánh mới từ phát triển / chủ (nơi bạn đã hợp nhất)
  2. Hoàn nguyên "hoàn nguyên" bằng cách sử dụng git revert -m 1 xxxxxx(nếu hoàn nguyên được hợp nhất bằng cách sử dụng một nhánh) hoặc sử dụng git revert xxxxxxnếu đó là một hoàn nguyên đơn giản
  3. Chi nhánh mới bây giờ sẽ có các thay đổi bạn muốn hợp nhất lại.
  4. Thay đổi hoặc hợp nhất chi nhánh này để phát triển / làm chủ
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.