วิธีเก็บไฟล์โลคัลหรือไฟล์รีโมตระหว่างการผสานโดยใช้ Git และบรรทัดคำสั่ง


195

ฉันรู้วิธีผสานการดัดแปลงโดยใช้ vimdiff แต่ถ้าฉันเพิ่งรู้ว่าไฟล์ทั้งหมดนั้นดีที่จะเก็บหรือทิ้งฉันจะทำอย่างไร

ฉันไม่ต้องการเปิด vimdiff สำหรับแต่ละรายการฉันต้องการเปลี่ยนคำสั่งที่บอกว่า 'Keep local' หรือ 'Keep remote'

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

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

คำตอบ:


310

คุณสามารถทำได้เช่นกัน:

git checkout --theirs /path/to/file

เพื่อเก็บไฟล์ระยะไกลและ:

git checkout --ours /path/to/file

เพื่อเก็บไฟล์โลคัล

จากนั้นgit addพวกเขาและทุกอย่างเสร็จสิ้น

รุ่น: โปรดทราบว่านี่เป็นmergeสถานการณ์ ระหว่างการrebase --theirsอ้างอิงไปยังสาขาที่คุณทำงานอยู่


4
ฉันทำสิ่งนี้ .. แต่ไม่มีอะไรเกิดขึ้น .. ฉันจะรู้ได้อย่างไรว่ากำลังใช้ไฟล์ที่ถูกต้อง ฉันกำลังใช้git version 1.8.4ถ้าเรื่องนั้น
Rosdi Kasim

3
ทำไมคำผกผันใช้? ฉันคิดว่า "พวกเขา" จะเป็นไฟล์ระยะไกลและ "พวกเรา" จะเป็นไฟล์ของฉัน
phuclv


7
ไม่ความหมายของพวกเขาถูกย้อนกลับstackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714พวกเขาจะเป็นไฟล์ของฉันและไฟล์ของเราเป็นไฟล์ในสาขาระยะไกล
phuclv

6
"ง่าย" ใช่ ที่ใช้งานง่าย? ไม่
วิลเบอร์ Whateley

109

วิธีการนี้ดูเหมือนตรงไปตรงมามากขึ้นโดยหลีกเลี่ยงความจำเป็นในการเลือกแต่ละไฟล์:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

หรือ

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

คัดลอกโดยตรงจาก: แก้ไขข้อขัดแย้งของ Git เพื่อแก้ไขการเปลี่ยนแปลงในระหว่างการดึง


3
ชอบอันนี้. พิเศษถ้ามีมากกว่าหนึ่งไฟล์
Tek

คำถามนี้มีไว้สำหรับสองคำสั่งที่ต่างกัน แต่ไม่มีคำอธิบายเกี่ยวกับสิ่งที่ทั้งสองทำ แต่ละบรรทัดทำอะไร
อเล็กซ์

ฉันได้รับคำตอบ stackoverflow อย่างน้อยห้าคำก่อนที่จะค้นหาสิ่งนี้ซึ่งเป็นสิ่งที่ฉันต้องการ ขอบคุณ
โบลตันเบลีย์

14

git checkout {branch-name} -- {file-name}

นี่จะใช้ไฟล์จากสาขาที่เลือก

ฉันชอบสิ่งนี้เพราะการposh-gitเติมข้อความอัตโนมัติใช้งานได้ดีกับสิ่งนี้ นอกจากนี้ยังลบความคลุมเครือใด ๆ ที่สาขาเป็นระยะไกลและที่เป็นท้องถิ่น และ--theirsไม่ได้ผลสำหรับฉันเลย


ไม่มีความกำกวมใช้งานได้ทั้ง {mine} และ {พวกเขา} รองรับการเพิ่มไดเรกทอรีทั้งหมด นี่ควรเป็นคำตอบที่ยอมรับได้
dotancohen

9

สำหรับ stuff-line-end, อ้างถึงman git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

อย่าลืมเพิ่มautocrlf = falseและ / หรือsafecrlf = falseลงในโคลนหน้าต่าง (.git / config)

ใช้ git mergetool

หากคุณกำหนดค่า mergetool เช่นนี้:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

จากนั้นง่าย

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

จะทำหน้าที่

ใช้คำสั่ง git ง่าย ๆ

ในกรณีอื่น ๆ ฉันถือว่า

git checkout HEAD -- path/to/myfile.txt

ควรทำเคล็ดลับ

แก้ไขเพื่อย้อนกลับ (เพราะคุณเมามากขึ้น):

git checkout remote/branch_to_merge -- path/to/myfile.txt

+1 สำหรับเคล็ดลับ แต่ไม่ยอมรับ แต่ไม่ใช่สิ่งที่ฉันขอ ฉันต้องการบางสิ่งที่ทำงานได้ในทุกกรณีไม่ใช่เฉพาะในกรณีตัวอย่าง ยิ่งไปกว่านั้น "เช็คเอาต์แบบรีโมท / branch_to_merge - path / to / myfile.txt" จะไม่ทำงานถ้าคุณเริ่มทำการผสานแล้ว: มันจะบอกว่าคุณอยู่ในระหว่างการผสานและจะป้องกันไม่ให้คุณทำเช่นนั้น
e-Satisfaction

1
@ e-พอน: น่าแปลกใจ ฉันจะพิจารณาว่าเป็นข้อผิดพลาดเนื่องจากการชำระเงินด้วยเส้นทางไม่ใช่การชำระเงินปกติ (และจะไม่มีผลต่อ HEAD) ผมจะพยายามที่จะออกในขณะนี้เพราะฉันไม่สามารถเชื่อว่ามัน
sehe

1
@ e-Satisfaction: Soooo ... ฉันพูดถูก git checkout remote/branch_to_merge -- path/to/myfile.txtใช้งานได้อย่างมีเสน่ห์ในขณะที่แก้ไขข้อขัดแย้งในการผสาน (คอมไพล์ 1.7.1)
sehe

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