สร้างสาขาใน Git จากสาขาอื่น


989

ฉันมีสองสาขา: masterและdev

ฉันต้องการที่จะสร้าง "สาขาคุณลักษณะ" จากdevสาขา

ขณะนี้อยู่ที่การพัฒนาสาขาฉันทำ:

$ git checkout -b myfeature dev

... (ทำงานบางส่วน)

$ git commit -am "blablabla"
$ git push origin myfeature

แต่หลังจากเห็นภาพกิ่งไม้ของฉันฉันได้รับ:

--**master**
------0-----0-----0-----0-----0
------------------------**dev**----**myfeature**

ฉันหมายความว่าสาขาดูเหมือน ff ที่รวมเข้าด้วยกันและฉันไม่เข้าใจว่าทำไม ...

ฉันทำอะไรผิด

คุณช่วยอธิบายฉันทีว่าคุณแยกสาขาจากสาขาอื่นและผลักดันกลับไปยังที่เก็บระยะไกลสำหรับสาขาฟีเจอร์ได้อย่างไร?

ทุกสิ่งที่อยู่ในรูปแบบที่แตกแขนงเช่นเดียวที่อธิบายที่นี่

คำตอบ:


1431

ถ้าคุณชอบวิธีการในการเชื่อมโยงที่คุณได้โพสต์ที่มีลักษณะที่Git ไหล

เป็นชุดของสคริปต์ที่เขาสร้างขึ้นสำหรับเวิร์กโฟลว์นั้น

แต่เพื่อตอบคำถามของคุณ:

$ git checkout -b myFeature dev

สร้าง MyFeature branch ออกจาก dev ทำงานของคุณแล้ว

$ git commit -am "Your message"

ตอนนี้รวมการเปลี่ยนแปลงของคุณเพื่อ dev โดยไม่ต้องส่งต่ออย่างรวดเร็ว

$ git checkout dev
$ git merge --no-ff myFeature

ตอนนี้ดันการเปลี่ยนแปลงไปยังเซิร์ฟเวอร์

$ git push origin dev
$ git push origin myFeature

และคุณจะเห็นว่าคุณต้องการมันอย่างไร


32
ความสำคัญของการผลักดันmyFeatureหลังจากที่ได้รับการผสานกับปัญญาdevคืออะไร?
Alexander Suraphel

3
@spartacus หากmyFeatureสาขาถูกผลักไปยังเซิร์ฟเวอร์ก่อนที่จะรวมแล้วไม่มีอะไร แต่ถ้าmyFeatureยังไม่ได้พุชไปยังเซิร์ฟเวอร์และคุณต้องการให้มันปรากฏในเซิร์ฟเวอร์คุณต้องพุชมัน appart
xOneca

15
เป็นgit checkout -b myFeature devเช่นเดียวกับ 3 คำสั่งนี้git checkout devแล้วgit branch myFeatureแล้วgit checkout myFeature?
เควินเมเรดิ ธ

3
มันเป็นหรือควรจะเป็น คุณเห็นอะไรที่แตกต่างออกไปหรือ
Abizern

33
เพื่อชี้แจงสำหรับมือใหม่คนอื่น ๆนี่คือ--no-ffลักษณะที่ผสานกัน
A__

407

หากคุณต้องการสร้างสาขาใหม่จากสาขาที่มีอยู่ใน Git เพียงทำตามตัวเลือก

ขั้นแรกให้เปลี่ยน / ชำระเงินในสาขาที่คุณต้องการสร้างสาขาใหม่ ตัวอย่างเช่นหากคุณมีสาขาดังต่อไปนี้:

  • เจ้านาย
  • dev
  • branch1

ดังนั้นหากคุณต้องการสร้างสาขาใหม่ที่ชื่อว่า"subbranch_of_b1"ภายใต้สาขาที่ชื่อว่า"branch1" ให้ทำตามขั้นตอน:

  1. ชำระเงินหรือเปลี่ยนเป็น"branch1"

    git checkout branch1
    
  2. ตอนนี้สร้างสาขาใหม่ของคุณชื่อ"subbranch_of_b1"ภายใต้"branch1"โดยใช้คำสั่งต่อไปนี้

    git checkout -b subbranch_of_b1 branch1
    

    ด้านบนจะสร้างสาขาใหม่ที่ชื่อว่าsubbranch_of_b1ภายใต้ branch branch1 (โปรดทราบว่าbranch1ในคำสั่งข้างต้นไม่ได้รับคำสั่งเนื่องจาก HEAD ชี้ไปที่ปัจจุบันคุณสามารถระบุได้อย่างแม่นยำถ้าคุณอยู่ในสาขาอื่น)

  3. ตอนนี้หลังจากทำงานกับsubbranch_of_b1คุณสามารถคอมมิทและส่งหรือรวมมันแบบโลคัลหรือแบบรีโมต

ตัวอย่างภาพกราฟิกของการสร้างสาขาภายใต้สาขาอื่น

ผลักดัน subbranch_of_b1 ไปยังระยะไกล

 git push origin subbranch_of_b1 

7
วิธีการผลักดัน subbranch_of_b1 ไปยังระยะไกล?
user269867

13
@ user269867: "git push origin subbranch_of_b1" จะทำงานให้คุณ
Praveen George

4
ทีนี้ถ้าฉันเปลี่ยนการเปลี่ยนแปลงเป็นหลักมันจะเกิดขึ้นใน branch1 โดยอัตโนมัติหรือไม่
ปรมาจารย์โยดา

2
โปรดทราบว่า branch1 ในคำสั่งด้านบนไม่ได้รับคำสั่งเนื่องจาก HEAD กำลังชี้ไปที่มันคุณสามารถแม่นยำได้ถ้าคุณอยู่ในสาขาอื่นแม้ว่านั่นคือสิ่งที่ฉันกำลังมองหา
felipsmartins

10
ผมมาที่นี่สงสัยว่าถ้าเป็นชวเลขgit checkout -b some-branch git checkout -b some-branch masterปรากฎว่าgit checkout -b some-branchมีการจดชวเลขgit checkout -b some-branch <current_active_branch>
Frank Henard

45

สร้างสาขา

  • สร้างสาขาเมื่อสาขาหลักถูกเช็คเอาท์ ที่นี่ความมุ่งมั่นในปริญญาโทจะถูกซิงค์กับสาขาที่คุณสร้างขึ้น

    $ git branch branch1

  • สร้างสาขาเมื่อมีการเช็กเอาต์ branch1 การคอมมิทที่นี่ใน branch1 จะถูกซิงค์กับ branch2

    $ git branch branch2


ชำระเงินที่สาขา

คำสั่ง git checkout สลับสาขาหรือเรียกคืนไฟล์ต้นไม้ทำงาน

  • $ git checkout branchname

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

  • $ git branch -m branch1 newbranchname

ลบสาขา

  • $ git branch -d branch-to-delete
  • $ git branch -D branch-to-delete ( บังคับให้ลบโดยไม่ตรวจสอบสถานะที่ผสาน )

สร้างและสลับสาขา

  • $ git checkout -b branchname

สาขาที่รวมอยู่อย่างสมบูรณ์

  • $ git branch --merged


************************** ความแตกต่างของสาขา [git diff branch1..branch2] ************** **********

ความแตกต่างหลายบรรทัด
  • $ git diff master..branch1
ความแตกต่างของ Singleline
  • $ git diff --color-words branch1..branch2

1
นอกจากนี้หลังจากเปลี่ยนชื่อสาขาใช้git push origin :old-name new-nameเพื่อลบสาขาระยะไกลเก่าและผลักดันชื่อสาขาท้องถิ่นใหม่
95faf8e76605e973

13

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

ทีนี้ถ้าคุณทำคอมมิชชันบน dev ก่อนที่จะรวมคุณจะเริ่มต้นที่คอมมิชชันเดิมอีกครั้ง A แต่ตอนนี้ฟีเจอร์จะไปที่ C และ dev ไปที่ B สิ่งนี้จะแสดงการแยกที่คุณพยายามจะมองเห็น ได้แยกออกแล้ว

*-----*Dev-------*Feature

กับ

       /----*DevB
*-----*DevA
       \----*FeatureC

9

Git 2.23 แนะนำgit switchและgit restoreแบ่งความรับผิดชอบของgit checkout

การสร้างสาขาใหม่จากสาขาที่มีอยู่ ณ git 2.23:

git switch -c my-new-branch

เปลี่ยนเป็นสาขาใหม่ 'my-new-branch'

  • -cสั้นสำหรับ--createและแทนที่ที่รู้จักกันดีคอมไพล์เช็คเอาท์ -b

ดูที่โพสต์บล็อก Github นี้เพื่ออธิบายการเปลี่ยนแปลงในรายละเอียดที่มากขึ้น:

Git 2.23 นำคู่ใหม่ของคำสั่งการทดลองชุดที่มีอยู่: สวิทช์คอมไพล์และGIT เรียกคืน ทั้งสองมีจุดมุ่งหมายเพื่อให้เป็นอินเทอร์เฟซที่ดีกว่าสำหรับการชำระเงิน git ที่รู้จักกันดี คำสั่งใหม่ตั้งใจให้แต่ละคนมีการแยกที่ชัดเจนแบ่งอย่างเป็นระเบียบในสิ่งที่มีความรับผิดชอบมากมายของการชำระเงินคอมไพล์


9

เพื่อสร้างสาขาจากสาขาอื่นในไดเรกทอรีท้องถิ่นของคุณคุณสามารถใช้คำสั่งดังต่อไปนี้

git checkout -b <sub-branch> branch

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

  • ชื่อของสาขาใหม่ที่จะสร้าง 'XYZ'
  • ชื่อของสาขา ABC ที่ต้องสร้าง XYZ
git checkout -b XYZ ABC

3

หากคุณต้องการสร้างสาขาจากสาขาอื่นให้ทำตามขั้นตอนต่อไปนี้:

ข้อสมมติฐาน :

  1. ขณะนี้คุณอยู่ในสาขาหลัก
  2. คุณไม่มีการเปลี่ยนแปลงที่จะส่งมอบ (หากคุณมีการเปลี่ยนแปลงที่จะส่งมอบให้เก็บไว้!)
  3. BranchExistingBranchMyNewเป็นชื่อของสาขาที่คุณต้องการที่จะทำให้สาขาใหม่ที่มีชื่อ

ขั้นตอน :

  1. ดึงสาขาไปยังเครื่องท้องถิ่นของคุณ

    $ git fetch origin BranchExisting : BranchExisting
    

คำสั่งนี้จะสร้างสาขาใหม่ในท้องถิ่นของคุณด้วยชื่อสาขาเดียวกัน

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

    $ git checkout BranchExisting
    
  2. ขณะนี้คุณอยู่ใน BranchExisting ตอนนี้สร้างสาขาใหม่จากสาขาที่มีอยู่นี้

    $ git checkout -b BranchMyNew
    

ไปเลย!


1

สำหรับการสร้างสาขาจากที่อื่นสามารถใช้ไวยากรณ์นี้เช่นกัน:

git push origin refs/heads/<sourceBranch>:refs/heads/<targetBranch>

มันสั้นกว่า "git checkout -b" + "git push origin เล็กน้อย"

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