Membuat cabang kosong baru untuk proyek baru

351

Kami menggunakan repositori git untuk menyimpan proyek kami. Kami memiliki cabang kami yang berangkat dari cabang asli. Tapi sekarang kami ingin membuat proyek kecil baru untuk melacak beberapa dokumentasi. Untuk itu kami ingin membuat cabang kosong baru untuk mulai menyimpan file kami, dan saya ingin pengguna lain dari jaringan mengkloning cabang itu.

Bagaimana kita bisa melakukan itu?

Saya mencoba beberapa hal, tetapi mereka tidak berhasil.

$ 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

Tampaknya mendorong cabang ok, tetapi ketika saya mengambil atau menarik, itu mengunduh informasi dari cabang lain, dan kemudian saya juga mendapatkan beberapa file tambahan dari proyek lain. Apa solusi terbaik?

fazineroso
sumber
11
Mengapa Anda perlu menyimpan ini di cabang? Cabang biasanya untuk beberapa penyimpangan dari basis kode yang sama. Mungkin hanya memulai repositori baru akan menjadi solusi yang lebih baik.
Benjamin Bannier
2
Ya, kami pernah melakukannya sebelumnya, IIRC, dan saya ingin melakukannya lagi, jadi saya ingin tahu;)
fazineroso
3
"untuk proyek baru" - Sebagai @honk saya akan menyarankan untuk meletakkan ini di repositori baru Dua opsi dari sana untuk mengintegrasikannya. Jadikan sebagai submoduleproyek asli, mis. docs/Menunjuk ke repo lain itu. Atau, jika Anda ingin menggabungkan kode nanti, tambahkan sebagai remote.
gertvdijk
1
Satu kelemahan tambahan dari pendekatan anak yatim adalah bahwa Anda perlu menyimpan .gitignorefile Anda, dan juga terus-menerus beralih di antara dua root (cabang). Jadi saya juga untuk pendekatan repo baru, di folder baru, memiliki remote yang sama, dan mendorong ke cabang lain.
simo

Jawaban:

666

Anda dapat membuat cabang sebagai anak yatim:

git checkout --orphan <branchname>

Ini akan membuat cabang baru tanpa orang tua. Kemudian, Anda dapat menghapus direktori kerja dengan:

git rm --cached -r .

dan tambahkan file dokumentasi, komit dan dorong mereka ke github.

Tarik atau ambil akan selalu memperbarui informasi lokal tentang semua cabang jarak jauh. Jika Anda hanya ingin menarik / mengambil informasi untuk satu cabang jarak jauh, Anda perlu menentukannya.

Nomery Hiery
sumber
18
Jawaban yang bagus, tetapi agak menjengkelkan bahwa cabang baru dimulai dengan semua file (dari cabang sebelumnya) dipentaskan.
Matt Fenwick
12
Saat menerbitkan git checkout --orphan <branch>; Saya tidak melihat daftar <branch> di git branch.
Santosh Kumar
51
Setelah git checkout --orphansatu dapat digunakan git reset --harduntuk menghapus file yang tersisa.
Ilya Kozhevnikov
16
Alasan mengapa Anda tidak melihat cabang setelah git checkout --orphan <branch>adalah karena belum memiliki komitmen. Setelah komit pertama git branchmencetak cabang baru.
Krøllebølle
13
git clean -fd menghapus file yang tidak terlacak.
stefgosselin
71

Jawaban yang benar adalah membuat cabang yatim. Saya menjelaskan bagaimana melakukan ini secara rinci di blog saya. (Tautan yang diarsipkan)

...

Sebelum memulai, tingkatkan ke versi GIT terbaru. Untuk memastikan Anda menjalankan versi terbaru, jalankan

which git

Jika itu mengeluarkan versi lama, Anda mungkin perlu menambah PATH Anda dengan folder yang berisi versi yang baru saja Anda instal.

Ok, kita sudah siap. Setelah melakukan cd ke folder yang berisi checkout git Anda, buat cabang yatim. Untuk contoh ini, saya akan memberi nama cabang "mybranch".

git checkout --orphan mybranch

Hapus semua yang ada di cabang yatim

git rm -rf .

Buat beberapa perubahan

vi README.txt

Tambahkan dan komit perubahan

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

Itu dia. Jika Anda berlari

git log

Anda akan melihat bahwa riwayat komit dimulai dari awal. Untuk beralih kembali ke cabang master Anda, jalankan saja

git checkout master

Anda dapat kembali ke cabang yatim dengan berlari

git checkout mybranch
Sid Jain
sumber
16
Jawaban khusus tautan tidak dianjurkan. Jika tautan dipindahkan atau dihapus, jawaban Anda menjadi tidak berharga. Pertimbangkan untuk menambahkan bagian-bagian penting langsung ke jawaban ini. Berikan perhatian khusus pada masalah-masalah yang tidak tercakup dengan jawaban sebelumnya.
bytebuster
3
Sayangnya, tautan itu tidak valid lagi.
Alexey
1
Arsip adalah hal yang luar biasa.
lucid_dreamer
3
BERBAHAYA untuk menghapus semua yang ada di direktori kerja, karena setiap proyek non-sepele akan memiliki file yang tidak dilacak (konfigurasi, lingkungan, cache, dll).
Slava Fomin II
12

Buat cabang baru yang kosong seperti ini:

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

Jika file proj-doc Anda sudah dalam komit di bawah subdir tunggal, Anda dapat membuat cabang baru dengan cara ini:

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

yang mungkin lebih nyaman daripada git branch --orphanjika itu akan meninggalkan Anda dengan banyak git rmdangit mv harus dilakukan.

Mencoba

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

dan lihat apakah itu membantu masalah pengambilan terlalu banyak Anda. Juga jika Anda benar-benar hanya ingin mengambil satu cabang saja, paling aman untuk hanya menentukannya di commandline.

jthill
sumber
1
Jawaban ini menarik karena memungkinkan Anda untuk memulai cabang lain / root dengan komit pertama yang benar-benar kosong.
Stéphane Gourichon
Cara lain untuk membuat cabang kosong jika Anda tidak keberatan beralih ke sana adalahgit checkout --orphan new-branch; git reset --hard
jthill
Apa gunanya xargs?
Fluks
@Flux itu hanya cara lain untuk mendapatkan sub pohon sebagai sub-komit pohon.
jthill
Saya sangat suka pendekatan ini, karena ini memungkinkan untuk membuat cabang baru yang kosong, tanpa meninggalkan cabang Anda saat ini, ditambah fakta bahwa ada komit kosong sebagai titik awal.
Brice
8

Jika versi git Anda tidak memiliki opsi --orphan, metode ini harus digunakan:

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

Setelah melakukan beberapa pekerjaan:

git add -A
git commit -m <message>
git push origin <newbranch>
cyb0k
sumber
2
Hati-hati, git cleanbisa menghapus file yang tidak ingin Anda hapus! Jalankan git clean -ndxpertama untuk melihat file apa yang akan dihapus sebelum Anda menjalankannya nyata dengan -fopsi.
Lassi
7

Katakanlah Anda memiliki mastercabang dengan file / direktori:

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

Langkah demi langkah cara membuat cabang kosong:

  1. git checkout —orphan new_branch_name
  2. Pastikan Anda berada di direktori yang benar sebelum menjalankan perintah berikut:
    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

Pada langkah 2, kami cukup menghapus semua file secara lokal untuk menghindari kebingungan dengan file di cabang baru Anda dan yang Anda simpan master cabang. Kemudian, kami memutuskan tautan semua file di langkah 3. Akhirnya, langkah 4 dan setelah bekerja dengan cabang kosong baru kami.

Setelah selesai, Anda dapat dengan mudah beralih di antara cabang-cabang Anda:

git checkout master 
git checkout new_branch
pengguna1723157
sumber
1

Atas dasar jawaban ini dari Hiery Nomus .

Anda dapat membuat cabang sebagai anak yatim:

git checkout --orphan <branchname>

Ini akan membuat cabang baru tanpa orang tua. Kemudian, Anda dapat menghapus direktori kerja dengan:

git rm --cached -r .

Dan kemudian Anda hanya melakukan cabang dengan komit kosong dan kemudian mendorong

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

Lihat dokumentasi ini , ini memiliki detail yang jelas tentang

--orphan <new_branch>
Buat cabang yatim baru, bernama <new_branch>, mulai dari<start_point> dan beralih ke sana. Komit pertama yang dibuat pada cabang baru ini tidak akan memiliki orang tua dan itu akan menjadi akar sejarah baru yang benar-benar terputus dari semua cabang dan komitmen lainnya.

Indeks dan pohon kerja disesuaikan seolah-olah Anda sebelumnya menjalankan checkout git. Ini memungkinkan Anda untuk memulai riwayat baru yang merekam serangkaian jalur yang mirip dengan dengan mudah menjalankan git commit -a untuk membuat root komit.

Kamal Hossain
sumber
1
Tautan ke suatu solusi disambut baik, tetapi harap pastikan jawaban Anda bermanfaat tanpanya: tambahkan konteks di sekitar tautan sehingga teman-teman Anda akan mengetahui apa itu dan mengapa ada, lalu kutip bagian yang paling relevan dari halaman yang Anda tuju. menghubungkan kembali jika seandainya halaman target tidak tersedia. Jawaban yang sedikit lebih dari sebuah tautan dapat dihapus.
Yunnosch
1

saya menemukan bantuan ini:

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"
齐 化 恒
sumber