เปลี่ยนชื่อสาขาหลักสำหรับที่เก็บ Git ทั้งในพื้นที่และระยะไกล


820

ฉันมีสาขาที่ติดตามสาขาที่ห่างไกลmasterorigin/master

ฉันต้องการเปลี่ยนชื่อพวกเขาเป็นmaster-oldทั้งในเครื่องและบนรีโมท เป็นไปได้ไหม

สำหรับผู้ใช้รายอื่นที่ติดตามorigin/master(และผู้ที่อัปเดตmasterสาขาในท้องถิ่นของตนตลอดเวลาgit pull) จะเกิดอะไรขึ้นหลังจากฉันเปลี่ยนชื่อสาขาระยะไกล
พวกเขาจะgit pullยังใช้งานได้หรือไม่หรือเกิดข้อผิดพลาดที่ไม่สามารถหาได้origin/masterอีกต่อไป

จากนั้นต่อไปฉันต้องการสร้างmasterสาขาใหม่(ทั้งภายในและระยะไกล) อีกครั้งหลังจากที่ผมทำอย่างนี้อะไรจะเกิดขึ้นในขณะนี้ถ้าผู้ใช้งานอื่นทำgit pull?

ฉันเดาว่าทั้งหมดนี้จะส่งผลให้เกิดปัญหามากมาย มีวิธีที่สะอาดเพื่อให้ได้สิ่งที่ฉันต้องการหรือไม่? หรือฉันควรปล่อยให้masterมันเป็นและสร้างสาขาใหม่master-newและทำงานที่นั่นต่อไปหรือไม่


2
สูตรที่ให้ไว้ในคำตอบที่ยอมรับนั้นจะใช้กับสาขาที่มีชื่อใด ๆ แต่คำเตือน (ตามที่ระบุไว้) ไม่ทำเนื่องจากบทบาทพิเศษ (โดยค่าเริ่มต้น) ของสาขาหลักใน Git
kynan

3
@ kynan: ฉันคิดว่าฉันไม่เข้าใจ คำเตือนใดที่นำไปใช้กับต้นแบบและไม่นำไปใช้กับสาขาอื่น ถ้ามันจะเป็นสาขาที่ชื่อว่า xy และคนอื่น ๆ ได้ติดตามสาขานั้นมันจะแตกต่างกันอย่างไร?
อัลเบิร์ต

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

คุณสามารถสร้างสาขาใหม่master-oldที่ชี้ไปที่กระทำเช่นเดียวกับmasterสาขาก่อนหน้า จากนั้นคุณสามารถเขียนทับmasterสาขาที่มีการเปลี่ยนแปลงใหม่ของคุณด้วยการทำmergeกับoursกลยุทธ์ การผสานจะทำงานเมื่อรีโมตไม่อนุญาตการเปลี่ยนแปลงที่รวดเร็ว นั่นหมายความว่าผู้ใช้รายอื่นจะไม่มีการบังคับให้อัพเดท
dnozay

1
@ kynan masterพิเศษเฉพาะตราบใดที่ยังเป็นสาขาเดียวที่มีอยู่ ทันทีที่คุณมีมากกว่าหนึ่งสาขาทุกสาขาจะอยู่บนฐานที่เท่าเทียมกัน
jub0bs

คำตอบ:


614

สิ่งที่ใกล้เคียงที่สุดในการเปลี่ยนชื่อคือการลบแล้วสร้างขึ้นใหม่บนรีโมท ตัวอย่างเช่น:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

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

หมายเหตุ: รุ่นที่ใหม่กว่าของ git จะไม่อนุญาตให้คุณลบสาขาหลักจากระยะไกลโดยค่าเริ่มต้น คุณสามารถลบล้างสิ่งนี้ได้โดยตั้งค่าการreceive.denyDeleteCurrentกำหนดค่าเป็นwarnหรือignoreบนที่เก็บระยะไกล มิฉะนั้นหากคุณพร้อมที่จะสร้างต้นแบบใหม่ทันทีข้ามgit push remote :masterขั้นตอนและส่ง--forceต่อไปยังgit push remote masterขั้นตอน โปรดทราบว่าหากคุณไม่สามารถเปลี่ยนการกำหนดค่าของรีโมทคุณจะไม่สามารถลบสาขาหลักได้อย่างสมบูรณ์!

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


2
สาขาเป็นเพียงคู่ (ชื่อ, แฮช) - ไม่มีอะไรมากไม่มีอะไรน้อย มีการอ้างอิงในสาขา แต่สิ่งนี้ไม่เคยสัมผัสกับไคลเอนต์ระยะไกล
bdonlan

122
ฉันจะสร้างต้นแบบเก่าบนรีโมตก่อนที่จะลบต้นแบบบนรีโมต ฉันแค่หวาดระแวง
Adam Dymitruk

6
คำตอบของอริสโตเติลด้านล่างช่วยให้คุณทำสิ่งนี้ได้โดยไม่ต้องลบอาจารย์
สะพานดินเหนียว

13
มันจะชัดเจนและปลอดภัยหากคุณสามารถใช้new-branch-nameและold-branch-nameแทนที่จะเป็นmaster/ master-oldดังนั้นนี่เป็นปัญหาทั่วไป
Jaider

2
หากสาขาที่ถูกลบ (ที่นี่: หลัก) ไม่ได้ถูกอ้างอิงโดยสาขาอื่น ๆ คอมไพล์อาจเก็บรวบรวมการกระทำทั้งหมดใน ... ดี ... "สาขา" - คำสั่ง git บางคำสั่งเรียกชุดเก็บรวบรวมขยะ - ดังนั้น: สร้างชื่อใหม่ก่อน (ชี้ไปที่การคอมมิชชันเดียวกัน) จากนั้นลบชื่อเก่า
Robert Siemer

257

สมมติว่าคุณอยู่ในmaster:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. ก่อนอื่นให้สร้างmaster-oldสาขาในที่originเก็บโดยอ้างอิงจากการคอมมิทmasterในที่เก็บโลคัล
  2. สร้างสาขาท้องถิ่นใหม่สำหรับสาขาใหม่นี้origin/master-old(ซึ่งจะตั้งค่าอย่างถูกต้องโดยอัตโนมัติเป็นสาขาการติดตาม)
  3. ตอนนี้ให้ชี้masterไปที่ท้องถิ่นของคุณไม่ว่าคุณจะต้องการชี้ไปที่ใด
  4. ท้ายที่สุดเปลี่ยนแรงmasterในoriginพื้นที่เก็บข้อมูลเพื่อสะท้อนให้เห็นถึงท้องถิ่นของmasterคุณ

(หากคุณทำในลักษณะอื่นคุณต้องมีอย่างน้อยหนึ่งขั้นตอนเพื่อให้แน่ใจว่าmaster-oldมีการตั้งค่าให้ติดตามอย่างถูกต้องorigin/master-oldไม่มีโซลูชันอื่นใดที่โพสต์ในขณะที่เขียนนี้รวมอยู่ด้วย)


11
นี่เป็นคำตอบที่ดีกว่า "คำตอบ" ฉันเห็นด้วย แต่สำหรับคนที่มาที่นี่เพื่อเปลี่ยนชื่อสาขา (ไม่ใช่เจ้านายอย่างชัดเจน) ขั้นตอนที่ 3 ไม่สมเหตุสมผลนัก
Knocte

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

3
นี่กลายเป็นวิธีแก้ปัญหาที่เหมาะกับฉัน ฉันพยายามเปลี่ยนอาจารย์เป็นสาขาอื่น ฉันทำบันทึกคอมไพล์ -1 แหล่งกำเนิด / what_i_want_as_new_master เพื่อรับ $ new_master_commit สำหรับขั้นตอนที่ 3 หลังจากกด (ขั้นตอนที่ 4) devs อื่นจะดึงและรับข้อความ "สาขาของคุณอยู่ข้างหน้าหลักโดย 295 คอมมิชชัน" ในการแก้ไขปัญหานี้ฉันได้ส่งอีเมลแจ้งให้พวกเขาทราบถึงการทำงานแต่ละครั้ง: git pull; git checkout some_random_branch; สาขา git -D master; git pull; ต้นแบบการชำระเงินคอมไพล์; โดยพื้นฐานแล้วพวกเขาจำเป็นต้องลบเจ้านายในท้องถิ่นของพวกเขาและดึงเวอร์ชันใหม่มิฉะนั้นพวกเขาจะอยู่ผิดที่ในพื้นที่
nairbv

คุณจะได้ทำที่ไกลได้ง่ายขึ้น: สมมติว่าพวกเขาอยู่แล้วmasterจากนั้นพวกเขาก็จะทำgit fetch && git reset --hard origin/masterเพื่อบังคับให้ท้องถิ่นของพวกเขาจะเป็นเช่นเดียวกับหนึ่งในmaster originฉันได้ทำเอกสารนี้รวมถึงกรณีที่ซับซ้อนมากขึ้นซึ่งคุณมีข้อผูกพันในท้องถิ่นอยู่ด้านบนของmasterสิ่งที่คุณต้องการเก็บไว้ในstackoverflow.com/q/4084868
Aristotle Pagaltzis

ตรวจสอบให้แน่ใจว่าไฟล์การกำหนดค่ารีโมตมี "denyNonFastforwards = false" หรือคุณจะได้รับ "รีโมต: ข้อผิดพลาด: การปฏิเสธ refs / heads / master ที่ไม่ได้ส่งต่ออย่างรวดเร็ว (คุณควรดึงก่อน)"
gjcamann

159

ด้วย Git v1.7 ฉันคิดว่าสิ่งนี้เปลี่ยนไปเล็กน้อย การอัปเดตการอ้างอิงการติดตามสาขาของท้องถิ่นเป็นรีโมตใหม่นั้นง่ายมาก

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

10
ทางเลือกอื่น--set-upstreamมีดังนี้: เมื่อคุณเปลี่ยนสาขาของคุณในพื้นที่และลบที่จุดเริ่มต้นให้ทำ: git push -u --all
lucifurious

4
สิ่งนี้จะไม่ทำงานกับสาขาหลักเนื่องจาก git จะไม่อนุญาตให้คุณลบข้อมูลต้นแบบระยะไกล
Alexandre Neto

4
@AlexandreNeto ในกรณีนี้คุณสามารถดำเนินการบรรทัดที่ 3 ก่อนที่ 2 ให้ตั้งค่าสาขาเริ่มต้นเป็นnew_branchและในที่สุดก็ลบรีโมตmasterด้วยบรรทัดที่ 2
Tristan Jahier

3
ขั้นตอนง่าย ๆ น่าอัศจรรย์ นี่คือคำตอบที่ดีที่สุดของคำถาม
siddhusingh

13
ในการลบสาขาระยะไกลgit push origin --delete old_branchสามารถอ่านได้มากขึ้นเล็กน้อย
ThomasW

35
git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

คุณอาจต้องเปลี่ยนเป็นด้วยตนเองnew-branch-nameก่อนที่จะลบold-branch-name


ส่วนใดของโซลูชันนี้ลบชื่อสาขาท้องถิ่นหรือว่าเป็นการฝึกแบบ Serparate
GreenAsJade

4
ฉันคิดว่าในตอนท้ายจะต้องเรียกใช้git branch -d old-branch-nameเพื่อลบสาขาเก่าท้องถิ่น
Nabi KAZ

คุณสามารถผลักดันการเปลี่ยนแปลงด้วยคำสั่งเดียวเท่านั้น: git push remote-name new-branch-name :old-branch-name.
sigod

วิธีนี้จะไม่มีความซับซ้อนในประวัติศาสตร์ของคอมไพล์หรือไม่? เนื่องจากคุณกำลังเปิดสาขาใหม่แทนเพียงเปลี่ยนชื่อสาขาปัจจุบัน
androidevil

1
@androider เลขที่สาขาในคอมไพล์เป็นอ้างอิงง่าย
sigod

29

มีหลายวิธีที่จะเปลี่ยนชื่อสาขามี แต่ฉันจะมุ่งเน้นไปที่ปัญหาใหญ่"วิธีการที่จะช่วยให้ลูกค้าไปข้างหน้าอย่างรวดเร็วและไม่ต้องไปยุ่งกับสาขาของพวกเขาในประเทศ"

ภาพแรกอย่างรวดเร็ว: เปลี่ยนชื่อสาขาหลักและช่วยให้ลูกค้าสามารถกรอไปข้างหน้า

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

เปลี่ยนชื่อสาขา:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

สร้างสาขา "ต้นแบบ" ใหม่:

# create master from new starting point
git branch master <new-master-start-point>

การสร้างการคอมมิทการคอมมิทเพื่อให้มีประวัติพ่อแม่ลูก:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

และ voila

git push origin master

วิธีนี้ใช้งานได้เนื่องจากการสร้างการคอมมิชชันmergeอนุญาตการส่งต่ออย่างรวดเร็วสาขาไปยังการแก้ไขใหม่ได้อย่างรวดเร็ว

ใช้ข้อความยืนยันการรวมที่สมเหตุสมผล:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

3
ขอบคุณ! git merge -s ours master-oldเป็นส่วนสำคัญที่คำตอบอื่น ๆ คิดถึง นอกจากนี้ "ง่ายต่อการทำ" ไม่ได้หมายความว่า "ง่ายต่อการเข้าใจหรือค้นหา" ซึ่งดูเหมือนจะเป็นกรณีที่มีคอมไพล์มาก แต่ฉันเชือนแช
Martin Vidner

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

12

ฉันสมมติว่าคุณยังคงถามเกี่ยวกับสถานการณ์เช่นเดียวกับในของคุณคำถามก่อนหน้านี้ นั่นคือต้นแบบใหม่จะไม่ประกอบด้วยต้นแบบเก่าในประวัติของมัน * ถ้าคุณเรียกว่า "ต้นแบบ" หลักใหม่คุณจะมีประวัติที่เขียนใหม่ได้อย่างมีประสิทธิภาพ มันไม่สำคัญว่าคุณจะเข้าสู่สภาวะที่อาจารย์ไม่ใช่ทายาทของตำแหน่งอาจารย์คนก่อน ๆ เพียงแค่ว่าอยู่ในสถานะนั้น

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

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

* ถ้าเป็นเช่นนั้นสิ่งนี้จะเทียบเท่ากับการผลักดันการเปลี่ยนแปลงบางอย่างไปยังต้นแบบแล้วสร้างสาขาใหม่ที่เคยเป็น ไม่มีปัญหา.


ใช่มันเป็นปัญหาเดียวกันเป็นเพียงหนึ่งความคิดวิธีการแก้ปัญหา แต่แม้ว่าฉันจะไม่เปลี่ยนชื่อสาขานี้ฉันก็น่าสนใจถ้ามันจะเป็นไปได้ ฉันคิดว่าการอ้างอิงในฐานะ "ผู้ชำนาญ" เป็นเพียงการอ้างอิงถึงข้อผูกพันเฉพาะ ฉันไม่ต้องการเปลี่ยนประวัติใด ๆ ฉันคิดว่าฉันจะชี้การอ้างอิงหลักไปยังหัวอื่น นี่ก็หมายความว่าฉันจะไม่สามารถใช้ชื่อสาขาได้อีกถ้าเคยใช้มาก่อนหรือไม่?
อัลเบิร์

อันที่จริงสาขาเป็นผู้อ้างอิง - พอยน์เตอร์เพื่อมุ่งมั่น สิ่งนี้คือเราคาดว่าหัวหน้าสาขาจะมีวิวัฒนาการในลักษณะเฉพาะ (กล่าวคือการส่งต่ออย่างรวดเร็ว) จากมุมมองของคนอื่นการย้ายสาขาใน repo สาธารณะของคุณเหมือนกับการเขียนประวัติของสาขา มันไม่ได้ชี้ไปที่การคอมมิทที่มีทุกสิ่งที่มันเคยทำ
Cascabel

8

คำตอบที่เลือกล้มเหลวเมื่อฉันพยายามมัน refusing to delete the current branch: refs/heads/masterมันจะพ่นข้อผิดพลาด: ฉันเดาว่าฉันจะโพสต์สิ่งที่เหมาะกับฉัน:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

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


มันจะล้มเหลวใน git push remote: master หากมีการตรวจสอบที่ด้านไกล - คุณจะเห็น "remote: error:" เป็นคำนำหน้าในบรรทัดบันทึกข้อผิดพลาด
rafalmag

2

ดี. 2 เซนต์ของฉัน วิธีการเกี่ยวกับการเข้าสู่ระบบที่เซิร์ฟเวอร์ไปที่ไดเรกทอรี git และเปลี่ยนชื่อสาขาในพื้นที่เก็บข้อมูลเปลือย นี่ไม่ใช่ปัญหาทั้งหมดที่เกี่ยวข้องกับการอัปโหลดสาขาเดียวกันซ้ำ ที่จริงแล้ว 'ลูกค้า' จะรู้จักชื่อที่ถูกแก้ไขโดยอัตโนมัติและเปลี่ยนการอ้างอิงระยะไกลของพวกเขา หลังจากนั้น (หรือก่อนหน้า) คุณยังสามารถแก้ไขชื่อท้องถิ่นของสาขา


8
ฉันลืมข้อมูลประจำตัวเพื่อเข้าสู่ระบบเซิร์ฟเวอร์ github ทุกคนที่มีสิทธิออกมี :-P
Daniel Fisher lennybacon

1

เกี่ยวกับ:

git checkout old-branch-name
git push remote-name new-branch-name
git push remote-name :old-branch-name
git branch -m new-branch-name

สับสนกับการติดตามสาขา - ผู้ใช้อาจต้องแก้ไขสาขาในพื้นที่หรือไม่
dnozay

1

นี่เป็นวิธีที่ 'อ่านง่าย' และง่ายที่สุดที่ฉันรู้:

ย้ายสาขาท้องถิ่นโดยใช้ -m

git branch -m my_old_branch_name my_new_branch_name

กดสาขา 'ย้าย' ไปยังรีโมตตั้งค่า 'อัพสตรีม' โดยใช้ -u

git push origin -u my_new_branch_name

(การตั้งค่า 'อัพสตรีม' เป็นหลัก 'เชื่อมต่อ' สาขาในพื้นที่ของคุณกับรีโมตเพื่อให้สิ่งต่างๆเช่นการดึงการดึงและการผลักจะทำงานได้)

ลบกิ่งเก่าออกจากรีโมท

git push origin -D <old_name>

(สาขาในพื้นที่ของคุณหมดไปแล้วเพราะคุณ 'ย้าย' ในขั้นตอนที่ 1)


1

ตกลงเปลี่ยนชื่อสาขาทั้งในเครื่องและบนรีโมทค่อนข้างง่าย! ...

ถ้าคุณอยู่ที่สาขาคุณสามารถทำได้โดยง่าย:

git branch -m <branch>

หรือถ้าไม่คุณต้องทำ:

git branch -m <your_old_branch> <your_new_branch>

จากนั้นกดการลบไปยังรีโมทเช่นนี้:

git push origin <your_old_branch>

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

git push --set-upstream origin <your_new_branch>

ฉันยังสร้างภาพด้านล่างเพื่อแสดงขั้นตอนในบรรทัดคำสั่งจริงเพียงทำตามขั้นตอนและคุณจะดี:

ป้อนคำอธิบายรูปภาพที่นี่


0

คุณสามารถทำสิ่งต่อไปนี้:

git -m master master-old #rename current master
git checkout -b master   #create a new branch master
git push -f origin master #force push to master

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


0

สามารถบันทึกสิ่งต่อไปนี้ลงในเชลล์สคริปต์เพื่อทำงาน:

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

remote="origin"

if [ "$#" -eq 0 ] # if there are no arguments, just quit
then
    echo "Usage: $0 oldName newName or $0 newName" >&2
    exit 1
elif
    [ "$#" -eq 1 ] # if only one argument is given, rename current branch
then 
    oldBranchName="$(git branch | grep \* | cut -d ' ' -f2)" #save current branch name
    newBranchName=$1
else
    oldBranchName=$1
    newBranchName=$2
fi

git branch -m $oldBranchName $newBranchName

git push $remote :$oldBranchName #delete old branch on remote
git push --set-upstream $remote $newBranchName # add new branch name on remote and track it

โปรดทราบว่าที่นี่ชื่อเริ่มต้นระยะไกล "ต้นกำเนิด" เป็นรหัสยากคุณสามารถขยายสคริปต์เพื่อให้ถ้ากำหนด!

จากนั้นสคริปต์นี้สามารถใช้กับนามแฝง bash, นามแฝง git หรือในตัวอย่างเช่นการกระทำที่กำหนดเองของ sourcetree


-1

ผมเชื่อว่าที่สำคัญคือการตระหนักว่าคุณกำลังดำเนินการคู่เปลี่ยนชื่อ: masterไปmaster-oldและนอกจากนี้ยังมีmaster-newการmasterการ

จากคำตอบอื่น ๆ ทั้งหมดฉันได้สังเคราะห์สิ่งนี้:

doublerename master-new master master-old

ที่แรกที่เราต้องกำหนดdoublerenameฟังก์ชั่น Bash:

# doublerename NEW CURRENT OLD
#   - arguments are branch names
#   - see COMMIT_MESSAGE below
#   - the result is pushed to origin, with upstream tracking info updated
doublerename() {
  local NEW=$1
  local CUR=$2
  local OLD=$3
  local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD.

This commit replaces the contents of '$CUR' with the contents of '$NEW'.
The old contents of '$CUR' now lives in '$OLD'.
The name '$NEW' will be deleted.

This way the public history of '$CUR' is not rewritten and clients do not have
to perform a Rebase Recovery.
"

  git branch --move $CUR $OLD
  git branch --move $NEW $CUR

  git checkout $CUR
  git merge -s ours $OLD -m $COMMIT_MESSAGE

  git push --set-upstream --atomic origin $OLD $CUR :$NEW
}

นี้จะคล้ายกับประวัติความเป็นมาที่เปลี่ยนแปลงgit rebaseในเนื้อหาที่สาขาที่แตกต่างกันมาก git pull masterแต่มันแตกต่างในการที่ลูกค้ายังสามารถได้อย่างปลอดภัยอย่างรวดเร็วไปข้างหน้าด้วย


-5
git update-ref newref oldref
git update-ref -d oldref newref

2
ดูเหมือนจะไม่เหมาะกับฉันเลยฉันได้รับ: git update-ref trunk trunk2 ถึงแก่ชีวิต: trunk2: ไม่ใช่ SHA1 ที่ถูกต้อง
Gregg Lind
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.