Làm cách nào để kết thúc hợp nhất sau khi giải quyết xung đột hợp nhất?


282

Tôi đã đọc Phân nhánh và Hợp nhất cơ bản của Sách cộng đồng Git.

Vì vậy, tôi làm theo nó và tạo một nhánh: experimental .

Sau đó tôi:

  1. chuyển sang nhánh thử nghiệm (git checkout thử nghiệm)
  2. tạo ra một loạt các thay đổi
  3. cam kết nó (git commit -a)
  4. chuyển sang chi nhánh chính (git checkout master)
  5. thực hiện một số thay đổi và cam kết ở đó
  6. chuyển về thử nghiệm (thử nghiệm git)
  7. hợp nhất thay đổi tổng thể thành thử nghiệm (git merge master)
  8. có một số xung đột nhưng sau khi tôi giải quyết chúng, tôi đã 'git add myfile'

  9. Và bây giờ tôi bị mắc kẹt, tôi không thể quay trở lại làm chủ

khi tôi làm

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

và tôi đã:

$ git rebase --abort

Không có rebase trong tiến trình?

và tôi đã :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Tôi có thể làm gì để tôi có thể quay lại chi nhánh chính của mình?


Sau khi tôi khắc phục xung đột, thực hiện thêm và sau đó thử thực hiện cam kết với git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", kết quả là fatal: cannot do a partial commit during a merge.. Và tất nhiên, "Cam kết một phần" dường như không được ghi lại hoặc thảo luận ở bất cứ đâu trong các trang git man. Thực hiện git mergesau khi sửa kết quả trong Please, commit your changes before you can merge.Công cụ ass bị hỏng ...
jww

2
cam kết git với các đường dẫn rõ ràng được ghi lại trong trang chủ trong MÔ TẢ "là" 3. bằng cách liệt kê các tệp làm đối số cho lệnh commit, trong trường hợp đó, cam kết sẽ bỏ qua các thay đổi được dàn dựng trong chỉ mục và thay vào đó ghi lại nội dung hiện tại của các tệp được liệt kê (phải được biết đến với Git); "và cả trong '- -only 'tùy chọn. Tôi khá chắc chắn rằng thông điệp hợp nhất được viết bởi một người giả định rằng bạn đã đọc cách lệnh commit hoạt động và có thể nhận ra ý nghĩa của từ "một phần" trong mô tả đó, nếu không thì ít nhất là sau đó . một lần nữa và cẩn thận hơn @jww
jthill

1
Vì vậy, tại sao nghiên cứu trường hợp đó đáng để đọc cẩn thận để hiểu, sau đó, trong khi các trang web không? @jww
jthill

1
Chà, sử dụng git rõ ràng đòi hỏi khả năng đọc hiểu tốt hơn bạn chuẩn bị có được. Tôi thậm chí có thể không chắc chắn rằng đó là một lỗi trong git hơn bạn chắc chắn đó là.
jthill

1
Với Git 2.12 (Q1 2017), bạn sẽ sớm thực hiện một git merge --continue. Xem câu trả lời của tôi dưới đây
VonC

Câu trả lời:


267

Khi có xung đột trong quá trình hợp nhất, bạn phải hoàn thành thủ công hợp nhất. Có vẻ như bạn đã thực hiện hai bước đầu tiên, để chỉnh sửa các tệp bị xung đột và sau đó chạy git addtrên chúng để đánh dấu chúng là đã được giải quyết. Cuối cùng, bạn cần phải thực sự cam kết hợp nhất với git commit. Tại thời điểm đó, bạn sẽ có thể chuyển đổi chi nhánh một lần nữa.


Nếu bạn sử dụng "git gui &" để thực hiện cam kết - bạn có thể không nhận ra trạng thái chi nhánh của mình không còn "hợp nhất". Theo dõi "trạng thái git" là hữu ích để đảm bảo trạng thái chi nhánh của bạn là chính xác.
Tony Ashworth

4
Cố gắng git commit -am "your commit message"thực hiện thêm và cam kết đồng thời.
vaheed

3
git commitlàm việc. Và tốt nhất là sử dụng nó để nhận thông điệp cam kết hợp nhất mặc định cho bạn. Tôi tránh `git commit -am" vì nó sẽ ghi đè tin nhắn
Arijoon

1
Hãy thử git push.
alper

Tôi đã gặp tình huống này trong kịch bản dưới đây -> Tôi đã hợp nhất nhánh X với nhánh Y. Sau đó tôi nhận ra mình đã làm gì đó sai ở nhánh Y, vì vậy tôi đã sửa nó và sau đó tôi "sửa đổi" những thay đổi của mình trong nhánh Y. Vì sửa đổi git đã không tạo ra cam kết mới. Vì vậy, khi tôi hợp nhất nhánh X với nhánh Y được cập nhật, nó đã tạo ra xung đột. Cảm ơn BTW vì câu trả lời này.
doga

157

Làm cách nào để kết thúc hợp nhất sau khi giải quyết xung đột hợp nhất?

Với Git 2.12 (Q1 2017), bạn sẽ có lệnh tự nhiên hơn:

git merge --continue

Xem cam kết c7d227d (ngày 15 tháng 12 năm 2016) của Jeff King ( peff) .
Xem cam kết 042e290 , cam kết c261a87 , cam kết 367ff69 (14 tháng 12 năm 2016) của Chris Packham ( cpackham) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 05f6e1b , ngày 27 tháng 12 năm 2016)

Xem 2.12 ghi chú phát hành .

merge: thêm --continuetùy chọn '' làm từ đồng nghĩa cho ' git commit'

Dạy ' git merge'--continue tùy chọn cho phép 'tiếp tục' hợp nhất bằng cách hoàn thành nó.
Cách truyền thống để hoàn thành hợp nhất sau khi giải quyết xung đột là sử dụng ' git commit'.
Bây giờ với các lệnh như ' git rebase' và ' git cherry-pick' có --continuetùy chọn '' thêm tùy chọn như vậy vào ' git merge' sẽ hiển thị giao diện người dùng nhất quán.


Tôi đã sẵn sàng đăng một bình luận về cách gần đây đã được thêm vào 2.12 trong Q1 2017, nhưng sau đó tôi đọc lại dòng đầu tiên của câu trả lời của bạn. Không có gì ngạc nhiên khi tùy chọn không được tìm thấy cho tôi trên phiên bản 2.10!
cjsimon

1
Tôi đã thử git merge - liên tục và Git Bash không thể nhận ra đó là một lệnh. Nhưng những gì đã làm việc là git commit -m "Thông điệp cam kết"
Mimi

2
@Mimi OK, nhưng bạn có đang sử dụng Git 2.12 trở lên không?
VonC

@VonC bạn đúng rồi, tôi đang sử dụng phiên bản Git cũ hơn!
Mimi

23

Trong trường hợp bạn bị kẹt trong quá trình hợp nhất / rebase, bạn luôn có thể

git reset --hard

để khôi phục công việc của bạn về trạng thái của cam kết cuối cùng. Điều này sẽ làm mất các thay đổi của bạn từ cây làm việc, vì vậy nếu bạn có các sửa đổi cục bộ trước khi hợp nhất thì chúng sẽ biến mất sau điều này, đó là lý do tại sao không nên bắt đầu hợp nhất khi bạn có sửa đổi cục bộ. :)


15
cảnh báo bắt buộc: git reset --hardvứt bỏ những thay đổi không được cam kết
Geoffrey Hale

2
Tại sao không chỉ git merge --abort, mà không có nguy cơ mất bất cứ điều gì?
Alexander George

11

Chỉ git commitcó nó

Tùy chọn git abortnó:
Tôi chạy vào một cuộc xung đột hợp nhất. Làm thế nào tôi có thể hủy bỏ hợp nhất?

Để làm cho cuộc sống dễ dàng hơn với việc hợp nhất cài đặt kdiff3 và cấu hình nó như là một sự hợp nhất. Hướng dẫn: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolve-use-the-command-line/

Trang đó chứa video này: https://www.youtube.com/watch?v=Cc4xPp7Iuzo


11

Bất cứ khi nào bạn hợp nhất hai nhánh bằng lệnh git merge brancha branchb, có hai khả năng:

  1. Một nhánh (giả sử Brancha) có thể được nhánh kia (nhánh nói) có thể tiếp cận bằng cách theo lịch sử cam kết của nó. Trong trường hợp này, git chỉ cần chuyển nhanh đầu để trỏ đến nhánh gần đây (trong trường hợp này là nhánh).

    2.Nhưng nếu hai nhánh đã chuyển hướng tại một số điểm cũ hơn thì git sẽ tạo một ảnh chụp nhanh mới và thêm một cam kết mới trỏ đến nó. Vì vậy, trong trường hợp không có xung đột giữa các nhánh bạn đang hợp nhất, git sẽ tạo ra một cam kết mới.

Chạy git logđể xem cam kết sau khi bạn đã hợp nhất hai nhánh không xung đột.

Bây giờ trở lại trường hợp thú vị khi có xung đột hợp nhất giữa các nhánh sáp nhập. Tôi trích dẫn điều này từ trang https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git chưa tự động tạo một cam kết hợp nhất mới. Nó đã tạm dừng quá trình trong khi bạn giải quyết xung đột. Nếu bạn muốn xem tập tin nào chưa được hợp nhất tại bất kỳ thời điểm nào sau khi xung đột hợp nhất, bạn có thể chạygit status


Vì vậy, trong trường hợp có xung đột hợp nhất, bạn cần giải quyết xung đột sau đó thêm các thay đổi bạn đã thực hiện vào khu vực tổ chức bằng cách sử dụng git add filenamevà sau đó thực hiện các thay đổi bằng cách sử dụng lệnh git commit bị tạm dừng bởi git vì xung đột. Tôi hy vọng điều này giải thích cho bạn truy vấn. Cũng hãy truy cập vào liên kết ở trên để hiểu chi tiết. Trong trường hợp có bất kỳ truy vấn xin vui lòng bình luận dưới đây, tôi sẽ vui lòng giúp đỡ.


7

Các bước tiếp theo sau khi giải quyết xung đột bằng tay là: -

  1. git thêm.
  2. trạng thái git (điều này sẽ cho bạn thấy các lệnh nào là cần thiết để tiếp tục quy trình hợp nhất tự động)
  3. [lệnh git gợi ý, ví dụ như git merge --continue, git cherry-pick --continue, git rebase --continue]

16
Không có hợp nhất git
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad Điều này không chính xác. Zie git xuất ra bên dưới sau khi xung đột: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
Có rebase - liên tục, không hợp nhất
Hola Soy Edu Feliz Navidad

git merge --continue, đó là những gì tôi đang cố gắng làm, kết quả error: unknown option 'continue'. Tôi chắc chắn rằng câu trả lời của bạn là sai vì git-mergetrang người đàn ông không liệt kê nó. Phiên bản Git nào bạn đang sử dụng? Tôi đang sử dụng git version 1.8.5.2 (Apple Git-48). Tôi cũng đã thử với MacPorts git version 2.9.3.
jww

1
Với git 2.10 cho một sự hợp nhất đơn giản, lệnh hoàn toàn cũgit commit
Chris Charabaruk

2

Xung đột hợp nhất xảy ra khi hai nhánh bạn đang cố gắng hợp nhất cả hai đã thay đổi cùng một phần của cùng một tệp. Bạn có thể tạo một danh sách các xung đột vớigit status .

Khi gặp phải dòng xung đột, Git sẽ chỉnh sửa nội dung của các tệp bị ảnh hưởng bằng các chỉ báo trực quan đánh dấu cả hai mặt của nội dung xung đột.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Khi bạn sửa các tệp bị xung đột và bạn đã sẵn sàng để hợp nhất, tất cả những gì bạn phải làm là chạy git addgit committạo cam kết hợp nhất. Khi cam kết được thực hiện,git push các thay đổi cho chi nhánh.

Bài viết tham khảo: Git merge .


2

Sau khi tất cả các tệp đã được thêm vào, bước tiếp theo là " git commit ".

"trạng thái git" sẽ gợi ý những việc cần làm: các tệp chưa được thêm được liệt kê ở dưới cùng và khi chúng được thực hiện xong, nó sẽ đề xuất một cam kết ở trên cùng, nơi nó giải thích trạng thái hợp nhất của nhánh hiện tại.


1

Điều đầu tiên tôi muốn làm rõ là tên chi nhánh chỉ là bí danh cho một cam kết cụ thể. một cam kết là những gì git hoạt động, khi bạn kéo, đẩy hợp nhất và vv. Mỗi cam kết có một id duy nhất.

Khi bạn thực hiện hợp nhất $ git, điều thực sự xảy ra là git cố gắng chuyển nhanh chi nhánh hiện tại của bạn đến cam kết của nhánh được tham chiếu (nói cách khác là cả hai tên nhánh đều trỏ đến cùng một cam kết.) Kịch bản này là dễ nhất đối với git để đối phó, vì không có cam kết mới. Hãy nghĩ về chủ nhân nhảy lên lilipad chi nhánh của bạn đang ớn lạnh. Có thể đặt cờ --no-ff, trong trường hợp đó git sẽ tạo một cam kết mới bất kể có xung đột mã nào hay không.

Trong tình huống có xung đột mã giữa hai nhánh mà bạn đang cố gắng hợp nhất (thường là hai nhánh có lịch sử cam kết chia sẻ một cam kết chung trong quá khứ), chuyển tiếp nhanh sẽ không hoạt động. git vẫn có thể tự động hợp nhất các tệp, miễn là cùng một dòng không bị thay đổi bởi cả hai nhánh trong một tệp xung đột. trong trường hợp này, git sẽ hợp nhất các tệp xung đột cho bạn VÀ tự động cam kết chúng. Bạn có thể xem trước cách git đã làm bằng cách thực hiện $ git diff --cached. Hoặc bạn có thể chuyển cờ --no-commit cho lệnh hợp nhất, sẽ để lại các tệp đã sửa đổi trong chỉ mục của bạn, bạn sẽ cần thêm và cam kết. Nhưng bạn có thể $ git diff các tệp này để xem lại những gì hợp nhất sẽ thay đổi.

Kịch bản thứ ba là khi có xung đột, git không thể tự động giải quyết. Trong trường hợp này, bạn sẽ cần phải hợp nhất chúng theo cách thủ công. Theo tôi đây là cách dễ nhất để thực hiện hợp nhất, như araxis merge hoặc p4merge (miễn phí). Dù bằng cách nào, bạn phải làm từng tệp một. Nếu việc hợp nhất dường như bị kẹt, hãy sử dụng $ git merge - liên tục, để đưa nó đi cùng. Git sẽ cho bạn biết nếu nó không thể tiếp tục, và nếu vậy tại sao không. Nếu bạn cảm thấy mình đã hợp nhất vào một lúc nào đó, bạn có thể thực hiện hợp nhất $ git --abort, và mọi sự hợp nhất sẽ hoàn tác và bạn có thể bắt đầu lại. Khi bạn hoàn tất, mỗi tệp bạn đã hợp nhất sẽ là một tệp sửa đổi cần được thêm và cam kết. Bạn có thể xác minh vị trí của các tệp với trạng thái $ git. Nếu bạn chưa cam kết các tập tin hợp nhất chưa. Bạn cần phải làm điều đó để hoàn thành việc hợp nhất.


0

Nó có thể bị trễ Đó là Happen vì git HEAD của bạn không được cập nhật. khen ngợi này sẽ giải quyết điều đó git reset HEAD.

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.