การซิงโครไนซ์ที่เก็บ Git ในเครื่องกับรีโมต


297

ฉันต้องการซิงโครไนซ์ที่เก็บโลคัลของฉันกับรีโมตเพื่อให้ที่เก็บโลคัลของฉันกลายเป็นสำเนารีโมต 100% - หมายความว่าหากไฟล์บางไฟล์แตกต่างกันในที่เก็บเหล่านี้เราจะแทนที่โลคัลด้วยรีโมตและถ้ามี ไฟล์ในที่เก็บโลคัลที่ไม่มีอยู่ในรีโมตลบไฟล์โลคัลออก

มีวิธีการอื่นนอกเหนือจากการทำโคลนนิ่งใหม่ของที่เก็บระยะไกลหรือไม่?

คำถามที่คล้ายกันเป็นซิงค์ repo คอมไพล์ในท้องถิ่นที่มีระยะไกลในหนึ่งยิงทิ้งการเปลี่ยนแปลงท้องถิ่น


4
ทุกครั้งที่ฉันมาที่นี่ฉันกำลังมองหาการซิงค์ส้อม
มาร์ตินโทมา

1
git fetch --prune
hassanzadeh.sd

คำตอบ:


342
git fetch --prune

-p, --prune
หลังจากดึงข้อมูลแล้วให้ลบสาขาติดตามระยะไกลใด ๆ ที่ไม่มีอยู่ในรีโมต ลูกพรุน


6
นั่นคือสิ่งที่ฉันกำลังมองหา! PS ครั้งต่อไปฉันจะอ่านหน้าคนอย่างระมัดระวังมากขึ้นก่อนที่จะขุด stackoverflow :-)
Sergiy Sokolenko

5
ใช่git pull -pทำเช่นเดียวกัน - 'git pull รัน git fetch ด้วยพารามิเตอร์ที่กำหนดและเรียก git merge เพื่อผสานส่วนหัวสาขาที่ดึงมาไว้ในสาขาปัจจุบัน' - git-scm.com/docs/git-pull
jobwat

2
ใช้git fetch <remote> --pruneในกรณีที่บางคนต้องการ--pruneรีโมทเฉพาะ เช่น. git fetch upstream --prune.
Fery Wardiyanto

git fetch origin --pruneเพื่อซิงค์คุณ repo ท้องถิ่นกับทางแยกupstreamโครงการ
Stuart Cardall

2
@SergiySokolenko นั่นคือสิ่งที่เราทุกคนพูด แต่ที่ลึกลงไปเรารู้ว่า SO สะดวกสบายมากขึ้นที่ man pages :-P
Marcello Romani

144

ขั้นตอนเหล่านี้จะทำ:

git reset --hard HEAD
git clean -f -x -d -n

จากนั้นไม่มี -n

สิ่งนี้จะดูแลการเปลี่ยนแปลงในท้องถิ่นทั้งหมด ตอนนี้ความมุ่งมั่น ...

git status

และจดบันทึกบรรทัดเช่น:

Your branch is ahead of 'xxxx' by N commits.

จดบันทึกหมายเลข 'N' ตอนนี้:

git reset --hard HEAD~N
git pull

และในที่สุดก็:

git status

ไม่ควรแสดงอะไรที่จะเพิ่ม / กระทำ สะอาดหมดจด

อย่างไรก็ตามการโคลนนิ่งใหม่สามารถทำได้เหมือนกัน (แต่ช้ามาก)

Updated === ===

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

git fetch # This updates 'remote' portion of local repo. 
git reset --hard origin/<your-working-branch>
# this will sync your local copy with remote content, discarding any committed
# or uncommitted changes.

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


1
ขอบคุณมากสำหรับการอัปเดตทำงานได้อย่างสมบูรณ์แบบด้วย github และ bitbucket :)
CommonSenseCode

คำตอบนี้เป็นคำตอบที่น่าเชื่อถือที่สุดสำหรับฉัน
AlanH

95

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

เมื่อดึงจากที่เก็บคุณจะคัดลอกสาขาทั้งหมดหรือบางส่วนที่นั่นไปยังที่เก็บของคุณ สิ่งเหล่านี้ในที่เก็บของคุณเป็น "กิ่งการติดตามระยะไกล" เช่นสาขาชื่อremotes/origin/masterเช่น

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

HEADสำเนาการทำงานของคุณมีปกติกระทำการตรวจสอบออกที่เรียกว่า การกระทำนี้มักจะเป็นเคล็ดลับของหนึ่งในสาขาของคุณ

ฉันคิดว่าคุณต้องการอัปเดตสาขาท้องถิ่นของคุณ (หรืออาจสาขาในประเทศทั้งหมดหรือไม่) ไปยังสาขาระยะไกลที่เกี่ยวข้องจากนั้นตรวจสอบสาขาล่าสุด

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

(แต่จากนั้นคุณจะสูญเสียการเปลี่ยนแปลงใด ๆ ในท้องถิ่น - ทั้งในการทำงานคัดลอกและการกระทำในท้องถิ่นตรวจสอบให้แน่ใจว่าคุณต้องการสิ่งนี้ - มิฉะนั้นจะใช้สาขาใหม่ที่ดีกว่านี้จะบันทึกการกระทำในท้องถิ่นของคุณและใช้git stashเพื่อบันทึกการเปลี่ยนแปลง .)


แก้ไข: หากคุณมีสาขาในประเทศเพียงสาขาเดียวและกำลังติดตามสาขาระยะไกลหนึ่งสาขาสิ่งที่คุณต้องทำคือ

git pull

จากภายในไดเรกทอรีทำงาน

สิ่งนี้จะดึงข้อมูลรุ่นปัจจุบันของสาขารีโมตที่ถูกติดตามทั้งหมดและอัพเดตสาขาปัจจุบัน (และไดเร็กทอรีการทำงาน) เป็นเวอร์ชันปัจจุบันของสาขารีโมตที่มันกำลังติดตาม


หากฉันเปลี่ยนสิ่งที่ไม่มีอยู่ในที่เก็บในเครื่องของฉันเพียงแค่.) ต้องการมีสำเนาของทุกสิ่งจากรีโมตและ b.) ต้องการความเป็นไปได้ที่จะแสดงความแตกต่างระหว่างเวอร์ชัน ดังนั้นฉันไม่ได้กระทำไม่เปลี่ยนแปลงอะไรเลย = ไม่มีการอัพเดท / การเปลี่ยนแปลงในท้องถิ่น คำสั่งใดที่ฉันควรใช้เป็นระยะ ๆ (เช่นทุกสัปดาห์หรือมากกว่านั้น) เพื่อให้บรรลุสองฟังก์ชันข้างต้น กรุณาตอบ KISS (Keep It Simple Stupid) - ฉันเป็น git noob เหมือนกันและ ofc จะ RTFM - แต่สำหรับการเริ่มต้นต้องการความช่วยเหลือ ;)
kobame

ในกรณีที่เรียบง่ายของคุณgit pullควรจะเพียงพอฉันคิดว่า (ฉันอัปเดตคำตอบ)
Paŭlo Ebermann

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

89

คุณต้องการจะทำ

git fetch --prune origin
git reset --hard origin/master
git clean -f -d

สิ่งนี้ทำให้ repo ในพื้นที่ของคุณเหมือนกับ repo ระยะไกลของคุณ

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


2
มันยังลบไดเรกทอรีทั้งหมดออกจากการติดตั้ง npm และการติดตั้ง bower ไม่แนะนำเว้นแต่คุณต้องการติดตั้งการอ้างอิงทั้งหมดที่อยู่ใน. gitignore อีกครั้ง
chwagssd

มันไม่ได้ลบของฉันnode_modulesมันทำงานได้อย่างที่ฉันต้องการ
Vahid Amiri

คำเตือน: มันจะลบไฟล์ที่ไม่ได้ติดตาม
Amit Yadav

ฉันทำข้อมูลทั้งหมดของฉันหายโดยใช้รหัสนี้ฉันพยายามซิงโครไนซ์ที่เก็บข้อมูลในเครื่องของฉันกับที่เก็บ git แต่มันทำให้ที่เก็บส่วนกลางของฉันประสานกับที่เก็บในเครื่องของฉัน
Zahid Khan

10

รีเซ็ตและซิงค์ที่เก็บข้อมูลโลคัลด้วยรีโมตสาขา

คำสั่ง: อย่าลืมแทนที่ต้นกำเนิดและหลักด้วยรีโมตและสาขาที่คุณต้องการซิงโครไนซ์ด้วย

git fetch origin && git reset --hard origin/master && git clean -f -d

หรือทีละขั้นตอน:

git fetch origin
git reset --hard origin/master
git clean -f -d

ขณะนี้สาขาในพื้นที่ของคุณเป็นสำเนาที่แน่นอน (กระทำและทั้งหมด) ของสาขาระยะไกล

เอาต์พุตคำสั่ง:

นี่คือตัวอย่างของการรันคำสั่งบนโลคัลโคลนของที่เก็บ Forge a git

sharkbook:forge lbaxter$ git fetch origin && git reset --hard origin/master && git clean -f -d
HEAD is now at 356cd85 FORGE-680
Removing forge-example-plugin/
Removing plugin-container-api/
Removing plugin-container/
Removing shell/.forge_settings
sharkbook:forge lbaxter$

4

(ข้อมูลนี้มาจากคู่มือผู้ใช้ Git )

ฉันกำลังเรียนอยู่ด้วยดังนั้นนี่อาจไม่ใช่คำตอบที่แน่นอนสำหรับคำถาม แต่อาจช่วยใครซักคน:

  1. เมื่อพื้นที่เก็บข้อมูลระยะไกลถูกโคลนสำเนาครั้งแรกของสาขาทั้งหมดจะถูกเก็บไว้ในพื้นที่เก็บข้อมูลในท้องถิ่นของคุณ (ดูพวกเขาด้วยgit branch -r)
  2. การอัปเดตสำเนาเหล่านี้และทำให้พวกเขาในปัจจุบัน (เช่นซิงค์ให้กับสาขาที่ห่างไกล) git fetchการใช้งาน สิ่งนี้จะไม่มีผลกับสาขาที่คุณสร้างขึ้นเอง
  3. หากต้องการแทนที่สาขาในท้องถิ่นของคุณเช็คเอาต์เป็นสาขาใหม่ของสาขาใดก็ตามที่คุณกำลังใช้งาน (สมมติว่าคุณได้git add origin /path/to/repositoryใช้งานไปแล้ว) git checkout origin/branch_nameสิ่งนี้จะแทนที่การเปลี่ยนแปลงในท้องถิ่นของคุณที่สาขาbranch_name

3

ดูเหมือนว่าคุณต้องการกระจกของที่เก็บระยะไกล:

git clone --mirror url://to/remote.git local.git

คำสั่งนั้นสร้างที่เก็บเปลือย หากคุณไม่ต้องการที่เก็บเปล่าสิ่งต่าง ๆ ก็ซับซ้อนขึ้น


3

หากคุณกำลังพูดถึงการทำข้อมูลให้ตรงกัน repo แยกแล้วคุณสามารถทำตามขั้นตอนเหล่านี้

วิธีซิงค์ที่เก็บ fork จาก git

  1. ตรวจสอบสาขา git ปัจจุบันของคุณ

    git branch

  2. เช็คเอาต์ไปยังมาสเตอร์ถ้าคุณไม่ได้อยู่ในหลัก

    git checkout master

  3. ดึงข้อมูลที่เก็บอัปสตรีมหากคุณมีสิทธิ์การเข้าถึงที่ถูกต้อง

    git fetch upstream

  4. หากคุณได้รับข้อผิดพลาดด้านล่างแล้วเรียกใช้

    git remote add upstream git@github.com:upstream_clone_repo_url/xyz.git

    fatal: 'upstream/master' does not appear to be a git repository  
    fatal: Could not read from remote repository.
    Please make sure you have the correct access rights and the repository exists.
    
  5. ตอนนี้เรียกใช้คำสั่งด้านล่าง

    git fetch upstream

  6. ตอนนี้ถ้าคุณอยู่บนต้นแบบแล้วรวมอัปสตรีม / ต้นแบบลงในสาขาต้นแบบ

    git merge upstream/master

    แค่นั้นแหละ!!

    Crosscheck ผ่านgit remoteคำสั่งเฉพาะเจาะจงมากขึ้นgit remote -v

    ถ้าฉันยังมีสิทธิ์ที่จะซื้อคืนต้นน้ำฉันสามารถสร้างสาขาต้นน้ำท้องถิ่นและทำงานที่จะไปอยู่ที่นั่น


เหตุใดฉันจึงควร 5.git ดึงข้อมูล upstream เมื่อฉันได้รับข้อผิดพลาดในขั้นตอนที่สามแล้ว
Md Sifatul Islam

-2

คุณสามารถใช้hooks gitได้ เพียงแค่สร้างเบ็ดที่ผลักดันให้เปลี่ยนเป็น repo อื่น ๆ หลังจากการปรับปรุง

แน่นอนคุณอาจได้รับความขัดแย้งผสานดังนั้นคุณต้องคิดวิธีการจัดการกับพวกเขา

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