git: ฉันจะรับรหัสรุ่นล่าสุดได้อย่างไร


200

ฉันใช้ Git 1.7.4.1 ฉันต้องการรับรหัสรุ่นล่าสุดจากที่เก็บ แต่ฉันได้รับข้อผิดพลาด ...

$ git pull
….
M   selenium/ant/build.properties
….
M   selenium/scripts/linux/get_latest_updates.sh
M   selenium/scripts/windows/start-selenium.bat
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>' as appropriate to mark resolution, or use 'git commit -a'.

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


1
@ คำตอบของ Kzqai ด้านล่างช่วยฉัน: ลองทำgit fetchก่อน ฉันไม่ได้รับความขัดแย้ง แต่เป็นวิธีที่ฉันได้รับรหัสรุ่นล่าสุด
Chris K

คำตอบ:


258

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

git reset --hard HEAD
git clean -xffd
git pull

อีกครั้งนี่จะทำให้การเปลี่ยนแปลงใด ๆ ที่คุณทำในเครื่องใช้งานอย่างระมัดระวัง คิดว่าrm -Rfเมื่อทำเช่นนี้


1
ฉันลองใช้คำสั่งเหล่านี้และยังได้รับข้อผิดพลาด "ความขัดแย้ง (เนื้อหา): ผสานความขัดแย้งในซีลีเนียม / ant / build.xml" (ท่ามกลางคนอื่น ๆ ) ฉันแค่ต้องการเขียนทับไฟล์เวอร์ชั่นล่าสุดด้วยสิ่งที่อยู่ใน repo ฉันจะทำยังไงดี ??
เดฟ

31
git clean -fไม่ได้เป็นส่วนหนึ่งของคำตอบจริงๆ มันจะลบไฟล์ที่ไม่ถูกเก็บไว้ในที่เก็บ (เช่นในกรณีของฉันไฟล์บันทึก) คุณไม่จำเป็นต้องทำเช่นนี้เพื่อให้git pullทำงานได้อีกครั้งก็git reset --hard HEADเพียงพอแล้ว
Darren Cook

12
เอ๊ะคนไม่แนะนำหนึ่งในไม่กี่คำสั่งที่จะลบมือใหม่ git
Kzqai

6
@DarrenCook ผมคิดว่าgit clean -fเป็นสิ่งสำคัญหากคุณต้องการที่แท้จริงทำความสะอาดของ repositoy ของคุณ มันเทียบเท่ากับการทำ "ลบทั้งหมดจากโฟลเดอร์ -> รับรุ่นล่าสุด / รับเฉพาะ" ใน TFS และในกรณีของฉันนี่คือสิ่งที่ฉันต้องการ
RPDeshaies

3
@ Darren ฉันคิดว่าคอมไพล์สะอาด -f`` ก็สำคัญเช่นกัน ฉันต้องการรุ่นล่าสุดและไม่ต้องการเก็บรายการแคชล้าสมัยหรือแหล่งข้อมูลอื่น ๆ ที่สร้างขึ้นซึ่งไม่ได้อยู่บน repo คำตอบนั้นชัดเจนเกี่ยวกับความจริงที่ว่ามันจะลบการเปลี่ยนแปลงในท้องถิ่นและเลียนแบบเวอร์ชั่นล่าสุดจาก repo ดังนั้นมันจึงดูสมบูรณ์แบบสำหรับฉัน ฉันจะย้ายไฟล์บันทึกของฉันไปยังที่อื่นถ้าฉันต้องการเก็บไว้ระหว่างการอัพเดต
Balmipour

231

กรณีที่ 1: ไม่สนใจการเปลี่ยนแปลงในท้องถิ่น

  • โซลูชันที่ 1: รับรหัสล่าสุดและรีเซ็ตรหัส

    git fetch origin
    git reset --hard origin/[tag/branch/commit-id usually: master]
    
  • โซลูชันที่ 2: ลบโฟลเดอร์และโคลนอีกครั้ง: D

    rm -rf [project_folder]
    git clone [remote_repo]
    

กรณีที่ 2: ดูแลเกี่ยวกับการเปลี่ยนแปลงในท้องถิ่น

  • โซลูชันที่ 1: ไม่มีข้อขัดแย้งกับเวอร์ชันออนไลน์ใหม่

    git fetch origin
    git status
    

    จะรายงานสิ่งที่ชอบ:

    Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
    

    จากนั้นรับเวอร์ชันล่าสุด

    git pull
    
  • โซลูชันที่ 2: ข้อขัดแย้งกับรุ่นออนไลน์ใหม่

    git fetch origin
    git status
    

    จะรายงานสิ่งที่ชอบ:

    error: Your local changes to the following files would be overwritten by merge:
        file_name
    Please, commit your changes or stash them before you can merge.
    Aborting
    

    กระทำการเปลี่ยนแปลงในท้องถิ่นของคุณ

    git add .
    git commit -m ‘Commit msg’
    

    พยายามรับการเปลี่ยนแปลง (จะล้มเหลว)

    git pull
    

    จะรายงานสิ่งที่ชอบ:

    Pull is not possible because you have unmerged files.
    Please, fix them up in the work tree, and then use 'git add/rm <file>'
    as appropriate to mark resolution, or use 'git commit -a'.
    

    เปิดไฟล์ข้อขัดแย้งและแก้ไขข้อขัดแย้ง แล้ว:

    git add .
    git commit -m ‘Fix conflicts’
    git pull
    

    จะรายงานสิ่งที่ชอบ:

    Already up-to-date.
    

ข้อมูลเพิ่มเติม: ฉันจะใช้ 'รีเซ็ต git - ฮาร์ดหัว' เพื่อเปลี่ยนกลับไปสู่การคอมมิชชันก่อนหน้าได้อย่างไร


@ tvl.How ฉันจะได้รับการปรับปรุงล่าสุดโดยไม่ต้องยอมรับรหัสของฉัน (มีความขัดแย้ง) ไปที่สาขา .. โปรดช่วยฉัน
user3354457

@ user3354457 xm คำถามที่น่าสนใจ ฉันไม่เคยลองมาก่อน แต่คุณสามารถลองและรายงานกลับมาได้) ดังนั้น: - ทำการแก้ไขด้วยการเปลี่ยนแปลง: git diff> uncommited-changes.patch - รีเซ็ตสาขา - ดึงการเปลี่ยนแปลง - ใช้การแก้ไข
tvl

3
คำตอบนี้สมควรได้รับการโหวตมากเกินกว่าคำตอบที่ได้รับการยอมรับ
James

@ James :) ฉันดีใจที่คำตอบของฉันช่วยคุณได้ เคล็ดลับลองเขียนเอกสารเช่นคุณไม่รู้อะไรเกี่ยวกับหัวเรื่องและแน่นอนการใช้คำฟุ่มเฟื่อยจะช่วยให้คุณกลับมา
tvl

4
คำตอบที่สมบูรณ์ที่สุดสำหรับการเรียก git โพสต์นี้ควรถูกล็อค
Callat

17

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

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

git stash  
git pull

หากคุณต้องการเรียกไฟล์ของคุณ (อาจเกิดความขัดแย้งกับการเปลี่ยนแปลงต้นน้ำและทั้งหมด) ให้เรียกใช้ a git stash applyเพื่อติดการเปลี่ยนแปลงเหล่านั้นที่ด้านบนของรหัสของคุณ ด้วยวิธีนี้คุณมีวิธี "เลิกทำ"


1
ผมอาจจะแนะนำให้ใช้git stash popถ้าคุณต้องการประวัติศาสตร์ของ stashes คอมไพล์ของคุณ
Rapnar

7

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


2
ขอบคุณ ฉันกำลังประสบปัญหานี้ ฉันมีการเปลี่ยนแปลงบางอย่างในไฟล์การทำงานของฉันซึ่งฉันไม่ต้องการคอมมิท แต่ฉันไม่สามารถดึงคอมไพล์ได้ในกรณีนี้ ดังนั้นฉันทำ - git stash, git pull --rebase, git stash pop จากนั้นทำการผสานและคอมไพล์เพิ่ม file_merged
RuntimeException

6

ลองรหัสนี้

cd /go/to/path
git pull origin master

5
ยินดีต้อนรับสู่ Stackoverflow! โปรดลองเพิ่มคำอธิบายลงในโซลูชันของคุณเพื่ออธิบายวิธีแก้ปัญหาให้ดีขึ้น นั่นจะทำให้คำตอบของคุณมีประโยชน์มากขึ้น
dkackman

2

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


1

ฉันเข้าใจว่าคุณต้องการทิ้งการเปลี่ยนแปลงในเครื่องของคุณและดึงสิ่งที่อยู่ในระยะไกลออก

หากสิ่งอื่นล้มเหลวและหากคุณกลัว "รีเซ็ต" (สิ่งที่ค่อนข้างเข้าใจได้) สิ่งที่ง่ายที่สุดคือการโคลนแหล่งที่มาลงในไดเรกทอรีใหม่และถังขยะเก่าของคุณ


1

โดยการเรียกใช้คำสั่งนี้คุณจะได้รับแท็กล่าสุดที่มักจะเป็นเวอร์ชันของโครงการของคุณ:

git describe --abbrev=0 --tags

0

ฟังดูเหมือนว่าคุณกำลังมีปัญหา core.autocrlf core.autocrlf = true สามารถสร้างปัญหาเช่นเดียวกับที่คุณอธิบายบน Windows หากมีการทำเครื่องหมายบรรทัดใหม่ CRLF ในที่เก็บ ลองปิดการใช้งาน core.autocrlf สำหรับพื้นที่เก็บข้อมูลและดำเนินการฮาร์ดรีเซ็ต


0

หากคุณใช้ Git GUI ให้ดึงข้อมูลก่อนแล้วจึงรวม

ดึงข้อมูลผ่านเมนูระยะไกล >> ดึงข้อมูล >> กำเนิด ผสานผ่านเมนูผสาน >> ผสานท้องถิ่น

ข้อความต่อไปนี้จะปรากฏขึ้น

ป้อนคำอธิบายรูปภาพที่นี่

เลือกปุ่มตัวเลือกสาขาการติดตาม (โดยค่าเริ่มต้นที่เลือกไว้) ปล่อยให้กล่องสีเหลืองว่างเปล่าและกดผสานและนี่ควรปรับปรุงไฟล์

ฉันเปลี่ยนการเปลี่ยนแปลงในท้องถิ่นไปแล้วก่อนที่จะทำตามขั้นตอนเหล่านี้เนื่องจากฉันต้องการยกเลิกสิ่งเหล่านี้ต่อไปดังนั้นฉันจึงไม่ต้องกำจัดผ่านการผสานในภายหลัง

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