ดึงการอัปเดตใหม่จากที่เก็บ GitHub ดั้งเดิมลงในที่เก็บ GitHub ที่มีการแยก


615

ฉันแยกที่เก็บของใครบางคนบน GitHub และต้องการอัปเดตเวอร์ชันของฉันด้วยคำสั่งและการอัปเดตที่ทำในที่เก็บต้นฉบับ สิ่งเหล่านี้เกิดขึ้นหลังจากที่ฉันนำสำเนาของฉันมา

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


1
ซ้ำเป็นไปได้หรืออาจจะเกี่ยวข้องเพียง: การผสานระหว่างส้อมใน GitHub

ในกรณีที่มีแท็กเพิ่มเติมที่คุณอาจต้องการซิงค์ให้ทำgit push --force origin --tagsตามแนวทางแก้ไขที่เสนอ!
MediaVince

คำตอบ:


716

คุณต้องเพิ่มที่เก็บต้นฉบับ (อันที่คุณแยกไว้) เป็นรีโมต

จากหน้าส้อม GitHub :

ส้อม

เมื่อโคลนเสร็จสิ้น repo ของคุณจะมีชื่อ“ origin” ที่ชี้ไปที่ทางแยกของคุณบน GitHub
อย่าปล่อยให้ชื่อคุณสับสนนี่ไม่ได้ชี้ไปที่ repo ดั้งเดิมที่คุณแยกออกมา เพื่อช่วยคุณติดตาม repo นั้นเราจะเพิ่มรีโมตอื่นที่ชื่อว่า“ upstream”:

$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

คุณมียังเป็นอัญมณีทับทิมซึ่งสามารถอำนวยความสะดวกในการดำเนินงานของผู้ GitHub

คดเคี้ยว

ดูเพิ่มเติมที่ " Git fork is git clone? "


14
ดูเพิ่มเติมbassistance.de/2010/06/25/git-fu-updating-your-github-forkสำหรับการสรุปที่ดี
VonC

2
@Syedrakib ฉันชอบgit rebase upstream/masterแต่ฉันได้เพิ่มความเป็นไปได้สองอย่างในคำตอบ
VonC

1
@PaBLoX หากคุณมีคดเคี้ยว repo คุณกำลังทำงานกับคุณ repo ในของคุณสาขา: rebase และบังคับผลักดัน: ไม่มีระเบียบที่เกี่ยวข้อง แม้แต่คำขอดึงกำลังดำเนินการจะถูกปรับปรุงอย่างถูกต้อง
VonC

2
@PaBLoX คุณไม่ได้สร้างความยุ่งเหยิง: คุณgit push --forceแทนที่ประวัติศาสตร์ของสาขาของคุณใน GitHub โดยสาขาในพื้นที่ของคุณ เนื่องจากมีเพียงคุณเท่านั้นที่ใช้สาขาเศร้าไม่มีระเบียบเข้ามาเกี่ยวข้อง
VonC

2
ฉันเข้าใจ. ฉันยังคงคิดว่ามันเป็นเรื่องยากไม่ใช่เรื่องง่ายและไม่เป็นธรรมชาติ ถึงกระนั้นก็แปลกที่การเปลี่ยนแปลงของฉันจะอยู่ด้านบนเสมอ โซลูชันที่ฉันโพสต์ก่อนหน้าจะดูดีขึ้น (ยังไม่สำคัญเกินไป) ปัญหาคือการกระทำการเปลี่ยนแปลงแฮช (เห็นได้ชัดเนื่องจากมีผู้ปกครองใหม่) และสร้างเสียงรบกวนมากมายภายใน GitHub เมื่อมีการเรียกปัญหา ยังคงทำให้ฉันประหลาดใจว่าไม่มีวิธีที่จะอัปเดตกับอัปสตรีมและจัดการส้อมของคุณเองโดยไม่ต้องสร้างการผสานที่ไม่มีจุดหมายหรือ "โกหก" เกี่ยวกับประวัติ
Pablo Olmos de Aguilera C.

99

นอกเหนือจากคำตอบของ VonC คุณสามารถปรับแต่งตามความชอบของคุณได้มากขึ้น

หลังจากดึงจากสาขาระยะไกลคุณจะยังคงต้องรวมการกระทำ ฉันจะแทนที่

$ git fetch upstream

กับ

$ git pull upstream master

เนื่องจากการดึง git นั้นใช้เรียก git + git merge


ถ้าฉันรู้ว่าสาขาอัปสตรีมไม่มีการเปลี่ยนแปลงใด ๆ กับไฟล์ที่มีอยู่ แต่เพิ่มไฟล์ทรัพยากรเพียงไม่กี่ไฟล์ - ฉันยังต้องรวมหรือไม่
azec-pdx

4
แน่นอนมันจะทำการส่งต่ออย่างรวดเร็วในกรณีนั้น
Domness

วิธีการหนึ่งที่ทำให้upstream masterเขียนทับไฟล์ในเครื่องทั้งหมด (ดังนั้นจึงไม่มีการรวมที่ขัดแย้งกัน) upstream master นั้นเป็นผู้นำในรหัสในกรณีนี้ดังนั้นเราจึงเชื่อถือได้ 100% ... ได้จัดการทำเช่นนี้
snh_nl

1
@snh_nl ทราบว่านี้ไม่ได้เป็นความขัดแย้งฟรีถ้าคุณต้องแยกออกจากพอgit rebase upstream master upstream/masterดูgit-scm.com/docs/git-rebase (tl; dr: ฮาร์ดรีเซ็ตอาจารย์ในพื้นที่ของคุณไปที่ต้นน้ำและจากนั้นพยายามที่จะนำความมุ่งมั่นในท้องถิ่นทั้งหมดกลับคืนมาจากจุดแตกต่างไปข้างหน้า)
cowbert

68

วิดีโอนี้แสดงวิธีอัปเดตทางแยกโดยตรงจาก GitHub

ขั้นตอน:

  1. เปิดส้อมของคุณบน GitHub
  2. Pull Requestsคลิกที่
  3. New Pull Requestคลิกที่ โดยค่าเริ่มต้น GitHub จะเปรียบเทียบต้นฉบับกับทางแยกของคุณและไม่ควรมีอะไรให้เปรียบเทียบหากคุณไม่ได้ทำการเปลี่ยนแปลงใด ๆ
  4. switching the baseคลิกที่ ตอนนี้ GitHub จะเปรียบเทียบส้อมของคุณกับต้นฉบับและคุณควรเห็นการเปลี่ยนแปลงล่าสุดทั้งหมด
  5. คลิกที่Create a pull requestการเปรียบเทียบนี้และกำหนดชื่อที่คาดเดาได้ให้กับคำขอการดึงของคุณ (เช่นอัปเดตจากต้นฉบับ)
  6. Create pull requestคลิกที่
  7. เลื่อนลงและคลิกMerge pull requestแล้วConfirmรวมเข้าด้วยกัน หากส้อมของคุณไม่มีการเปลี่ยนแปลงใด ๆ คุณจะสามารถผสานได้โดยอัตโนมัติ

3
แต่น่าเสียดายที่วิธีการแบบกราฟิกที่ดีนี้สร้างเสียงเพิ่มในทางแยกของคุณดังกล่าวข้างต้นในความคิดเห็นสำหรับคำตอบที่ได้รับการยอมรับ ดังนั้นจึงแนะนำให้ใช้วิธีบรรทัดคำสั่ง: help.github.com/articles/syncing-a-fork
Jonathan Cross

ฉันไม่สามารถหาสิ่งที่switching the baseตัวเลือก
Alper

64

ใช้:

git remote add upstream ORIGINAL_REPOSITORY_URL

สิ่งนี้จะตั้งค่าอัปสตรีมของคุณเป็นที่เก็บที่คุณแยกจาก จากนั้นทำสิ่งนี้:

git fetch upstream      

สิ่งนี้จะดึงกิ่งก้านสาขาทั้งหมดรวมถึงต้นแบบจากที่เก็บต้นฉบับ

ผสานข้อมูลนี้ในสาขาหลักของคุณ:

git merge upstream/master

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

git push origin master

Voila! คุณเสร็จสิ้นด้วยการซิงค์ที่เก็บต้นฉบับ


วิธีการหนึ่งที่ทำให้ upstream master เขียนทับไฟล์ในเครื่องทั้งหมด (ดังนั้นจึงไม่มีการรวมที่ขัดแย้งกัน) upstream master นั้นเป็นผู้นำในรหัสในกรณีนี้ดังนั้นเราจึงเชื่อถือได้ 100% ... ได้จัดการทำเช่นนี้
snh_nl

วิธีหนึ่งคือเพียงแค่คัดลอกโลคัลและทำการโคลนนิ่งใหม่ :)
ARK

1

หากคุณใช้แอปพลิเคชันเดสก์ท็อป GitHub จะมีปุ่มซิงโครไนซ์ที่มุมบนขวา คลิกที่มันแล้วUpdate from <original repo>ใกล้ด้านบนซ้าย

หากไม่มีการเปลี่ยนแปลงที่จะทำข้อมูลให้ตรงกันการทำเช่นนี้จะไม่ทำงาน

นี่คือภาพหน้าจอบางส่วนเพื่อให้ง่าย


1

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


1

ถ้าคุณต้องการที่จะทำโดยไม่ต้อง cli คุณสามารถทำได้อย่างสมบูรณ์บนเว็บไซต์ Github

  1. ไปที่ที่เก็บของแยก
  2. New pull requestคลิกที่
  3. ตรวจสอบให้แน่ใจว่าตั้งค่า fork ของคุณเป็นที่เก็บฐานและที่เก็บต้นฉบับ (upstream) เป็นที่เก็บข้อมูลหลัก โดยปกติคุณต้องการซิงค์สาขาหลักเท่านั้น
  4. Create new pull request.
  5. เลือกลูกศรทางด้านขวาของปุ่มผสานและตรวจสอบให้แน่ใจว่าเลือก rebase แทนที่จะรวม จากนั้นคลิกที่ปุ่ม วิธีนี้จะไม่ทำให้เกิดการรวมที่ไม่จำเป็น
  6. เสร็จสิ้น

0

ในการซิงค์ที่เก็บข้อมูลที่มีการแยกของคุณโดยอัตโนมัติกับที่เก็บข้อมูลหลักคุณสามารถใช้แอปพลิเคชันดึงบน GitHub

อ้างถึงReadmeสำหรับรายละเอียดเพิ่มเติม

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

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