Git ผสานเครื่องหมาย HEAD ด้านซ้ายในไฟล์ของฉัน


104

ฉันพยายามรวมไฟล์ในบรรทัดคำสั่งโดยใช้ Git เมื่อข้อความแสดงข้อผิดพลาดปรากฏขึ้นแจ้งว่าการผสานถูกยกเลิก

ฉันคิดว่านั่นคือจุดจบของมัน แต่แล้วฉันก็รู้ว่ามี gitmarks ในไฟล์ของฉัน ชอบมาก:

start =
    expression

validchar = 
    [0-9a-zA-Z_?!+\-=@#$%^&*/.]

integer = 
<<<<<<< HEAD
    digits:[0-9]+
        { return digits.join(""); }
=======
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages

ไฟล์ไม่ได้ถูกแก้ไขโดยฉันและแสดงบรรทัดที่แทรกด้วย:

  • HEAD หลังเครื่องหมายน้อยกว่า ( <<<<<<< HEAD)
  • บรรทัดของรหัสที่เปลี่ยนแปลง
  • สตริงของเครื่องหมายเท่ากับ ( =======)
  • เวอร์ชันใหม่ของรหัส
  • อีกบรรทัดที่ขึ้นต้นด้วยมากกว่าเครื่องหมายและชื่อของสาขา ( >>>>>>> gh-pages)

สิ่งที่แย่กว่านั้นคือเนื้อหาของไฟล์ไม่อยู่ในลำดับอีกต่อไป มีใครรู้บ้างว่าฉันทำให้ไฟล์เหล่านั้นกลับมาเป็นปกติได้อย่างไรและการเปลี่ยนแปลงที่ฉันทำใน gh-branch รวมเข้ากับ master branch

คำตอบ:


97

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


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

integer = 
<<<<<<< HEAD                                  <-+ remove the bits here
    digits:[0-9]+                               |
        { return digits.join(""); }             |
=======                                       <-+
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages                              <-- and this

และคุณจะบันทึกไฟล์เป็น ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }

4
@lowerkey ตรงกับที่คุณต้องการให้ผลลัพธ์ที่ผสานเข้าด้วยกัน ฉันเดาว่าคุณจริงๆเพียงแค่ต้องการเป็นส่วนหนึ่งในการที่gh-pagesรุ่นดังนั้นคุณต้องการเพียงแค่สิ่งที่ลบจาก<<<<<<ไป======และยังเอาเดี่ยว>>>>>>เส้นออกจากทั้งสองบรรทัดของรหัสที่เกิดขึ้นจริงระหว่างและ======= >>>>>>
แอมเบอร์

ขอบคุณฉันคิดว่าฉันกำลังจะหยุดมันแล้ว ลบทุกอย่างตั้งแต่หัวถึง ====== แล้วลบ HEADmarks ที่เหลือ
คีย์ล่าง

1
ใช่ถูกต้อง (ไม่มี "ส่วนที่เหลือ" ให้ดูแลอย่างแท้จริง - คุณแค่ยอมรับผลลัพธ์ของการผสานซึ่งโดยปกติ Git จะทำโดยอัตโนมัติหากไม่มีความขัดแย้ง)
แอมเบอร์

2
@lowerkey โปรดพิจารณาอ่านหนังสือในหัวข้อนี้ด้วย ฉันอยากจะแนะนำให้อ่านหนังสือเล่มนั้นอย่างครบถ้วนเนื่องจากดูเหมือนว่าคุณจะขาดความรู้พื้นฐานบางอย่างเกี่ยวกับวิธีการทำงานของ VCSes และเป็นการดีกว่าที่จะเตรียมตัวให้พร้อมสำหรับปัญหาที่อาจเกิดขึ้นในอนาคต
kostix

1
มันตลกแค่ไหน คุณชี้ไปที่คำตอบของคำถามที่ถูกทำเครื่องหมายว่าซ้ำกับคำถามนี้แม้ว่าจะพบคำตอบของคำถามนี้ในคำถามอื่น
t3chb0t

23

เริ่มต้นด้วย "git status" เพื่อดูว่าคุณมีอะไรบ้าง หากคุณยกเลิกการผสาน (หรือยกเลิกการผสาน) และคุณมีไฟล์ที่ขัดแย้งกันในไดเร็กทอรีการทำงานแสดงว่าเกิดข้อผิดพลาด สถานะ Git จะบอกคุณว่าคุณอยู่ที่ไหน หลังจากนั้นคุณมีตัวเลือกมากมาย คุณควรแก้ไขการผสานคอมมิตด้วยมือซึ่งอาจเป็นเรื่องที่ท้าทายหรือใช้เครื่องมือเป็น:

git mergetool

เครื่องมือผสานจะทำงานหากไฟล์ของคุณอยู่ในรายการว่าต้องการการผสาน

คุณยังสามารถดำเนินการอย่างใดอย่างหนึ่ง:

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file

คุณสามารถดูเวอร์ชันต่างๆได้โดยใช้ไวยากรณ์: 1: filename ดูที่นี่สำหรับคำอธิบาย แต่ทั้งหมดข้างต้นถือว่า 'สถานะคอมไพล์' แสดงไฟล์ว่าต้องการการผสาน

สุดท้ายคุณจะมีตัวเลือกดังนี้

git reset --hard   # sounds like --hard is what you need but check other options

7
ฉันอยากจะgit statusพูดถึงคำแนะนำ"เริ่มต้นด้วยเพื่อดูว่าคุณมีอะไรบ้าง" เป็นเรื่องที่เป็นไปได้ในบางวงการที่จะตำหนิ Git สำหรับความซับซ้อนในจินตนาการ แต่อันที่จริงแล้วการอ่านผลลัพธ์อย่างรอบคอบgit statusก็เพียงพอที่จะเข้าใจสิ่งที่ต้องทำต่อ ในสถานการณ์ที่พบบ่อยที่สุด ดังนั้นถ้ามีอะไรผิดพลาดให้หยุดอ่านgit statusคิด
kostix

5

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

สคริปต์ตัวอย่าง:

# vim /usr/sbin/solve.git

(ต่อท้าย)

#!/bin/bash
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .)
do
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f
sed -i -e '/^>>>>>>> /d' $f
echo "$f Fixed"
done
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify

# chmod 755 /usr/sbin/solve.git

& เพียงแค่เรียกใช้ใน GIT repo / path ของคุณเพื่อแก้ไข:

$ cd <path_to_repo>
$ solve.git

หมายเหตุ: - นามสกุลไฟล์ที่กล่าวถึงข้างต้น ได้แก่ php, css, js, html, svg & txt


0

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


0

ฉันมาจากคำถามนี้ และฉันต้องการวิธีการอัตโนมัติในการรวมไฟล์ที่ผสานครึ่งหนึ่งแทนที่จะแก้ไขไฟล์ด้วยตนเอง ( ตามที่แนะนำในคำตอบอื่น ๆ ซึ่งฉันไม่สะดวกที่จะทำ ) นี่คือสิ่งที่ฉันทำผ่าน netbeans แต่สามารถทำได้ผ่านทางบรรทัดคำสั่งเช่นกัน

ตอนนี้โปรดจำไว้ว่าวิธีนี้ใช้ได้ผลก็ต่อเมื่อmerge->add->commitคุณรู้ว่าคุณทำอะไรผิดพลาดและต้องการดำเนินการตามขั้นตอนนี้อีกครั้ง

ขั้นตอนที่ 1:รีเซ็ตเป็นคอมมิตก่อนหน้า

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

ขั้นตอนที่ 2:ลองรวมสาขาอีกครั้ง

git merge --ff origin/feature/YOUR-Branch_here

ณ จุดนี้คุณจะได้รับแจ้งพร้อมกับหน้าต่างการผสานหากคุณใช้ GUI จากนั้นคุณสามารถดำเนินการต่อได้ตามปกติ

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