Dalam upaya mencapai git nirwana, saya menghabiskan hari mempelajari cara memanfaatkan rebase untuk situasi di mana saya saat ini bergabung.
Saat menjalankan apa yang saya anggap sebagai aliran git 101 (yang saya jelaskan di bawah), saya harus melakukannya push --force
saat mendorong perubahan saya kembali ke asalnya.
Saya bukan satu-satunya - Saya tahu bahwa ini adalah tanah tertutup (lihat 1 , 2 , 3 , 4 , 5 ), dan saya memahami alasan teknis mengapa gaya diperlukan. Masalah saya adalah ini --- ada banyak (banyak) entri blog yang memuji rebase dan bagaimana hal itu mengubah hidup mereka (lihat 1 , 2 , 3 , 4 untuk beberapa daftar), tetapi tidak satupun dari mereka menyebutkan bahwa itu push --force
adalah bagian dari aliran mereka. Namun, hampir setiap jawaban untuk pertanyaan stackoverflow yang ada mengatakan hal-hal seperti "ya, jika Anda akan mengubah basis, ya harus menggunakan push --force
".
Mengingat jumlah dan religiusitas pendukung rebase, saya harus percaya bahwa menggunakan 'push --force' bukanlah bagian inheren dari aliran rebase, dan jika seseorang sering harus memaksakan dorongan mereka, mereka melakukan sesuatu yang salah .
push --force
adalah hal yang buruk .
Jadi inilah aliran saya. Dengan cara apa saya bisa mencapai hasil yang sama tanpa kekuatan?
Contoh Sederhana
Dua cabang:
- v1.0 - cabang rilis, hanya berisi patch
- master - semuanya untuk rilis mayor berikutnya.
Saya punya beberapa patch komit dan beberapa komit untuk rilis berikutnya.
Saya ingin memasukkan tambalan ke master saya sehingga tidak hilang untuk rilis berikutnya. Pra-pencerahan, saya cukup:
git checkout master
git merge v1.0
Tapi sekarang saya sedang mencoba
git checkout master
git rebase v1.0
Jadi sekarang saya di sini:
Waktu untuk:
git push
Tidak ada dadu.
sumber
@CodeGome benar. Anda sebaiknya tidak me-rebase master pada cabang v1.0 tetapi cabang v1.0 pada master, itu akan membuat semua perbedaan.
Buat cabang baru yang menunjuk ke v1.0, pindahkan cabang baru itu di atas master dan kemudian integrasikan versi baru dari patch V1.0 ke cabang master. Anda akan mendapatkan sesuatu seperti:
Cara menggunakan rebase ini direkomendasikan oleh dokumentasi resmi git .
Saya pikir Anda benar tentang
git push --force
: Anda hanya boleh menggunakannya jika Anda membuat kesalahan dan mendorong sesuatu yang tidak Anda inginkan.sumber
master
dan tidak keberatan menggabungkan cabang fitur itu sendiri, ini dapat dilakukan dengan:git checkout my-branch; git rebase master; git checkout master; git merge my-branch
Anda harus memaksa push jika Anda melakukan rebase, dan Anda telah mempublikasikan perubahan Anda, bukan?
Saya menggunakan rebase secara keseluruhan, tetapi saya menerbitkan ke sesuatu yang privat di mana dorongan paksa tidak masalah (misalnya: klon saya sendiri di GitHub, sebagai bagian dari permintaan tarik), atau saya melakukan rebase sebelum saya mendorong untuk pertama kalinya.
Ini adalah inti dari alur kerja di mana Anda menggunakan rebase, tetapi jangan memaksa terlalu banyak: jangan mempublikasikan sesuatu sampai mereka siap, jangan rebase setelah Anda melakukan push.
sumber
rebase
baru menarik perubahan ke cabang topik Anda, tetapi ketika Anda telah menyelesaikan perubahan cabang itu, Andamerge
cabang tersebut kembali ke cabang pengembangan utama.Saya pikir ada kasus penggunaan yang baik untuk pola rebase-kemudian-force-push ini yang bukan hasil dari dorongan yang salah: mengerjakan cabang fitur sendiri dari beberapa lokasi (komputer). Saya sering melakukan ini, karena saya terkadang bekerja di kantor di desktop saya, dan terkadang dari rumah / situs pelanggan di laptop saya. Saya perlu melakukan rebase sesekali untuk mengimbangi cabang utama dan / atau untuk membuat penggabungan lebih bersih, tetapi saya juga perlu mendorong paksa ketika saya meninggalkan satu mesin untuk mengerjakan yang lain (di mana saya hanya menarik). Bekerja seperti pesona, selama saya satu-satunya yang bekerja di cabang.
sumber
Inilah yang saya gunakan (dengan asumsi nama cabang Anda adalah foobar ):
sumber
git
bukan tanpa kepribadiangit merge -s ours origin/<branch>
adalah yang memperbaikinya bagi kamitl; dr bergabung dengan cabang bersama, rebase dengan cabang individu.
--force-with-lease
adalah alternatif yang lebih aman untuk kekuatan dan akan membantu Anda mencapai git nirwana tersebut tanpa sifat kekuatan yang merusak.Aturan umum yang saya lihat berhasil untuk berbagai alur kerja tim adalah untuk digunakan
merge
untuk cabang bersama (Ie, master atau kembangkan) dan digunakanrebase
saat mengerjakan cabang fitur Anda sendiri. Berikut ini siklus hidup khas dari cabang fiturVersi bahasa Inggris sederhana dari apa yang telah kami lakukan di sini:
force-with-lease
Langkah ke-4 SANGAT penting dan salah satu alasan utama saya mulai menganjurkan penggunaan rebase.
force-with-lease
periksa remote untuk melihat apakah ada komit baru yang telah ditambahkan. Jika Andagit push
terbukti merusak, itu tidak akan mendorong!Saya harap ini membuat seseorang lebih percaya diri untuk menggunakan rebase.
sumber