Lỗi Git khi xác nhận sau khi hợp nhất - gây tử vong: không thể thực hiện cam kết một phần trong quá trình hợp nhất


280

Tôi chạy một git pullmà kết thúc trong một cuộc xung đột. Tôi đã giải quyết xung đột và bây giờ mọi thứ đều ổn (tôi cũng đã sử dụng mergetool).

Khi tôi cam kết giải quyết tệp với git commit file.php -m "message"tôi, tôi gặp lỗi:

fatal: cannot do a partial commit during a merge.

Tôi đã có cùng một vấn đề trước đây và sử dụng -atrong cam kết hoạt động hoàn hảo. Tôi nghĩ rằng đó không phải là cách hoàn hảo bởi vì tôi không muốn thực hiện tất cả các thay đổi. Tôi muốn cam kết các tập tin riêng biệt với ý kiến ​​riêng biệt. Làm thế nào tôi có thể làm điều đó? Tại sao git không cho phép người dùng cam kết các tệp riêng biệt sau khi hợp nhất? Tôi không thể tìm thấy một câu trả lời thỏa đáng cho vấn đề này.


5
Và bạn biết đấy, tìm kiếm git thực hiện "cam kết đầy đủ" trả về gần như không có gì hữu ích. Không một tài liệu liên quan từ trang người đàn ông của Git. Đây là một công cụ khốn khổ như vậy.
jww

6
@Torek - nói về một mớ hỗn độn khác do Git tạo ra Và WTF là một cam kết một phần? Tôi không thể tìm thấy bất kỳ tài liệu nào về nó ... Người dùng buộc phải thử các dự đoán dưới đây ...
jww

Bạn đã làm nó như thế nào? Tôi có mâu thuẫn và tôi không thể làm gì được
Niklas R.

Câu trả lời:


441

Tôi thấy rằng việc thêm "-i" vào lệnh commit sẽ khắc phục vấn đề này cho tôi. Về cơ bản, -i bảo nó xử lý các tập tin bổ sung trước khi cam kết. Đó là:

git commit -i myfile.php

18
Stage additional filesnghĩa là gì?
jcalfee314

9
@ jcalfee314 dàn dựng trong git là để chuẩn bị các tập tin cho cam kết. Trong trường hợp cụ thể này, nó xử lý tệp thông qua dòng lệnh trước khi cam kết. Cờ -i được sử dụng chủ yếu khi bạn kết thúc hợp nhất. Bạn có thể đọc thêm về các cờ cam kết ở đây .
MikaelHalen

4
@ jcalfee314 Tôi đã kiểm tra tài liệu và thông báo "Trước khi thực hiện cam kết với nội dung được dàn dựng, hãy xử lý nội dung của các đường dẫn được đưa ra trên dòng lệnh. Đây thường không phải là điều bạn muốn trừ khi bạn kết luận một sự hợp nhất mâu thuẫn" . Tôi đoán là trong điều kiện này, có một số loại không nhất quán trong khu vực dàn dựng không thể giải quyết được git add, điều này làm cho git committhất bại. Thêm -isẽ nói với git để thêm và cam kết cùng một lúc. Tôi vẫn không chắc tại sao nhưng nó có vẻ hợp lý.
JonSlowCN

5
Đối với những người mới như tôi, bạn cũng sẽ gặp lỗi tương tự nếu bạn thử một tin nhắn bao gồm khoảng trắng không có dấu ngoặc kép. Ví dụ. [git commit -m one hai ba] Đúng: [git commit -m "một hai ba"]
Skychan

2
Nhận xét của @ Skychan là tấm vé cho tôi.
tehbeardedone

106
git commit -am 'Conflicts resolved'

Điều này làm việc cho tôi. Bạn cũng có thể thử điều này.


1
Thật tuyệt, tôi không biết điều này!
JeanValjean

11
Điều này thêm tất cả các tệp đã sửa đổi vào cam kết, ngay cả những tệp không được sắp xếp có thể không mong muốn. Người dùng có thể muốn rời khỏi cờ 'a'
Chase Sandmann

4
Đây chính xác là những gì người dùng yêu cầu không làm, đó là để tránh cam kết tất cả các tệp.
Michael

33

Bạn có thể sử dụng git commit -icho hầu hết các trường hợp nhưng trong trường hợp nó không hoạt động

Bạn cần phải làm git commit -m "your_merge_message". Trong xung đột hợp nhất, bạn không thể hợp nhất một tệp duy nhất, do đó bạn cần phải

  1. Giai đoạn chỉ tập tin bị xung đột ( git add your_file.txt)
  2. git commit -m "your_merge_message"

16

Bạn có thể đã có một cuộc xung đột trong một cái gì đó mà bạn chưa dàn dựng để cam kết. git sẽ không cho phép bạn cam kết mọi thứ một cách độc lập (vì đó là tất cả các phần của hợp nhất, tôi đoán vậy), vì vậy bạn cần đến git addtập tin đó và sau đó git commit -m "Merge conflict resolution". Các -ilá cờ cho git commitkhông add cho bạn.


5
Không phải trong 1.9.0 - commit -iđã hoạt động, nhưng khônggit add; git commit
LeeGee

14

Tôi đã nhận được điều này khi tôi quên mất -mcam kết git của mình khi giải quyết xung đột hợp nhất git.

git commit "commit message"

nên là

git commit -m "commit message"

2
ah ah! Tôi lại quên mất!
user2705463

9

Như thông báo lỗi cho biết bạn không thể thực hiện cam kết một phần sau khi hợp nhất. Thay vì cam kết chỉ cần file.phpbạn cam kết tất cả các thay đổi.

Điều này nên làm việc.

git commit -m "Fixing merge" 

Cảm ơn, nó đã giúp
Narendra Pandey

Làm việc cho tôi như nó vốn có
Shashank Bodkhe

6

Hợp nhất của bạn dừng lại ở giữa của hành động. Bạn nên thêm các tệp của mình và sau đó 'git commit':

git add file_1.php file_2.php file_3.php git commit

Chúc mừng


5

Nếu bạn chỉ muốn bỏ toàn bộ tập tin chọn anh đào và cam kết trong bất kỳ bộ nào bạn muốn,

git reset --soft <ID-OF-THE-LAST-COMMIT>

đưa bạn đến đó

Những gì thiết lập lại mềm là nó di chuyển con trỏ trỏ đến CHÍNH hiện tại đến cam kết (ish) bạn đã đưa ra nhưng không làm thay đổi các tệp. Thiết lập lại cứng sẽ di chuyển con trỏ và cũng hoàn nguyên tất cả các tệp về trạng thái trong cam kết đó (ish). Điều này có nghĩa là với thiết lập lại mềm, bạn có thể xóa trạng thái hợp nhất nhưng giữ các thay đổi đối với các tệp thực tế và sau đó cam kết hoặc đặt lại từng tệp riêng lẻ theo ý thích của bạn.


Bạn có thể giải thích điều này nhiều hơn? Đây có lẽ là thứ tôi cần, nhưng tôi không làm theo cách nó hoạt động ... Tất cả các câu trả lời ở đây chỉ là 'thêm các tệp, sau đó cam kết!', Nhưng điều đó quá rõ ràng; Lý do tôi ở đây là tôi không muốn thêm các tệp đó trước khi tôi cam kết. -_-;
Kyle Baker

Những sự giúp đỡ đó. Cảm ơn. :)
Kyle Baker

5
  1. đi đến thư mục dự án của bạn
    1. hiển thị các tập tin ẩn (thư mục .git sẽ xuất hiện)
    2. mở thư mục .git
    3. xóa MERGE_HEAD
    4. cam kết một lần nữa
    5. nếu git nói với bạn rằng git bị khóa, hãy quay lại thư mục .git và xóa index.lock
    6. cam kết một lần nữa mọi thứ sẽ hoạt động tốt thời gian này.

Tuyệt quá! Điều đó sẽ làm việc cho tôi. Nhân tiện, nếu trên MacOS, từ thiết bị đầu cuối bạn có thể gọi 'open .git`, phù thủy sẽ hiển thị nội dung' .git 'trong Finder
tontonCD

Điều này làm việc cho tôi quá. Điều này nên được chấp nhận như là câu trả lời.
vandu

3

Đối với bản thân tôi, điều này đã xảy ra trong SourceTree khi tôi cố gắng thực hiện hợp nhất trước khi giải quyết tất cả các tệp. Sau đó tôi đã đánh dấu tệp cuối cùng được giải quyết và nó vẫn báo lỗi cho tôi khi cố gắng cam kết. Tôi đã đóng SourceTree và mở lại, và sau đó nó đã cam kết tốt.


1
cảm ơn, nhưng thật không may điều này đã không làm việc cho tôi. Khó chịu, tôi đã phải thực hiện một chế độ xem riêng tư cũng như hợp nhất trước khi nó cho phép tôi thực hiện hợp nhất.
Coxy

3

Tôi đã giải quyết vấn đề này bằng một cách tiếp cận hoàn toàn khác, chỉ sử dụng Kiểm soát nguồn của Xcode.

Bối cảnh: Một nhóm khác Đẩy các thay đổi vào kho Git từ xa (thông qua Beanstalk). Cuối cùng, các tệp .xcodeproj nằm trong thư mục khác và các thay đổi đã không được thực hiện. Sau đó, khi tôi cố gắng cam kết, tôi đã nhận được lỗi Cây xung đột trong Xcode.

Ảnh chụp màn hình xung đột cây

Gần như không thể sửa bằng Xcode, tôi đã thay thế .xcodeprojtệp bằng phiên bản đã tải xuống từ máy chủ Git. Kết quả ... dự án Xcode dường như bị xóa, tuy nhiên tất cả các bản cập nhật từ Pull bị hỏng đều hiển thị dưới dạng những thay đổi tôi đã thực hiện và được dàn dựng cho một Cam kết.

Nhìn vào tất cả các Mod và tập tin đã thêm

Tuy nhiên, khi cố gắng Cam kết, tôi đã nhận được lỗi "nghiêm trọng: không thể thực hiện một phần cam kết trong quá trình hợp nhất", được thảo luận ở đây.

Đây là cách tôi giải quyết vấn đề ... (Bây giờ, hãy hiểu rằng tôi là một lập trình viên tân binh, vì vậy tôi có thể thiếu hiểu biết ... nhưng sự thiếu hiểu biết của tôi đã khiến tôi tìm cách khác để làm điều này.) Trước tiên, tôi đã nhân bản chủ của mình Chi nhánh thành Chi nhánh thứ cấp và chuyển sang chi nhánh đó. Sau đó, tôi đã tạo một Bản sao làm việc và đặt thư mục vào bản sao làm việc đó bên ngoài thư mục dự án ban đầu. (Tôi không biết điều này có cần thiết hay không, nhưng đó là những gì tôi đã làm khi đọc các kỹ thuật khắc phục sự cố khác.) Sau đó, tôi chuyển các nhánh thành chủ, nơi tôi nhận ra tất cả các tệp Staged của mình (thay đổi thành Cam kết) đã biến mất. Để đảm bảo tất cả các tệp đã được cập nhật lên các thay đổi mới nhất do bên kia thực hiện, tôi đã tạo một nhánh mới có tên là ThirdBranch, sao chép tất cả các tệp, Đã đẩy nó đến Máy chủ Git và để Beanstalk so sánh phiên bản máy chủ của tôi với nhánh chính với nhánh thứ ba mà tôi vừa đẩy (từng dòng một) và tất cả các thay đổi của bên kia đã có trên Xcode của tôi. Điều này có nghĩa là kho lưu trữ chính của tôi và kho lưu trữ chính của Git là như nhau, chỉ xác minh rằng tôi đã giải quyết vấn đề bằng Xcode.

Đừng hỏi tôi làm thế nào, ngoài những gì tôi vừa mô tả ... và chắc chắn điền vào những khoảng trống tôi để lại. Tôi mới ở đây và tôi không hiểu mọi thứ. Có lẽ một lập trình viên có kinh nghiệm có thể tách thông tin không liên quan khỏi các thông tin liên quan và tái tạo kỹ thuật này rõ ràng hơn, đó là một phần lý do tại sao tôi đăng bài này.

Đây là một câu trả lời trùng lặp cho câu hỏi trùng lặp như tại: Xcode Git Merge bị kẹt


2
Xin vui lòng không gửi câu trả lời trùng lặp. Mặc dù vấn đề cơ bản có thể giống nhau, nhưng câu trả lời của bạn dành cho một vấn đề cụ thể hơn nhiều và chỉ che mờ câu trả lời cho câu hỏi chung này. Tôi nghĩ trong trường hợp này một bình luận cho câu hỏi mà bạn liên kết đến câu trả lời ban đầu của bạn là phù hợp hơn.
Fookatchu

2

Trong quá trình hợp nhất, Git muốn theo dõi các nhánh mẹ vì mọi lý do. Những gì bạn muốn làm không phải là một sự hợp nhất như git nhìn thấy nó. Bạn có thể muốn thực hiện rebase hoặc cherry-pick thủ công.


1
Tôi chưa bao giờ sử dụng rebase hoặc cherry-pick trước đây, tôi chỉ chạy qua hướng dẫn bây giờ, vậy bạn sẽ gợi ý gì, "git rebase master" sau khi xung đột sáp nhập sẽ hoạt động?
pman

1
Đó là một quy trình làm việc song song. Xem stackoverflow.com/questions/804115/git-rebase-vs-git-merge Về cơ bản, nếu bạn muốn "hợp nhất" tách biệt, hãy xác nhận thay vào đó bạn khởi động lại nhánh nguồn vào cuối nhánh đích.
Talljoe

1
Chỉ cần git thêm từng tệp riêng lẻ sau đó cam kết mà không có -a.
Peter De Weese 20/07

4
bạn không thực sự trả lời câu hỏi mà chỉ đơn giản là đưa ra nhiều hơn để tìm kiếm. Bây giờ chúng ta cần biết "hái cherry là gì" và "rebase là gì".
ftrotter

2
Tôi tự hỏi tại sao câu trả lời này đã được bỏ phiếu. Tôi luôn có sự tò mò của trẻ khi ai đó nói với tôi những điều mà tôi chưa từng biết trước đây. Như tôi đã nhận xét ở trên, bây giờ tôi biết về cherry và rebase. Đó không phải là tiến bộ / hữu ích?
pman

2

git commit -i -m 'merge message'không làm việc cho tôi. Nó nói rằng:

fatal: No paths with --include/--only does not make sense.

FWIW, tôi đã đến đây thông qua câu hỏi liên quan này bởi vì tôi nhận được tin nhắn này:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Tôi cũng đã thử mergetool, cho biết No files need merging. Rất bối rối! Vì vậy, MERGE_HEAD không nằm trong một tệp cần hợp nhất- ??

Cuối cùng, tôi đã sử dụng thủ thuật này để chỉ thêm các tệp đã sửa đổi (không muốn thêm tất cả các tệp trong cây của mình, vì tôi có một số thứ tôi muốn giữ nguyên không bị theo dõi):

git ls-files -m | xargs git add

Sau đó, tôi cuối cùng đã có thể cam kết và đẩy lên. Nó chắc chắn sẽ tốt nếu git cho bạn gợi ý tốt hơn về những việc cần làm trong những tình huống này.


1

Nếu nó nằm trong Cây nguồn , chúng ta nên đánh dấu rõ ràng một tệp là đã được giải quyết sau khi các xung đột được giải quyết. Chọn tập tin vừa được giải quyết để không có xung đột. Sau đó, Hành động -> Giải quyết xung đột -> Đánh dấu giải quyết . Nếu bạn có nhiều tệp, làm tương tự cho tất cả. Cam kết ngay bây giờ.


1

Sau khi đọc tất cả các ý kiến. đây là giải pháp của tôi:
Tôi phải "Thêm" lại lần nữa so với cam kết:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html

1

Nếu bạn đang sử dụng Cây nguồn hoặc GUI khác, đảm bảo tất cả các tệp được kiểm tra (sau khi hợp nhất).


0

Đôi khi trong quá trình hợp nhất, nếu xung đột phát sinh và có những đồng bằng cần giải quyết thủ công. Trong trường hợp như vậy, sửa độ phân giải thủ công cho các tệp được đề cập.

Bây giờ nếu bạn phát hành,

git status Lib/MyFile.php

Bạn sẽ thấy đầu ra như

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Vì, bạn đã dàn dựng cam kết, bạn chỉ cần đưa ra vấn đề

git commit

Và cam kết của bạn sẽ được thực hiện mà không có bất kỳ vấn đề.

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.