ข้อผิดพลาดของ Git ในการคอมมิทหลังจากการรวม - ถึงขั้นรุนแรง: ไม่สามารถทำการคอมมิตบางส่วนระหว่างการรวม


280

ฉันวิ่งแข่งgit pullนั้นจบลงด้วยความขัดแย้ง ฉันแก้ไขข้อขัดแย้งและตอนนี้ทุกอย่างเรียบร้อยดี (ฉันใช้ mergetool ด้วย)

เมื่อฉันส่งไฟล์ที่git commit file.php -m "message"ได้รับการแก้ไขโดยที่ฉันได้รับข้อผิดพลาด:

fatal: cannot do a partial commit during a merge.

ฉันมีปัญหาเดียวกันมาก่อนและการใช้-aงานคอมมิททำงานได้อย่างสมบูรณ์แบบ ฉันคิดว่ามันไม่ใช่วิธีที่สมบูรณ์แบบเพราะฉันไม่ต้องการกระทำการเปลี่ยนแปลงทั้งหมด ฉันต้องการส่งไฟล์แยกต่างหากพร้อมกับแสดงความคิดเห็นแยกต่างหาก ฉันจะทำสิ่งนั้นได้อย่างไร เหตุใด git จึงไม่อนุญาตให้ผู้ใช้ส่งไฟล์แยกต่างหากหลังจากทำการผสาน ฉันไม่พบคำตอบที่น่าพอใจสำหรับปัญหานี้


5
และคุณก็รู้ว่าการค้นหาคอมไพล์ดำเนินการ "เต็มความมุ่งมั่น"จะส่งคืนสิ่งที่ไม่มีประโยชน์ ไม่ใช่เอกสารที่เกี่ยวข้องจากหน้าคนของ Git นี่เป็นเครื่องมือที่น่าสังเวช
jww

6
@Torek - พูดคุยเกี่ยวกับระเบียบอื่นที่สร้างขึ้นโดย Git ... ทำไมพระเจ้าจึงยากที่จะเช็คเอาท์ไฟล์ที่ขัดแย้งจากสาขาอื่นดังนั้นความขัดแย้งจึงเปลี่ยนไปเพิ่มในสาขานี้แล้วส่ง ??? และ WTF เป็นบางส่วนที่กระทำ? ฉันไม่พบเอกสารใด ๆ เกี่ยวกับมัน ... ผู้ใช้ถูกบังคับให้ลองเดาด้านล่าง ...
jww

คุณทำได้อย่างไร? ฉันมีความขัดแย้งและฉันไม่สามารถทำอะไรได้
Niklas R.

คำตอบ:


442

ฉันพบว่าการเพิ่ม "-i" ในคำสั่งการกระทำช่วยแก้ไขปัญหานี้ให้ฉันได้ โดยทั่วไปแล้ว -i จะบอกให้ไฟล์เพิ่มเติมขั้นก่อนที่จะกระทำ นั่นคือ:

git commit -i myfile.php

18
อะไรStage additional filesหมายถึง?
jcalfee314

9
@ jcalfee314 การแสดงละครในคอมไพล์คือการเตรียมไฟล์สำหรับการกระทำ ในกรณีพิเศษนี้ไฟล์จะผ่านไฟล์บรรทัดคำสั่งก่อนที่จะกระทำ ส่วนใหญ่จะใช้แฟล็ก -i เมื่อคุณสรุปการรวม คุณสามารถอ่านรายละเอียดเพิ่มเติมเกี่ยวกับการกระทำธงที่นี่
MikaelHalen

4
@ jcalfee314 ฉันจะตรวจสอบเอกสารและกล่าวว่า"ก่อนที่จะทำการกระทำออกมาจากฉากเนื้อหาเพื่อให้ห่างไกลเวทีเนื้อหาของเส้นทางที่ได้รับในบรรทัดคำสั่งเป็นอย่างดี. นี้มักจะไม่ได้สิ่งที่คุณต้องการจนกว่าคุณจะได้สรุปการผสานความขัดแย้ง" ฉันเดาว่าภายใต้เงื่อนไขนี้มีความไม่สอดคล้องกันบางอย่างในพื้นที่จัดเตรียมซึ่งไม่สามารถแก้ไขได้git addซึ่งทำให้git commitล้มเหลว การเพิ่ม-iจะบอกคอมไพล์ให้เพิ่มและกระทำในเวลาเดียวกัน ฉันยังไม่แน่ใจว่าทำไม แต่ดูเหมือนสมเหตุสมผล
JonSlowCN

5
สำหรับ noobs อย่างฉันคุณจะได้รับข้อผิดพลาดเดียวกันนี้ถ้าคุณลองข้อความที่มีช่องว่างโดยไม่มีเครื่องหมายอัญประกาศ เช่น. [git กระทำ -m หนึ่งสองสาม] ถูกต้อง: [git กระทำ -m "หนึ่งสองสาม"]
Skychan

2
@ ความคิดเห็นของ Skychan เป็นตั๋วสำหรับฉัน
tehbeardedone

106
git commit -am 'Conflicts resolved'

สิ่งนี้ใช้ได้สำหรับฉัน คุณสามารถลองสิ่งนี้ได้เช่นกัน


1
น่าทึ่งฉันไม่รู้เรื่องนี้!
JeanValjean

11
สิ่งนี้จะเพิ่มไฟล์ที่ถูกดัดแปลงทั้งหมดลงในคอมมิทแม้ไฟล์ที่ไม่อยู่ในสเตจซึ่งอาจไม่เป็นที่ต้องการ ผู้ใช้อาจต้องการออกจากธง 'a'
Chase Sandmann

4
นี่คือสิ่งที่ผู้ใช้ขอไม่ให้ทำซึ่งก็คือการหลีกเลี่ยงการส่งไฟล์ทั้งหมด
Michael

33

คุณสามารถใช้git commit -iสำหรับกรณีส่วนใหญ่ แต่ในกรณีที่มันไม่ทำงาน

git commit -m "your_merge_message"ที่คุณต้องทำ ในระหว่างการรวมที่ขัดแย้งกันคุณไม่สามารถรวมไฟล์เดียวได้ดังนั้นคุณต้อง

  1. สเตจไฟล์ที่ขัดแย้งเท่านั้น ( git add your_file.txt)
  2. git commit -m "your_merge_message"

16

คุณอาจมีข้อขัดแย้งในบางสิ่งที่คุณไม่ได้กำหนดไว้ คอมไพล์จะไม่ยอมให้คุณกระทำสิ่งที่เป็นอิสระ (เพราะมันเป็นส่วนหนึ่งของการผสานฉันเดา) ดังนั้นคุณจำเป็นต้องแฟ้มที่แล้วgit add git commit -m "Merge conflict resolution"การ-iตั้งค่าสถานะสำหรับgit commitการเพิ่มสำหรับคุณ


5
ไม่ใช่ใน 1.9.0 - ที่commit -iทำงาน แต่ไม่ใช่git add; git commit
LeeGee

14

ฉันได้สิ่งนี้เมื่อฉันลืม-mคอมไพล์ของฉันเมื่อแก้ไขข้อขัดแย้งการคอมไพล์

git commit "commit message"

ควรจะเป็น

git commit -m "commit message"

2
อ่า! ฉันลืมอีกครั้ง!
user2705463

9

ในขณะที่ข้อความแสดงข้อผิดพลาดบอกว่าคุณไม่สามารถกระทำบางส่วนหลังจากการผสาน แทนที่จะมุ่งมั่นเพียงแค่file.phpคุณควรกระทำการเปลี่ยนแปลงทั้งหมด

สิ่งนี้น่าจะใช้ได้

git commit -m "Fixing merge" 

ขอบคุณมันช่วย
Narendra Pandey

ทำงานให้ฉันตามที่เป็นอยู่
Shashank Bodkhe

6

การผสานของคุณหยุดกลางคัน คุณควรเพิ่มไฟล์ของคุณแล้ว 'git กระทำ':

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

ไชโย


5

หากคุณต้องการทิ้งเชอร์รี่ที่เก็บและส่งไฟล์ในชุดที่คุณต้องการ

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

พาคุณไปที่นั่น

ซอฟต์รีเซ็ตแบบใดที่มันจะย้ายตัวชี้ที่ชี้ไปที่ HEAD ปัจจุบันไปยัง commit (ish) ที่คุณให้ แต่ไม่ได้เปลี่ยนไฟล์ การฮาร์ดรีเซ็ตจะย้ายตัวชี้และเปลี่ยนกลับไฟล์ทั้งหมดเป็นสถานะในการส่ง (ish) ซึ่งหมายความว่าด้วยซอฟต์รีเซ็ตคุณสามารถล้างสถานะการผสาน แต่เก็บการเปลี่ยนแปลงกับไฟล์จริงจากนั้นส่งคอมมิทหรือรีเซ็ตแต่ละรายการตามความชอบของคุณ


คุณช่วยอธิบายเพิ่มเติมได้ไหม? นี่อาจเป็นสิ่งที่ฉันต้องการ แต่ฉันไม่ทำตามวิธีที่จะใช้งานได้ ... คำตอบทั้งหมดที่นี่คือ 'เพิ่มไฟล์แล้วคอมมิท!' แต่ก็เห็นได้ชัดเล็กน้อย เหตุผลที่ฉันอยู่ที่นี่คือฉันไม่ต้องการเพิ่มไฟล์เหล่านั้นก่อนที่จะส่งมอบ -_-;
Kyle Baker

ที่ช่วยในการ ขอบคุณ :)
Kyle Baker

5
  1. ไปที่ไดเรกทอรีโครงการของคุณ
    1. แสดงไฟล์ที่ซ่อน (โฟลเดอร์. git จะปรากฏขึ้น)
    2. เปิดโฟลเดอร์. git
    3. ลบ MERGE_HEAD
    4. กระทำอีกครั้ง
    5. ถ้า git บอกคุณว่า git ถูกล็อคให้กลับไปที่โฟลเดอร์. git และลบ index.lock
    6. กระทำอีกครั้งทุกอย่างจะทำงานได้ดีในครั้งนี้

ที่ดี! ที่จะทำงานให้ฉัน โดยวิธีถ้าบน MacOS จาก terminal คุณสามารถเรียก `เปิด. git 'แม่มดจะแสดงเนื้อหา'
.git

มันก็ใช้ได้กับฉันเช่นกัน ควรได้รับการยอมรับว่าเป็นคำตอบ
vandu

3

สำหรับตัวเองสิ่งนี้เกิดขึ้นใน SourceTree เมื่อฉันพยายามคอมมิชชันผสานก่อนที่จะแก้ไขไฟล์ทั้งหมด ฉันทำเครื่องหมายไฟล์ล่าสุดที่ได้รับการแก้ไขแล้ว แต่ก็ยังทำให้ฉันมีข้อผิดพลาดนี้เมื่อพยายามส่ง ฉันปิด SourceTree แล้วเปิดใหม่อีกครั้ง


1
ขอบคุณ แต่น่าเสียดายที่นี่ไม่ได้ผลสำหรับฉัน น่ารำคาญฉันต้องยอมรับมุมมองส่วนตัวรวมถึงการรวมก่อนที่มันจะทำให้ฉันได้รวมการผสาน
Coxy

3

ฉันแก้ไขสิ่งนี้ด้วยวิธีที่แตกต่างอย่างสิ้นเชิงโดยใช้การควบคุมแหล่งที่มาของ Xcode เท่านั้น

พื้นหลัง: ทีมอื่นผลักดันการเปลี่ยนแปลงไปยังที่เก็บ Git ระยะไกล (ผ่าน Beanstalk) ในตอนท้ายของฉันไฟล์. xcodeproj เข้ามาในไดเรกทอรีต่าง ๆ และการเปลี่ยนแปลงไม่ได้เกิดขึ้น ต่อมาเมื่อฉันพยายามที่จะส่งมอบฉันได้รับข้อผิดพลาด Tree Conflict ใน Xcode

ภาพหน้าจอของความขัดแย้งต้นไม้

เกือบจะเป็นไปไม่ได้ที่จะแก้ไขโดยใช้ Xcode ฉันแทนที่.xcodeprojไฟล์ด้วยเวอร์ชันที่ดาวน์โหลดจากเซิร์ฟเวอร์ Git ผลลัพธ์ ... โครงการ Xcode ดูเหมือนจะชัดเจนขึ้น แต่การอัปเดตทั้งหมดจาก Pull ที่เสียหายนั้นแสดงขึ้นเมื่อมีการเปลี่ยนแปลงที่ฉันทำและถูก Staged for Commit

ดู Mods และเพิ่มไฟล์เหล่านี้ทั้งหมด

อย่างไรก็ตามเมื่อพยายามคอมมิทฉันได้รับข้อผิดพลาด "ร้ายแรง: ไม่สามารถคอมมิทบางส่วนระหว่างการรวม" ที่กล่าวถึงที่นี่

นี่คือวิธีที่ฉันแก้ปัญหา ... (ตอนนี้เข้าใจว่าฉันเป็นโปรแกรมเมอร์มือใหม่ดังนั้นฉันจึงอาจขาดความเข้าใจ ... แต่ความไม่รู้ของฉันทำให้ฉันต้องหาวิธีอื่นในการทำสิ่งนี้) ก่อนอื่นฉันโคลนเจ้านายของฉัน สาขาเป็นสาขารองและเปลี่ยนเป็นสาขานั้น จากนั้นฉันสร้างสำเนาการทำงานและวางไดเรกทอรีไปยังสำเนาการทำงานที่อยู่นอกไดเรกทอรีโครงการเดิม (ฉันไม่รู้ว่านี่เป็นสิ่งจำเป็นหรือไม่ แต่เป็นสิ่งที่ฉันทำในขณะที่ฉันอ่านเทคนิคการแก้ไขปัญหาอื่น ๆ ) จากนั้นฉันเปลี่ยนสาขาเป็นหลักซึ่งฉันรู้ว่าไฟล์ Staged ทั้งหมดของฉัน (เปลี่ยนเป็น Commit) หายไป เพื่อให้แน่ใจว่าไฟล์ทั้งหมดได้รับการอัปเดตเป็นการเปลี่ยนแปลงล่าสุดที่ทำโดยบุคคลอื่นฉันได้สร้างสาขาใหม่ชื่อว่า ThirdBranch ซึ่งทำซ้ำไฟล์ทั้งหมด ผลักไปที่ Git Server และปล่อยให้ Beanstalk เปรียบเทียบรุ่นเซิร์ฟเวอร์ของฉันของสาขาหลักกับสาขา ThirdBrach ที่ฉันเพิ่งกด (บรรทัดต่อบรรทัด) และการเปลี่ยนแปลงทั้งหมดของอีกฝ่ายอยู่ใน Xcode ของฉัน นี่หมายความว่าที่เก็บข้อมูลหลักของฉันและที่เก็บข้อมูลหลักของ Git เหมือนกันซึ่งยืนยันว่าฉันแก้ไขปัญหาโดยใช้ Xcode เท่านั้น

อย่าถามฉันว่านอกจากสิ่งที่ฉันเพิ่งอธิบาย ... และเติมช่องว่างที่ฉันทิ้งไว้อย่างแน่นอน ฉันใหม่ที่นี้และฉันไม่เข้าใจทุกอย่าง บางทีโปรแกรมเมอร์ที่มีประสบการณ์สามารถแยกข้อมูลที่ไม่เกี่ยวข้องออกจากเทคนิคที่เกี่ยวข้องและสร้างเทคนิคนี้ให้ชัดเจนยิ่งขึ้นซึ่งเป็นส่วนหนึ่งที่ฉันโพสต์สิ่งนี้

นี่คือคำตอบที่ซ้ำกันสำหรับคำถามซ้ำกันเมื่อ: ไม่สามารถติด Xcode Git Merge ได้


2
กรุณาอย่าโพสต์คำตอบที่ซ้ำกัน ในขณะที่ปัญหาพื้นฐานอาจเหมือนกันคำตอบของคุณสำหรับปัญหาที่เฉพาะเจาะจงมากขึ้นและเมฆคำตอบสำหรับคำถามทั่วไป ฉันคิดว่าในกรณีนี้การแสดงความคิดเห็นต่อคำถามที่คุณเชื่อมโยงกับคำตอบเดิมของคุณนั้นเหมาะสมกว่า
Fookatchu

2

ในระหว่างการรวม Git ต้องการติดตามสาขาหลักด้วยเหตุผลทุกประเภท สิ่งที่คุณต้องการทำไม่ใช่การผสานอย่างที่คอมไพล์เห็น คุณอาจจะต้องการที่จะทำ rebase หรือเชอร์รี่เลือกด้วยตนเอง


1
ฉันไม่เคยใช้ rebase หรือ cherry-pick มาก่อนฉันเพิ่งอ่านคู่มือตอนนี้ดังนั้นคุณจะแนะนำอะไร "git rebase master" หลังจากการรวมความขัดแย้งเข้าด้วยกันจะทำงานได้อย่างไร
pMan

1
มันเป็นกระบวนการทำงานแบบขนาน ดูstackoverflow.com/questions/804115/git-rebase-vs-git-merge โดยทั่วไปหากคุณต้องการให้ "merge" แยกกันให้คอมมิทคุณจะทำการ rebase สาขาต้นทางไปยังจุดสิ้นสุดของสาขาเป้าหมาย
Talljoe

1
เพียงแค่คอมไพล์เพิ่มแต่ละไฟล์จากนั้นส่งโดยไม่ต้อง -a
Peter DeWeese

4
คุณไม่ได้ตอบคำถาม แต่ให้มากกว่าเพื่อค้นหา ตอนนี้เราต้องรู้ว่า "การเก็บเชอร์รี่คืออะไร" และ "การคืนเงินคืออะไร"
ftrotter

2
ฉันสงสัยว่าทำไมคำตอบนี้จึงถูกโหวต ฉันมักจะอยากรู้อยากเห็นของเด็กเมื่อใครบางคนบอกสิ่งที่ฉันไม่เคยรู้มาก่อน ตามที่ฉันแสดงความคิดเห็นข้างต้นตอนนี้ฉันรู้เกี่ยวกับเชอร์รี่เลือกและ rebase ความก้าวหน้านั้นมีประโยชน์หรือไม่
pMan

2

git commit -i -m 'merge message'ไม่ได้ผลสำหรับฉัน มันพูดว่า:

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

FWIW ฉันมาที่นี่ผ่านคำถามที่เกี่ยวข้องนี้เพราะฉันได้รับข้อความนี้:

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

ฉันยังพยายาม mergetool No files need mergingซึ่งกล่าวว่า สับสนมาก! ดังนั้น MERGE_HEAD จึงไม่อยู่ในไฟล์ที่ต้องการผสาน -

สุดท้ายฉันใช้เคล็ดลับนี้เพื่อเพิ่มเฉพาะไฟล์ที่ถูกแก้ไข (ไม่ต้องการเพิ่มไฟล์ทั้งหมดในทรีของฉันเนื่องจากฉันมีบางอย่างที่ฉันต้องการเก็บไว้ไม่ได้ติดตาม):

git ls-files -m | xargs git add

จากนั้นในที่สุดฉันก็สามารถทำและผลักดันได้! มันจะดีถ้า git ให้คำแนะนำคุณดีขึ้นเกี่ยวกับสิ่งที่ต้องทำในสถานการณ์เหล่านี้


1

หากอยู่ในซอร์สต้นไม้เราควรทำเครื่องหมายไฟล์อย่างชัดเจนว่าได้รับการแก้ไขหลังจากแก้ไขข้อขัดแย้งแล้ว เลือกไฟล์ที่เพิ่งได้รับการแก้ไขโดยไม่มีข้อขัดแย้ง การดำเนินการ -> แก้ไขข้อขัดแย้ง -> ทำเครื่องหมายแก้ไขแล้ว หากคุณมีหลายไฟล์ให้ทำเหมือนกันสำหรับทุกคน กระทำในขณะนี้


1

หลังจากอ่านความคิดเห็นทั้งหมด นี่คือความละเอียดของฉัน:
ฉันต้อง "เพิ่ม" อีกครั้งกว่ากระทำ:

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

1

หากคุณใช้ทรีซอร์สหรือ GUI อื่นให้แน่ใจว่าไฟล์ทั้งหมดได้รับการตรวจสอบแล้ว (หลังจากทำการผสาน)


0

บางครั้งในระหว่างการผสานหากมีข้อขัดแย้งเกิดขึ้นและมี deltas ที่ต้องการการแก้ไขด้วยตนเอง ในกรณีเช่นนี้แก้ไขความละเอียดด้วยตนเองสำหรับไฟล์ที่กล่าวถึง

ตอนนี้ถ้าคุณออก

git status Lib/MyFile.php

คุณจะเห็นผลลัพธ์เช่น

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

เนื่องจากคุณแสดงคำมั่นสัญญาแล้วคุณจึงต้องออก

git commit

และความมุ่งมั่นของคุณจะทำโดยไม่มีปัญหาใด ๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.