git resetadalah tentang bergerak HEAD, dan umumnya ref cabang .
Pertanyaan: bagaimana dengan pohon dan indeks kerja?
Ketika dipekerjakan dengan --soft, bergerak HEAD, paling sering memperbarui ref cabang, dan hanyaHEAD .
Ini berbeda commit --amenddengan:
- itu tidak membuat komit baru.
- itu sebenarnya dapat memindahkan HEAD ke komit apa pun (karena
commit --amendhanya tentang tidak memindahkan HEAD, sambil mengizinkan untuk mengulang komit saat ini)
Baru saja menemukan contoh penggabungan ini:
- gabungan klasik
- gabungan subtree
semua menjadi satu (gurita, karena ada lebih dari dua cabang digabung) melakukan penggabungan.
Tomas "dulu." Carnecky menjelaskan dalam artikelnya "Subtree Octopus merge" :
- Strategi penggabungan subtree dapat digunakan jika Anda ingin menggabungkan satu proyek menjadi subdirektori dari proyek lain, dan selanjutnya menjaga agar proyek tetap terbaru. Ini adalah alternatif untuk git submodules.
- Strategi penggabungan gurita dapat digunakan untuk menggabungkan tiga atau lebih cabang. Strategi normal hanya dapat menggabungkan dua cabang dan jika Anda mencoba untuk menggabungkan lebih dari itu, git secara otomatis kembali ke strategi gurita.
Masalahnya adalah Anda hanya dapat memilih satu strategi. Tapi saya ingin menggabungkan keduanya untuk mendapatkan sejarah bersih di mana seluruh repositori diperbarui secara atom ke versi baru.
Saya punya proyek super, sebut saja projectA, dan sub proyek projectB,, yang saya gabungkan menjadi subdirektori dari projectA.
(Itulah bagian menggabungkan subtree)
Saya juga mempertahankan beberapa komitmen lokal.
ProjectAsecara teratur diperbarui, projectBmemiliki versi baru setiap beberapa hari atau minggu dan biasanya tergantung pada versi tertentu projectA.
Ketika saya memutuskan untuk memperbarui kedua proyek, saya tidak hanya menarik dari projectAdan projectB karena itu akan membuat dua komitmen untuk apa yang seharusnya menjadi pembaruan atom dari seluruh proyek .
Sebagai gantinya, saya membuat satu komit gabungan yang menggabungkan projectA, projectBdan komit lokal saya .
Bagian yang sulit di sini adalah bahwa ini adalah gabungan gurita (tiga kepala), tetapi projectBperlu digabungkan dengan strategi subtree . Jadi inilah yang saya lakukan:
# Merge projectA with the default strategy:
git merge projectA/master
# Merge projectB with the subtree strategy:
git merge -s subtree projectB/master
Di sini penulis menggunakan reset --hard, dan kemudian read-treeuntuk mengembalikan apa yang telah dilakukan oleh dua penggabungan pertama ke pohon kerja dan indeks, tetapi di situlah reset --softdapat membantu:
Bagaimana saya mengulangi dua penggabungan , yang telah bekerja, yaitu pohon kerja dan indeks saya adalah baik-baik saja, tetapi tanpa harus merekam kedua komitmen tersebut
# Move the HEAD, and just the HEAD, two commits back!
git reset --soft HEAD@{2}
Sekarang, kita dapat melanjutkan solusi Tomas:
# Pretend that we just did an octopus merge with three heads:
echo $(git rev-parse projectA/master) > .git/MERGE_HEAD
echo $(git rev-parse projectB/master) >> .git/MERGE_HEAD
# And finally do the commit:
git commit
Jadi, setiap kali:
- Anda puas dengan apa yang Anda dapatkan (dalam hal pohon dan indeks kerja)
- Anda tidak puas dengan semua komitmen yang membawa Anda ke sana:
git reset --soft adalah jawabannya.
git reset --soft: stackoverflow.com/questions/6869705/…