Saya ingin mendefinisikan cabang "root" baru di repositori git ini. Cabang "root" yang saya maksud adalah cabang yang sepenuhnya independen dari semua cabang lain dalam repositori 1 .
Sayangnya, bahkan komit (sebut saja A
) di bagian paling bawah dari pohon komit repo berisi banyak file (ini adalah repositori yang diinisialisasi pada proyek yang sudah cukup matang).
Ini berarti bahwa meskipun saya berikan A
sebagai cabang baru <start-point>
, cabang baru ini tidak akan mulai dari "sabak bersih", tetapi itu akan berisi semua file yang dilakukan A
.
Apakah ada cara saya bisa membuat cabang yang benar-benar telanjang di repositori ini, dengan <start-point>
sedekat A
mungkin?
1 BTW, ini tidak setara dengan membuat repo baru. Repo yang terpisah akan kurang nyaman karena banyak alasan.
EDIT : OK, ini yang saya lakukan, berdasarkan jawaban vcsjones :
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
Meskipun prosedur ini sedikit terlibat, hasil akhirnya adalah komit dasar kosong yang dapat berfungsi sebagai <start-point>
untuk "cabang bersih-batu tulis" baru apa pun; yang perlu saya lakukan adalah
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
Di masa depan saya akan selalu membuat repositori baru seperti ini:
git init
git commit --allow-empty -m 'base commit (empty)'
... sehingga komit pertama kosong , dan selalu tersedia untuk memulai cabang independen baru. (Ini akan, saya tahu, fasilitas yang sangat jarang dibutuhkan, tetapi cukup mudah untuk membuatnya tersedia.)
git rebase --onto
, lihat stackoverflow.com/questions/645450/…Jawaban:
Gunakan
--orphan
saat membuat cabang:Ini akan membuat cabang baru dengan nol komit di atasnya, namun semua file Anda akan dipentaskan. Pada titik itu Anda bisa menghapusnya.
("hapus mereka": A
git reset --hard
akan mengosongkan indeks, meninggalkan Anda dengan pohon kerja kosong)Lihatlah halaman manual untuk checkout untuk informasi lebih lanjut tentang --orphan.
sumber
Untuk menambah jawaban yang diterima - praktik terbaik untuk kembali ke keadaan bersih adalah dengan membuat komit kosong awal sehingga Anda dapat dengan mudah rebase saat menyiapkan cabang untuk anak cucu. Plus karena Anda menginginkan kondisi bersih, Anda mungkin telah melakukan file yang tidak seharusnya, jadi Anda harus menghapusnya dari indeks. Dengan mengingat hal-hal tersebut, Anda harus:
sumber
Jika Anda menggunakan git 2.23 atau lebih tinggi, Anda mungkin terbiasa
git switch
dangit restore
bukannya menggunakangit checkout
. Jika demikian, benderanya sama dengan yang disebutkan dalam jawaban ini .sumber
Perintah aktual untuk menggunakan (dengan Git 2.28+) adalah:
git switch
tersedia dari Git 2.23 (Agustus 2019), dan menggantikan membingungkan tuagit checkout
perintah .Tetapi saya akan merekomendasikan Git 2.28 (Q3 2020), karena
git switch --discard-changes --orphan
telah dioptimalkan dalam versi itu.Lihat komit 8d3e33d , komit 8186128 (21 Mei 2020) oleh brian m. carlson (
bk2204
) .(Digabung oleh Junio C Hamano -
gitster
- dalam commit ded44af , 09 Jun 2020)Uji:
sumber