ฉันจะผลักดันสาขา Git ท้องถิ่นไปยังรีโมทด้วยชื่ออื่นได้อย่างง่ายดายได้อย่างไร?


175

ฉันสงสัยว่ามีวิธีที่ง่ายในการผลักดันและดึงสาขาท้องถิ่นด้วยสาขาระยะไกลที่มีชื่อแตกต่างกันโดยไม่ต้องระบุชื่อทั้งสอง

ตัวอย่างเช่น:

$ git clone myrepo.git
$ git checkout -b newb
$ ...
$ git commit -m "Some change"
$ git push origin newb:remote_branch_name

ตอนนี้ถ้ามีคนอัปเดต remote_branch_name ฉันสามารถ:

$ git pull

และทุกอย่างถูกผสาน / ส่งต่ออย่างรวดเร็ว อย่างไรก็ตามหากฉันทำการเปลี่ยนแปลงใน "newb" ในพื้นที่ของฉันฉันไม่สามารถ:

$ git push

แต่ฉันต้อง:

% git push origin newb:remote_branch_name

ดูเหมือนโง่เล็กน้อย หากgit-pullใช้git-config branch.newb.mergeเพื่อกำหนดตำแหน่งที่จะดึงออกมาทำไมจึงไม่มีgit-pushตัวเลือกการกำหนดค่าที่คล้ายกัน มีทางลัดที่ดีสำหรับเรื่องนี้หรือฉันควรทำต่อไปอีกนานไหม?

คำตอบ:


93

แน่ใจ เพียงแค่ตั้งค่าของคุณpush.defaultเพื่อupstreamที่จะผลักดันสาขา upstreams ของพวกเขา (ซึ่งเป็นเดียวกันกับที่pullจะดึงจากที่กำหนดโดยbranch.newb.merge) มากกว่าการผลักดันให้คนสาขาที่ตรงกับชื่อ (ซึ่งเป็นค่าเริ่มต้นสำหรับpush.default, matching)

git config push.default upstream

โปรดทราบว่าสิ่งนี้เคยถูกเรียกว่าtrackingไม่ใช่upstreamก่อนที่ Git 1.7.4.2 ดังนั้นหากคุณกำลังใช้ Git เวอร์ชันเก่าให้ใช้trackingแทน มีการpush.defaultเพิ่มตัวเลือกใน Git 1.6.4 ดังนั้นหากคุณอยู่ในรุ่นที่เก่ากว่านั้นคุณจะไม่มีตัวเลือกนี้เลยและจะต้องระบุสาขาที่จะส่งไป


นั่นมัน! สิ่งนี้ใช้ได้กับทุกสาขาที่ติดตามอยู่ แต่ก็ใช้ได้ ขอบคุณ!
jmacdonagh

ฉันสนใจที่จะรู้ว่ามีชวเลขสำหรับชื่อสาขาที่ฉันเช็คเอาท์หรือไม่ ฉันอาจต้องการgit push buildserver .:test_thisที่.จะเป็นชื่อสาขาท้องถิ่นซึ่งฉันไม่จำเป็นต้องรู้ ฉันสามารถค้นหามันได้ แต่ถ้ามีมือสั้น ๆ เช่นจุดนั้นมันจะเจ๋ง
Frederick Nord

2
@ FrerickNord HEADเป็นชวเลขที่คุณกำลังมองหา HEADคือสิ่งที่ชี้ไปยังสาขาที่เช็คเอาท์ในปัจจุบันหรือโดยตรงไปยังการกระทำที่เฉพาะเจาะจงหากคุณมีหัวหน้าแยก
Brian Campbell

ขอบคุณ! นี่เป็นการแก้ไขUpdates were rejected because a pushed branch tip is behind its remoteข้อผิดพลาดสำหรับฉัน Repo ในพื้นที่ของฉันเป็นรุ่นล่าสุด แต่ชื่อก็ต่างออกไป
canhazbits

171

เมื่อคุณกดเริ่มต้นให้เพิ่มพารามิเตอร์ -u :

git push -u origin my_branch:remote_branch

การผลักดันครั้งต่อไปจะไปในที่ที่คุณต้องการ

แก้ไข:

ตามความคิดเห็นที่ตั้งค่าการดึงเท่านั้น

git branch --set-upstream

ควรทำมัน


7
-uเพียงแค่ตั้งค่าอัปสตรีมซึ่งตามคำถามมีการตั้งค่าไว้แล้ว เขาต้องการที่จะตั้งค่าpush.defaultการupstremเพื่อให้ได้รับpushการเคารพการตั้งค่าต้นน้ำเนื่องจากโดยเริ่มต้นเท่านั้นpullไม่
Brian Campbell

2
ดูเหมือนว่าจะใช้งานไม่ได้ - อย่างน้อยก็ไม่เคยมีรุ่นคอมไพล์เลย
Thomas Watson

git branch --set-upstream จะทำการเซ็ตอัพ pull "pushRemote" เท่านั้น
wheredidthatnamecome จาก

ฉันไม่คิดว่าgit branch --set-upstreamจำเป็น หมายเหตุ: ฉันgit --versionคือ 2.17.1
Gabriel Staples

15

คำสั่งโดยAdamเลิกใช้แล้ว คุณสามารถใช้ได้:

git branch --set-upstream-to origin/my_remote_branch my_local_branch

การตั้งสาขาต้นน้ำของการmy_local_branchorigin/my_remote_branch


6
คุณสามารถให้ลิงค์ที่สนับสนุนข้อมูลที่คุณแบ่งปันเกี่ยวกับ -u ที่ถูกปฏิเสธได้หรือไม่? เอกสารสำหรับรุ่นล่าสุดเกี่ยวกับการกดที่git-scm.comดูเหมือนจะแนะนำว่าเป็นปัจจุบัน ขอบคุณล่วงหน้า - มันจะมีประโยชน์มากกับผู้อ่านที่จะติดตามข้อมูลเพิ่มเติม
Kay V

เห็นด้วยกับ @KayV โดยเฉพาะอย่างยิ่งที่ฉันได้รับข้อความนี้เมื่อพยายามสร้างสาขาระยะไกลใหม่ที่มีชื่อแตกต่างจากสาขาในพื้นที่ของฉัน: 'หากคุณวางแผนที่จะผลักดันสาขาในพื้นที่ใหม่ที่จะติดตามคู่ระยะไกลคุณอาจต้องการ เพื่อใช้ "git push -u" เพื่อตั้งค่าการอัปสตรีมขณะที่คุณกด '
FBB

0

นี่คือกระบวนการที่ได้ผลสำหรับฉัน

git clone original-repo-url
git remote rename origin upstream
git remote add origin new-repo-url

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

git push origin master

ตอนนี้ต้นแบบของ repo ระยะไกลใหม่ของคุณ (บน Github) จะซิงค์กับต้นแบบดั้งเดิม แต่จะไม่มีสาขาใด ๆ ของฟีเจอร์

git rebase upstream/branch-name
git push origin master

Rebase เป็นสมาร์ทผสาน จากนั้นกดไปที่ต้นแบบอีกครั้งและคุณจะเห็นสาขาคุณลักษณะที่เลือกเป็นหลักใน repo ใหม่

ไม่จำเป็น:

git remote rm upstream
git remote add upstream new-repo-url

0

ฉันพบปัญหาเดียวกันมาระยะหนึ่งแล้ว ในที่สุดฉันก็มีชุดงบดังนั้นฉันไม่ต้องทำgit push origin local:remoteทุกครั้ง ฉันติดตามสิ่งเหล่านี้:

git branch --set-upstream-to origin/remote_branch_name
git config push.default upstream
git push

หลังจากตั้งค่าอัปสตรีมเป็นสาขารีโมตที่มีชื่อแตกต่างกัน (บรรทัดที่ 1) จากนั้นทำให้อัพสตรีมเป็นค่าเริ่มต้น (บรรทัดที่ 2) บรรทัดที่ 3 จะปฏิบัติตามกฎเหล่านี้และผลักดันไปที่เซ็ตอัปสตรีม

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