Git ดึงสาขาจาก GitHub


631

ฉันมีโครงการที่มีหลายสาขา ฉันผลักพวกเขาไปที่GitHubและตอนนี้มีคนอื่นกำลังทำงานในโครงการที่ฉันต้องดึงสาขาของพวกเขาจาก GitHub มันทำงานได้ดีในระดับปริญญาโท xyzแต่บอกว่าคนที่สร้างสาขา ฉันจะดึงสาขาxyzจาก GitHub และรวมเข้าxyzกับสาขาของฉันได้localhostอย่างไร

ฉันมีคำตอบที่นี่จริง ๆ : ผลักและดึงกิ่งก้านใน Git

แต่ฉันได้รับข้อผิดพลาด "! [ถูกปฏิเสธ]" และบางอย่างเกี่ยวกับ "ไม่ไปข้างหน้าอย่างเร็ว"

ข้อเสนอแนะใด ๆ


3
คำสั่งจริงที่คุณใช้คืออะไร
Alex N.

1
มีการดึงข้อมูลที่อาจล้มเหลวพร้อมกับข้อความ 'ไม่ใช่การกรอไปข้างหน้า' คุณได้แก้ไขสาขาการติดตามระยะไกล (ที่มา / xyz) หรือเป็นสาขาที่กรอกลับ / เขียนใหม่ในที่เก็บระยะไกลหรือไม่ คุณอาจต้องใช้ " git fetch origin --force" แต่โปรดอ่านเอกสารก่อนดำเนินการ
Jakub Narębski

คำตอบ:


758

แต่ฉันได้รับข้อผิดพลาด "! [ถูกปฏิเสธ]" และบางอย่างเกี่ยวกับ "ไม่กรอไปข้างหน้า"

นั่นเป็นเพราะ Git ไม่สามารถรวมการเปลี่ยนแปลงจากกิ่งก้านสาขาเข้ากับเจ้านายปัจจุบันของคุณ สมมติว่าคุณได้ตรวจสอบจากสาขาและคุณต้องการที่จะรวมในสาขาที่ห่างไกลmaster other-branchเมื่อคุณทำสิ่งนี้:

$ git pull origin other-branch

Git โดยพื้นฐานแล้วทำสิ่งนี้:

$ git fetch origin other-branch && git merge other-branch

นั่นคือpullเป็นเพียงตามมาด้วยfetch mergeอย่างไรก็ตามเมื่อไหร่pullไอเอ็นจี, Git จะเพียงผสานother-branch ถ้ามันสามารถดำเนินการได้อย่างรวดเร็วไปข้างหน้าผสาน การผสานไปข้างหน้าอย่างรวดเร็วคือการผสานที่ส่วนหัวของสาขาที่คุณกำลังพยายามผสานเข้าด้วยกันคือการสืบทอดโดยตรงของหัวหน้าสาขาที่คุณต้องการผสาน ตัวอย่างเช่นหากคุณมีแผนผังประวัตินี้การผสานother-branchจะส่งผลให้มีการผสานอย่างรวดเร็ว:

O-O-O-O-O-O
^         ^
master    other-branch

อย่างไรก็ตามนี่จะไม่ใช่การผสานที่รวดเร็ว:

    v master
O-O-O
\
 \-O-O-O-O
         ^ other-branch

เพื่อแก้ปัญหาของคุณก่อนอื่นให้ดึงรีโมตสาขา

$ git fetch origin other-branch

จากนั้นรวมเข้าในสาขาปัจจุบันของคุณ (ฉันจะสมมติว่าเป็นmaster) และแก้ไขข้อขัดแย้งการผสาน:

$ git merge origin/other-branch
# Fix merge conflicts, if they occur
# Add merge conflict fixes
$ git commit    # And commit the merge!

ไม่ปัญหาเกิดจากการดึงข้อมูลไม่ใช่ขั้นตอนการรวม
Jakub Narębski

3
โดยปกติรีโมตจะถูกตั้งค่าเพื่อให้การดึงข้อมูลถูกบังคับแม้ว่าจะไม่ส่งผลให้มีการส่งต่ออย่างรวดเร็วดังนั้นจึงไม่ควรเกิดขึ้นเมื่อดึงข้อมูลยกเว้น OP จะเปลี่ยนบางสิ่งด้วยการกำหนดค่าตามปกติ ปัญหาการกรอไปข้างหน้าสามารถเกิดขึ้นได้ในระหว่างการดึงหรือผสาน อะไรทำให้คุณพูดว่าปัญหานั้นเกิดขึ้นอย่างแน่นอนและไม่ใช่ในการรวมกัน?
mipadi

ฉันทำตามขั้นตอนเหล่านี้ (ดึงข้อมูลผสาน) Git บอกฉันว่าไม่มีอะไรจะทำ เมื่อฉันพยายามที่จะกระทำมันตกครวญครางเกี่ยวกับการส่งต่ออย่างรวดเร็ว
Jean Jordaan

1
@mipadi ฉันมีปัญหาเช่นเดียวกับจีนและในขณะที่ฉันไม่สามารถพูดได้ว่าการตั้งค่าระยะไกลในวิธีที่ไม่ใช่ค่าเริ่มต้นที่คุณกล่าวถึงฉันสามารถพูดgit fetch -fได้ใช้แก้ไขปัญหาของฉัน! ขอบคุณ!
cregox

1
สิ่งนี้จะรวมสาขาจากระยะไกลxzyเข้ากับสาขาในพื้นที่masterซึ่งไม่ใช่สิ่งที่บ่งบอกถึงคำถามเดิม "ฉันจะดึง branch xyz จาก GitHub และรวมมันไว้ใน branch xyz บน localhost ของฉันได้อย่างไร"
user5359531

301

เพียงแค่ติดตามสาขาระยะไกลของคุณอย่างชัดเจนและง่าย ๆgit pullจะทำสิ่งที่คุณต้องการ:

git branch -f remote_branch_name origin/remote_branch_name
git checkout remote_branch_name

หลังคือการดำเนินการในท้องถิ่น

หรือเหมาะสมมากยิ่งขึ้นกับเอกสาร GitHub ในการฟอร์ก :

git branch -f new_local_branch_name upstream/remote_branch_name

39
หากคุณได้รับ 'ไม่ใช่ชื่อวัตถุที่ถูกต้อง:' origin / remote_branch_name 'ให้ทำ' git fetch origin 'ก่อน
Martin Konicek

130

คุณสามารถดึงสาขาไปยังสาขาด้วยคำสั่งดังต่อไปนี้

git pull {repo} {remotebranchname}:{localbranchname}

git pull origin xyz:xyz

เมื่อคุณอยู่ในสาขาหลักคุณยังสามารถเช็คเอาต์สาขาเช่น:

git checkout -b xyz

สิ่งนี้จะสร้างสาขาใหม่ "xyz" จากต้นแบบและตรวจสอบได้โดยตรง

จากนั้นคุณทำ:

git pull origin xyz

วิธีนี้จะดึงสาขาใหม่ไปยังxyzสาขาท้องถิ่นของคุณ


1
ที่สมบูรณ์แบบ! ฉันไม่ทราบว่าไวยากรณ์: git pull {repo} {remotebranchname}: {localbranchname} คำถามหากการดึงนั้นใช้ไม่ได้ (อาจมีคนอัปเดตสาขาและอาจมีการรวมความขัดแย้ง) ตัวเลือกของฉันคืออะไร
Costa

7
ฉันกำลัง downvoting นี้เพราะมันพยายามที่จะรวมสาขาระยะไกลเข้ากับสาขาปัจจุบันของคุณ (เช่นต้นแบบ) นี่ไม่ใช่สิ่งที่คนส่วนใหญ่ต้องการทำและไม่ใช่สิ่งที่ OP ต้องการ คำตอบโดย @mohit เป็นตัวเลือกที่ถูกต้อง
Phrogz

1
Phrogz - ดูเหมือนว่าพฤติกรรมนี้เปลี่ยนไปใน Git รุ่นล่าสุด ฉันเคยใช้มันมาก่อนและใช้งานได้ดีอย่างสมบูรณ์
Pawan

88

วิธีที่ดีที่สุดคือ:

git checkout -b <new_branch> <remote repo name>/<new_branch>

1
หลังจากสร้างสาขา "dev" ใหม่บน github และลองทำตามด้านบนฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้: "fatal: origin / dev ไม่ใช่การคอมมิชชันและไม่สามารถสร้าง 'dev' ของสาขาได้" Solution is to "git ดึง "ต่อโซลูชันของ Bradley Flood ด้านล่างจากนั้นเรียกใช้คำตอบของ mohit อีกครั้ง
TomEberhard


37

ฉันไม่แน่ใจว่าฉันเข้าใจปัญหาอย่างสมบูรณ์ แต่การดึงสาขาที่มีอยู่นั้นทำเช่นนี้ (อย่างน้อยก็ใช้ได้กับฉัน :)

git pull origin BRANCH

นี่คือการสันนิษฐานว่าสาขาท้องถิ่นของคุณถูกสร้างขึ้นจากต้นกำเนิด / สาขา


15

สิ่งนี้ช่วยให้ฉันได้สาขาระยะไกลก่อนที่จะรวมเข้ากับสาขาอื่น

git fetch repo xyz:xyz
git checkout xyz

8

ใส่เพียงแค่ถ้าคุณต้องการที่จะดึงจาก GitHub สาขาthe_branch_I_want:

git fetch origin
git branch -f the_branch_I_want origin/the_branch_I_want
git checkout the_branch_I_want

3
git pull <gitreponame> <branchname>

โดยปกติถ้าคุณมี repo ที่กำหนดให้กับรหัสของคุณเท่านั้น gitreponame จะเป็นจุดเริ่มต้น

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

BranchName ควรมีอยู่ใน gitreponame ที่เกี่ยวข้อง

คุณสามารถใช้สองคำสั่งต่อไปนี้เพื่อเพิ่มหรือลบ repo

git remote add <gitreponame> <repourl>
git remote remove <gitreponame>

2

คุณอาจจะทำ

git pull -r origin master

แก้ไขข้อขัดแย้งผสานหากมี

git rebase --continue

-r สำหรับ rebase สิ่งนี้จะทำให้โครงสร้างสาขาของคุณจาก

        v  master       
o-o-o-o-o
     \o-o-o
          ^ other branch

ถึง

        v  master       
o-o-o-o-o-o-o-o
              ^ other branch

สิ่งนี้จะนำไปสู่ประวัติศาสตร์ที่สะอาดกว่า หมายเหตุ: ในกรณีที่คุณผลักสาขาอื่นของคุณให้กำเนิด (หรือรีโมทอื่น ๆ ) คุณอาจต้องกดสาขาของคุณหลังจากรีบูต

git push -f origin other-branch

1

ฉันทำ

git branch -f new_local_branch_name origin/remote_branch_name

แทน

git branch -f new_local_branch_name upstream/remote_branch_name

ตามที่แนะนำโดย @innaM เมื่อฉันใช้เวอร์ชันอัปสตรีมมันพูดว่า 'ร้ายแรง: ไม่ใช่ชื่อวัตถุที่ถูกต้อง:' upstream / remote_branch_name '' ฉันไม่ได้ทำgit fetch originเป็นความคิดเห็นข้อเสนอแนะ แต่ก็ถูกแทนที่ด้วยupstream originฉันคิดว่าพวกเขาเทียบเท่า


0

สำหรับดึงสาขาจาก GitHub คุณสามารถใช้

git checkout --track origin/the-branch-name

ตรวจสอบให้แน่ใจว่าชื่อสาขาเหมือนกันทุกประการ

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