วิธีคัดลอกสาขา Git ในเครื่องไปยัง repo ระยะไกล


127

ฉันได้ทำตามขั้นตอนต่อไปนี้แล้ว:

  1. โคลน repo Git ระยะไกล
  2. แยกสาขาหลักเป็นการทดลอง
  3. แก้ไข / ทดสอบ / แก้ไขโค้ดในสาขาทดลอง

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

ฉันจะแบ่งปันสาขาในพื้นที่ของฉันบน repo ระยะไกลโดยไม่กระทบกับสาขาหลักของ repo ระยะไกลได้อย่างไร


ลิงค์นี้มีประโยชน์มากในด้านนี้ Sharing git branch
Vishnu Kumar

คำตอบ:


157

ตามหน้าคู่มือ git push :

 git push origin experimental

ค้นหาการอ้างอิงที่ตรงกับexperimentalที่เก็บซอร์ส (เป็นไปได้มากว่ามันจะพบrefs/heads/experimental) และอัปเดตการอ้างอิงเดียวกัน (เช่นrefs/heads/experimental) ในที่เก็บต้นทางด้วย
หากexperimentalไม่มีอยู่ในระยะไกลระบบจะสร้างขึ้นไม่ได้อยู่ในระยะไกลก็จะถูกสร้างขึ้น

สิ่งนี้เหมือนกับ:

git push origin experimental:refs/heads/experimental

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

หรือเช่นเดียวกับที่กล่าวไว้ในgit tipคุณสามารถตั้งค่า "Branch's Default Remote":

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

สิ่งนี้ทำสำเร็จแล้วสำหรับคุณเมื่อคุณใช้ git clone ทำให้คุณสามารถใช้ git push โดยไม่มีข้อโต้แย้งใด ๆ เพื่อพุชสาขาหลักในเครื่องเพื่ออัพเดตสาขาหลักของที่เก็บต้นทาง

git config branch.<name>.remote <remote> 

สามารถใช้เพื่อระบุสิ่งนี้ด้วยตนเอง


ม.ค.แสดงให้เห็น (สำหรับคอมไพล์> = 1.7.0 ) push -u(หรือpush --set-upstream) ตัวเลือก:

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

ด้วยวิธีนี้คุณไม่ต้องทำการกำหนดค่าคอมไพล์ใด ๆ

git push -u origin experimental

12
คุณควรใช้-uตัวเลือกpushเพื่อให้แน่ใจว่าสาขาในพื้นที่ของคุณติดตามรีโมตหลังจากที่เผยแพร่สู่สาธารณะ หากคุณลืมใช้-uตัวเลือกนี้คุณสามารถพิมพ์git push -uหลังจากนั้นในสาขาจากนั้นgit pullจะทำงาน
ม.ค.

ฉันไม่ทราบว่าเมื่อคุณทำสิ่งนี้git push origin experimentalไม่มีหลักฐานว่ามีการอัปโหลดชุดใด ๆ ดูเหมือนว่ารีโมทจะมีเนื้อหาทั้งหมดจากการกดครั้งก่อนของคุณอยู่แล้ว มันก็จะต้องมีการติดยาเสพติดใน refs
Kaz

@Kaz: มันจะมีเนื้อหาทั้งหมดหากการกระทำใหม่เหล่านั้นถูกผลักดันในสาขาอื่นบนรีโมต ในกรณีนั้นgit push origin experimentalจะสร้างสาขาexperimentalบนรีโมท
VonC

ขอบคุณ! คำตอบของคุณมีประโยชน์มาก
hakre

15

หากชื่อสาขาของคุณเป็นexperimentalและชื่อของระยะไกลเป็นoriginแล้วก็

git push origin experimental

ความคิดเห็นเดียวกันกับด้านบน แต่จะสร้างสาขาทดลองโดยปริยายบน repo ระยะไกลหรือจะส่งไปยังต้นแบบของรีโมต?
Coocoo4Cocoa

1
มันผลักดันสาขาการทดลองและไม่ได้สัมผัสกับผู้เชี่ยวชาญทั้งในด้านท้องถิ่นหรือจากระยะไกล
John Douthat

1

git push -u <remote-name> <branch-name>จะไม่ทำงานหากสาขาที่สร้างขึ้นใหม่ไม่ได้เกิดจาก repo เดียวกันกล่าวคือหากคุณยังไม่ได้สร้างสาขาใหม่โดยใช้git checkout -b new_branchสิ่งนี้จะไม่ทำงาน

ตัวอย่างเช่นฉันได้โคลนสองที่เก็บที่แตกต่างกันในเครื่องและฉันต้องคัดลอก repo2 / branch1 ไปยัง repo1 / จากนั้นก็ดันไปด้วย

ลิงก์นี้ช่วยฉันผลักดันสาขาในพื้นที่ของฉัน (โคลนจาก repo อื่น) ไปยัง repo ระยะไกลของฉัน:


0

นี่คือหน้า GitHub สิทธิ์สำหรับการจัดการระยะไกล GitHub http://github.com/guides/push-a-branch-to-github มันจะช่วยคุณตอบทุกคำถามของคุณ


มันไม่ได้ย้ายไปที่สาขาหลักหรือจะสร้างจุดเริ่มต้นโดยปริยาย / same_branch_name_as_local?
Coocoo4Cocoa

0

TL; DR

$ git push --set-upstream origin your_new_branch

ข้อมูลเพิ่มเติม

หลังจากที่คุณได้ทำอะไรบางอย่างใน:

$ git checkout -b your_new_branch
$ git add file
$ git commit -m "changed file"

คุณดันสาขาของคุณที่ระบุอัพสตรีมลงในที่เก็บรีโมตอย่างใดอย่างหนึ่งดังต่อไปนี้:

$ git push --set-upstream REMOTE YOUR_BRANCH

รีโมทสามารถมองเห็นได้โดย

$ git remote -v

originปกติคุณจะต้องเริ่มต้นเดียวจากระยะไกล ดังนั้นคำสั่งของคุณจะมีลักษณะดังนี้:

$ git push --set-upstream origin your_new_branch

git pushและทุกดันที่เกิดขึ้นสามารถทำเพียงกับ

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