วิธีดึงสาขาระยะไกลจาก repo ของคนอื่น


266

ฉันมีโปรเจ็กต์ที่โฮสต์บน GitHub ที่บางคนเคยแยก พวกเขาได้สร้างสาขาใหม่ "foo" และทำการเปลี่ยนแปลงบางอย่าง ฉันจะดึง "foo" ของพวกเขาไปยังสาขาใหม่ที่ชื่อ "foo" ใน repo ของฉันได้อย่างไร

ฉันเข้าใจว่าพวกเขาสามารถส่งคำขอดึงให้ฉันได้ แต่ฉันต้องการเริ่มกระบวนการนี้เอง

สมมติว่าต่อไปนี้:

  1. เนื่องจากพวกเขาแยกโครงการของฉันทั้งสอง repos ของเราแบ่งปัน 'ประวัติศาสตร์' เดียวกัน
  2. แม้ว่า GitHub จะแสดงว่าโครงการของพวกเขาถูกแยกออกจากเหมือง แต่ที่เก็บในเครื่องของฉันก็ไม่มีการอ้างอิงถึงโครงการของบุคคลนี้ ฉันต้องเพิ่มรายการเหล่านั้นเป็นรีโมทหรือไม่
  3. ฉันยังไม่มีสาขาชื่อ "foo" แต่ฉันไม่รู้ว่าฉันต้องสร้างด้วยตนเองก่อนหรือไม่
  4. ฉันต้องการให้สิ่งนี้ดึงเข้าไปในสาขาที่แยกต่างหากไม่ใช่อาจารย์ของฉัน

คำตอบ:


349
git remote add coworker git://path/to/coworkers/repo.git
git fetch coworker
git checkout --track coworker/foo

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

git checkout foo
git pull

การตอบสนองต่อความคิดเห็น:

เจ๋ง :) และหากฉันต้องการเปลี่ยนแปลงสาขาของตัวเองฉันควรสร้าง "บาร์" สาขาท้องถิ่นจาก "foo" และทำงานที่นั่นแทน "foo" ของฉันโดยตรงหรือไม่

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

git branch --set-upstream foo colin/foo

สมมติว่าcolinเป็นที่เก็บข้อมูลของคุณ (เป็นรีโมตไปยังที่เก็บข้อมูลของเพื่อนร่วมงาน) ที่กำหนดไว้ในลักษณะเดียวกัน

git remote add colin git://path/to/colins/repo.git

3
นั่นเป็นไปอย่างรวดเร็วมาก :) คุณอาจต้องการเพิ่มว่าเขาควรจะใช้git://URL จากหน้าพื้นที่เก็บข้อมูลของบุคคลอื่น GitHub //path/to/coworkers/repo.gitในสถานที่ของ (การอธิบายว่าเป็นสิ่งที่ทำให้คำตอบของฉันช้าเกินไป))
Mark Longair

เจ๋ง :) และถ้าฉันต้องการเปลี่ยนแปลงสาขาของตัวเองฉันควรสร้าง "บาร์" สาขาในท้องถิ่นจาก "foo" และทำงานที่นั่นแทน "foo" ของฉันโดยตรงหรือไม่
Colin O'Dell

หรือปลอดภัยในการทำงานโดยตรงใน "foo" ของฉันและดึง / รวมการเปลี่ยนแปลงของเขาในภายหลังหรือไม่ ข้อปฏิบัติที่ดีที่สุดของที่นี่คืออะไร
Colin O'Dell

1
สมบูรณ์แบบนั่นคือสิ่งที่ฉันกำลังมองหา :) ขอบคุณสำหรับความช่วยเหลือของคุณ !!
Colin O'Dell

1
คำตอบที่ดีใน 3 นาที!
Tieme

103

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

คว้าความมุ่งมั่นของพวกเขา

git fetch git@github.com:theirusername/reponame.git theirbranch:ournameforbranch

สิ่งนี้จะสร้างสาขาท้องถิ่นที่ชื่อournameforbranchซึ่งเหมือนกับสิ่งที่theirbranchพวกเขาทำ foo:fooยกตัวอย่างเช่นคำถามที่ว่าอาร์กิวเมนต์สุดท้ายจะเป็น

:ournameforbranchส่วนโน้ตอาจจะถูกละทิ้งไปอีกหากการคิดชื่อที่ไม่ขัดแย้งกับสาขาใดสาขาหนึ่งของคุณนั้นน่ารำคาญ ในกรณีนั้นมีการอ้างอิงที่เรียกว่าFETCH_HEADพร้อมใช้งาน คุณสามารถgit log FETCH_HEADดูการกระทำของพวกเขาแล้วทำสิ่งต่าง ๆ เช่นcherry-pickedการเชอร์รี่เลือกการกระทำของพวกเขา

ผลักมันกลับไปที่พวกเขา:

บ่อยครั้งที่คุณต้องการแก้ไขบางสิ่งบางอย่างของพวกเขาและผลักดันมันกลับมา เป็นไปได้เช่นกัน:

git fetch git@github.com:theirusername/reponame.git theirbranch
git checkout FETCH_HEAD

# fix fix fix

git push git@github.com:theirusername/reponame.git HEAD:theirbranch

ถ้าทำงานในรัฐเดี่ยวคุณกังวลโดยวิธีการทั้งหมดสร้างสาขาใช้:ournameforbranchและแทนที่FETCH_HEADและข้างต้นด้วยHEADournameforbranch


2
ขอบคุณสำหรับสิ่งนี้คำตอบอื่น ๆ จะไม่ทำงานหากทั้งคุณและบุคคลอื่นมีสาขาเหมือนกัน (เช่นmasterสาขาเริ่มต้น)
งาน

2
เป็นมูลค่าการกล่าวขวัญว่าวิธีนี้จะไม่ทำงานหากคุณไม่มีสิ่งใดเช่นรหัส SSH ที่เชื่อมโยงกับบัญชี github ของคุณดูstackoverflow.com/questions/12940626
Przemek D

คุณไม่ต้องถูกเพิ่มเป็นผู้ทำงานร่วมกันเพื่อที่คุณจะได้กลับไปที่ repo ของพวกเขา?
ฮันนี่

@Honey แน่นอน! การพุชสมมติว่าคุณมีสิทธิ์ที่จำเป็นบนรีโมตปลายทาง การดึงข้อมูลสมมติว่าเส้นทางสามารถเข้าถึงได้
antak

หากคุณทำงานgit branch -m newbranchในขณะที่อยู่ในสถานะแยกออกนี้คอมไพล์จะหมดความกังวลและเริ่มบอกว่า repo ของคุณไม่ถูกต้องอีกต่อไป git initดูเหมือนว่าจะแก้ไขและทำให้คุณกลับมาอยู่ในสภาพที่คุณเคยอยู่มาไม่มากก็น้อยด้วยสาขาที่ชื่อว่า "newbranch"
Ian Hickson

14

หากคำตอบของ antak:

git fetch git@github.com:<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH> 

ให้คุณ:

Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

จากนั้น (ปฏิบัติตามคำแนะนำของ Przemek D)

git fetch https://github.com/<THEIR USERNAME>/<REPO>.git <THEIR BRANCH>:<OUR NAME FOR BRANCH>

6

ต่อไปนี้เป็นวิธีแก้ปัญหาที่ดีที่ทำงานร่วมกับ GitHub เพื่อตรวจสอบสาขา PR จากทางแยกของผู้ใช้รายอื่น คุณต้องทราบรหัสคำขอดึง (ซึ่ง GitHub แสดงขึ้นพร้อมกับชื่อเรื่อง PR)

ตัวอย่าง:

แก้ไขรหัสที่ไม่ปลอดภัยของคุณ # 8
อลิซต้องการที่จะรวม 1 กระทำลงไปyour_repo:masterจากher_repo:branch

git checkout -b <branch>
git pull origin pull/8/head

originแทนระยะไกลของคุณถ้าแตกต่างจาก
ทดแทน8ด้วย ID คำขอดึงที่ถูกต้อง


2
สิ่งนี้ต้องการ upvotes มากขึ้น ใช้งาน pe3 อย่างสมบูรณ์และหลีกเลี่ยงข้อผิดพลาด "ร้ายแรง: หาข้ออ้างอิงจากระยะไกลไม่ได้" ที่ฉันได้รับพร้อมกับคำตอบที่ได้รับคะแนนสูงสุด ขอบคุณ!
Michael Romrell

โค้ดง่าย ๆ 2 บรรทัด ขอบคุณที่แชร์สิ่งนี้! สิ่งเดียวที่หวานกว่านี้คือการรวมการอัปเดตกลับไปเป็นคำขอดึงในแบบง่าย ๆ
klewis

4

GitHub มีตัวเลือกใหม่ที่สัมพันธ์กับคำตอบก่อนหน้าเพียงแค่คัดลอก / วางบรรทัดคำสั่งจาก PR:

  1. เลื่อนไปที่ด้านล่างของ PR เพื่อดูปุ่มMergeหรือSquash and merge
  2. คลิกที่ลิงค์ด้านขวา: view command line instructions
  3. กดไอคอน Copy ทางด้านขวาของขั้นตอนที่ 1
  4. วางคำสั่งในเทอร์มินัลของคุณ

2

หาก repo ที่แยกจากกันได้รับการปกป้องดังนั้นคุณจะไม่สามารถผลักดันมันเข้าไปได้โดยตรงและเป้าหมายของคุณคือการเปลี่ยนแปลง foo ของพวกเขาคุณจะต้องดึง foo สาขาของพวกเขาเป็น repo ของคุณดังนี้:

git remote add protected_repo https://github.com/theirusername/their_repo.git
git fetch protected_repo 
git checkout --no-track protected_repo/foo

ตอนนี้คุณมีสำเนาของ foo ในท้องที่โดยไม่เกี่ยวข้องกับต้นน้ำ คุณสามารถคอมมิชชันการเปลี่ยนแปลง (หรือไม่) แล้วกด foo ของคุณไปยัง repo ระยะไกลของคุณเอง

git push --set-upstream origin foo

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

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