การสร้างสาขาใหม่ที่ว่างเปล่าสำหรับโครงการใหม่


351

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

เราจะทำสิ่งนั้นได้อย่างไร

ฉันลองบางสิ่ง แต่พวกเขาไม่ได้ทำงาน

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

ดูเหมือนว่าจะผลักสาขาได้ แต่เมื่อฉันดึงหรือดึงมันจะดาวน์โหลดข้อมูลจากสาขาอื่นแล้วฉันก็จะได้รับไฟล์พิเศษจากโครงการอื่น ทางออกที่ดีที่สุดคืออะไร


11
ทำไมคุณต้องเก็บสิ่งนี้ไว้ในสาขา สาขามักจะมีการเบี่ยงเบนจากฐานรหัสเดียวกัน บางทีการเริ่มต้นพื้นที่เก็บข้อมูลใหม่อาจเป็นทางออกที่ดีกว่า
Benjamin Bannier

2
ก่อนหน้านี้เราเคยทำแล้ว IIRC และฉันต้องการจะทำอีกครั้งดังนั้นฉันจึงอยากรู้อยากเห็น;)
fazineroso

3
"สำหรับโครงการใหม่" - ในฐานะ @honk ฉันขอแนะนำให้วางไว้ในที่เก็บใหม่ สองตัวเลือกจากที่นั่นเพื่อรวมเข้าด้วยกัน ทำให้เป็นsubmoduleโครงการต้นฉบับเช่นdocs/ชี้ไปที่ repo อื่น ๆ หรือถ้าคุณต้องการที่จะรวมรหัสในภายหลังเพิ่มเป็นระยะไกล
gertvdijk

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

คำตอบ:


666

คุณสามารถสร้างสาขาเป็นเด็กกำพร้า:

git checkout --orphan <branchname>

สิ่งนี้จะสร้างสาขาใหม่ที่ไม่มีผู้ปกครอง จากนั้นคุณสามารถล้างไดเรกทอรีการทำงานด้วย:

git rm --cached -r .

และเพิ่มไฟล์เอกสารมอบอำนาจและผลักดันพวกเขาขึ้นไปที่ Github

การดึงหรือดึงข้อมูลจะอัปเดตข้อมูลท้องถิ่นเกี่ยวกับสาขาระยะไกลทั้งหมด หากคุณต้องการดึง / ดึงข้อมูลสำหรับสาขาระยะไกลเดียวคุณต้องระบุ


18
คำตอบที่ดี แต่ก็น่ารำคาญที่สาขาใหม่เริ่มต้นด้วยไฟล์ทั้งหมด (จากสาขาก่อนหน้า) ที่จัดฉาก
Matt Fenwick

12
เมื่อออกgit checkout --orphan <branch>; ฉันไม่เห็นใด ๆ ของรายการ <สาขา> git branchใน
Santosh Kumar

51
หลังจากgit checkout --orphanหนึ่งสามารถใช้git reset --hardเพื่อลบที่เหลืออยู่ในไฟล์
Ilya Kozhevnikov

16
เหตุผลที่คุณไม่เห็นสาขาหลังจากนั้นgit checkout --orphan <branch>เป็นเพราะยังไม่มีข้อผูกมัดใด ๆ หลังจากคอมมิชชันแรกgit branchพิมพ์สาขาใหม่
Krøllebølle

13
git clean -fd ลบไฟล์ที่ไม่ได้ติดตาม
stefgosselin

71

คำตอบที่ถูกต้องคือการสร้างสาขาเด็กกำพร้า ฉันอธิบายวิธีการทำอย่างละเอียดในบล็อกของฉัน (ลิงก์ที่เก็บถาวร)

...

ก่อนเริ่มให้อัปเกรดเป็น GIT เวอร์ชันล่าสุด เพื่อให้แน่ใจว่าคุณใช้เวอร์ชันล่าสุดให้เรียกใช้

which git

หากแยกเวอร์ชั่นเก่าออกคุณอาจต้องเพิ่ม PATH ของคุณด้วยโฟลเดอร์ที่บรรจุเวอร์ชั่นที่คุณเพิ่งติดตั้ง

ตกลงเราพร้อมแล้ว หลังจากทำซีดีในโฟลเดอร์ที่มีการชำระเงิน git ของคุณสร้างสาขาเด็กกำพร้า สำหรับตัวอย่างนี้ฉันจะตั้งชื่อสาขา "mybranch"

git checkout --orphan mybranch

ลบทุกอย่างในสาขาเด็กกำพร้า

git rm -rf .

ทำการเปลี่ยนแปลงบางอย่าง

vi README.txt

เพิ่มและยอมรับการเปลี่ยนแปลง

git add README.txt
git commit -m "Adding readme file"

แค่นั้นแหละ. ถ้าคุณวิ่ง

git log

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

git checkout master

คุณสามารถกลับไปที่สาขาเด็กกำพร้าโดยวิ่ง

git checkout mybranch

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

3
ลิงค์ไม่ถูกต้องอีกต่อไปโชคไม่ดี
Alexey

1
จดหมายเหตุเป็นสิ่งมหัศจรรย์
lucid_dreamer

3
DANGEROUS เป็นเพียงการลบทุกสิ่งในไดเรกทอรีทำงานเนื่องจากโครงการที่ไม่สำคัญจะมีไฟล์ที่ไม่ได้ติดตาม (การกำหนดค่าสภาพแวดล้อมแคช ฯลฯ )
Slava Fomin II

12

ทำให้สาขาใหม่ว่างเปล่าเช่นนี้:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

หากไฟล์ proj-doc ของคุณอยู่ภายใต้การคอมมิชชันเดียวคุณสามารถสร้างสาขาใหม่ด้วยวิธีนี้:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

ซึ่งอาจจะสะดวกกว่าgit branch --orphanที่จะทำให้คุณมีจำนวนมากgit rmและgit mvทำ

ลอง

git branch --set-upstream proj-doc origin/proj-doc

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


1
คำตอบนี้น่าสนใจเพราะช่วยให้คุณสามารถเริ่มต้นสาขา / รูทอื่นด้วยการคอมมิทก่อนอื่นทั้งหมด
Stéphane Gourichon

อีกวิธีในการสร้างสาขาที่ว่างเปล่าหากคุณไม่เปลี่ยนใจที่จะทำเช่นนั้นgit checkout --orphan new-branch; git reset --hard
jthill

การใช้xargsคืออะไร?
ฟลักซ์

@Flux เป็นเพียงอีกวิธีหนึ่งในการทำให้ tree id subbed เป็น arg-tree
jthill

ฉันชอบวิธีนี้มากเพราะจะช่วยให้สร้างสาขาใหม่ที่ว่างเปล่าโดยไม่ต้องออกจากสาขาปัจจุบันของคุณรวมถึงความจริงที่ว่านั่นเป็นจุดเริ่มต้นที่ว่างเปล่า
Brice

8

หากเวอร์ชัน git ของคุณไม่มีตัวเลือก --orphan ควรใช้วิธีนี้:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

หลังจากทำงานเสร็จแล้ว:

git add -A
git commit -m <message>
git push origin <newbranch>

2
ระวังgit cleanสามารถลบไฟล์ที่คุณไม่ต้องการลบได้! เรียกใช้git clean -ndxก่อนเพื่อดูว่าไฟล์จะลบอะไรก่อนที่จะเรียกใช้ด้วย-fตัวเลือก
Lassi

7

สมมติว่าคุณมีmasterสาขาที่มีไฟล์ / ไดเรกทอรี:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

ทีละขั้นตอนวิธีการทำให้สาขาว่าง:

  1. git checkout —orphan new_branch_name
  2. ตรวจสอบให้แน่ใจว่าคุณอยู่ในไดเรกทอรีที่ถูกต้องก่อนดำเนินการคำสั่งต่อไปนี้:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

ในขั้นตอนที่ 2 เราเพียงแค่ลบไฟล์ทั้งหมดในเครื่องเพื่อหลีกเลี่ยงความสับสนกับไฟล์ในสาขาใหม่ของคุณและไฟล์ที่คุณเก็บไว้ในmasterสาขา จากนั้นเราจะยกเลิกการเชื่อมโยงไฟล์ทั้งหมดในขั้นตอนที่ 3 ในที่สุดขั้นตอนที่ 4 และหลังจากนั้นจะทำงานกับสาขาว่างใหม่ของเรา

เมื่อเสร็จแล้วคุณสามารถสลับระหว่างสาขาของคุณ:

git checkout master 
git checkout new_branch

1

บนฐานนี้คำตอบจาก Hiery Nomus

คุณสามารถสร้างสาขาเป็นเด็กกำพร้า:

git checkout --orphan <branchname>

สิ่งนี้จะสร้างสาขาใหม่ที่ไม่มีผู้ปกครอง จากนั้นคุณสามารถล้างไดเรกทอรีการทำงานด้วย:

git rm --cached -r .

จากนั้นคุณเพิ่งจะทำการสาขาด้วยการกระทำที่ว่างเปล่าแล้วกด

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

ตรวจสอบเอกสารนี้มีรายละเอียดชัดเจนเกี่ยวกับ

--orphan <new_branch>
สร้างสาขาเด็กกำพร้าใหม่ชื่อ<new_branch>เริ่มต้นจาก<start_point>และเปลี่ยนเป็น ความมุ่งมั่นแรกที่เกิดขึ้นในสาขาใหม่นี้จะไม่มีผู้ปกครองและมันจะเป็นรากฐานของประวัติศาสตร์ใหม่ที่ถูกตัดการเชื่อมต่อโดยสิ้นเชิงจากสาขาอื่น ๆ และการกระทำทั้งหมด

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


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

1

ฉันพบความช่วยเหลือนี้:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.