Biarkan saya menjawab poin Anda secara langsung dan jelas:
Masalah kami adalah dengan sidebranch jangka panjang - jenis di mana Anda memiliki beberapa orang yang bekerja sidebranch yang terpisah dari master, kami berkembang selama beberapa bulan, dan ketika kami mencapai tonggak sejarah kami menyinkronkan keduanya.
Anda biasanya tidak ingin membiarkan cabang Anda tidak disinkronkan selama berbulan-bulan.
Cabang fitur Anda telah bercabang dari sesuatu tergantung pada alur kerja Anda; sebut saja itu master
demi kesederhanaan. Sekarang, kapan pun Anda berkomitmen untuk menguasainya, Anda bisa dan harus melakukannya git checkout long_running_feature ; git rebase master
. Ini berarti bahwa cabang Anda, menurut desain, selalu sinkron.
git rebase
juga hal yang benar untuk dilakukan di sini. Ini bukan hack atau sesuatu yang aneh atau berbahaya, tetapi sepenuhnya alami. Anda kehilangan sedikit informasi, yang merupakan "ulang tahun" dari cabang fitur, tetapi hanya itu. Jika beberapa orang menganggap itu penting, itu bisa diberikan dengan menyimpannya di tempat lain (dalam sistem tiket Anda, atau, jika kebutuhannya besar, dalam git tag
...).
Sekarang, IMHO, cara alami untuk menangani ini adalah, remas sidebranch menjadi komit tunggal.
Tidak, Anda sama sekali tidak ingin itu, Anda ingin komit gabungan. Komit gabungan juga merupakan "komit tunggal". Entah bagaimana, itu tidak memasukkan semua cabang individu melakukan "ke" master. Ini adalah komitmen tunggal dengan dua orang tua - master
kepala dan kepala cabang pada saat penggabungan.
Pastikan untuk menentukan --no-ff
opsi, tentu saja; menggabungkan tanpa --no-ff
harus, dalam skenario Anda, dilarang keras. Sayangnya, --no-ff
ini bukan default; tapi saya yakin ada opsi yang bisa Anda atur yang membuatnya begitu. Lihat git help merge
apa yang --no-ff
dilakukannya (singkatnya: itu mengaktifkan perilaku yang saya jelaskan di paragraf sebelumnya), itu sangat penting.
kita tidak secara surut membuang bulan pembangunan paralel ke dalam sejarah master.
Sama sekali tidak - Anda tidak pernah membuang sesuatu "ke dalam sejarah" dari beberapa cabang, terutama dengan komit gabungan.
Dan jika ada yang membutuhkan resolusi yang lebih baik untuk sejarah sidebranch, yah, tentu saja semuanya masih ada - hanya saja tidak di master, itu di sidebranch.
Dengan komit gabungan, itu masih ada. Bukan di master, tapi di sidebranch, jelas terlihat sebagai salah satu orang tua dari gabungan melakukan, dan disimpan untuk selamanya, sebagaimana mestinya.
Lihat apa yang saya lakukan? Semua hal yang Anda jelaskan untuk komit squash Anda ada di sana dengan --no-ff
komit gabungan .
Inilah masalahnya: Saya bekerja secara eksklusif dengan baris perintah, tetapi anggota tim saya yang lain menggunakan GUIS.
(Komentar samping: Saya hampir secara eksklusif bekerja dengan baris perintah juga (well, itu bohong, saya biasanya menggunakan emacs magit, tapi itu cerita lain - jika saya tidak berada di tempat yang nyaman dengan pengaturan emacs pribadi saya, saya lebih suka perintah baris juga). Tapi tolong jangan kebaikan dan mencoba setidaknya git gui
sekali. Hal ini sangat jauh lebih efisien untuk memilih garis, bakhil dll untuk menambahkan / kehancuran menambahkan.)
Dan saya telah menemukan GUIS tidak memiliki opsi yang masuk akal untuk menampilkan riwayat dari cabang lain.
Itu karena apa yang Anda coba lakukan benar-benar bertentangan dengan semangat git
. git
dibangun dari inti pada "grafik asiklik terarah", yang berarti, banyak informasi ada dalam hubungan orangtua-anak-komit. Dan, untuk penggabungan, itu berarti penggabungan yang benar dilakukan dengan dua orang tua dan satu anak. GUI kolega Anda akan baik-baik saja segera setelah Anda menggunakan no-ff
komit gabungan.
Jadi, jika Anda mencapai komit squash, mengatakan "pengembangan ini tergencet dari cabang XYZ", sangat merepotkan untuk melihat apa yang ada di XYZ.
Ya, tapi itu bukan masalah GUI, tetapi dari squash commit. Menggunakan squash berarti Anda membiarkan kepala cabang fitur menjuntai, dan membuat komitmen baru master
. Ini memecah struktur pada dua level, menciptakan kekacauan besar.
Jadi mereka ingin ini, sidebranch-development-long yang besar bergabung, selalu dengan komit gabungan.
Dan mereka benar sekali. Tapi mereka tidak "bergabung dalam ", mereka hanya bergabung. Penggabungan adalah hal yang benar-benar seimbang, tidak memiliki sisi yang disukai yang digabungkan "ke" yang lain ( git checkout A ; git merge B
persis sama git checkout B ; git merge A
kecuali kecuali untuk perbedaan visual kecil seperti cabang yang ditukar di git log
dll.).
Mereka tidak ingin ada riwayat yang tidak dapat langsung diakses dari cabang utama.
Yang sepenuhnya benar. Pada saat tidak ada fitur yang tidak dihapus, Anda akan memiliki satu cabang master
dengan sejarah kaya yang merangkum semua baris komit fitur yang pernah ada, kembali ke git init
komit sejak awal waktu (perhatikan bahwa saya secara khusus menghindari penggunaan istilah " cabang "di bagian akhir paragraf itu karena sejarah pada waktu itu bukan" cabang "lagi, walaupun grafik komit akan cukup bercabang).
Saya benci ide itu;
Maka Anda sedikit kesakitan, karena Anda bekerja melawan alat yang Anda gunakan. The git
Pendekatan ini sangat elegan dan kuat, terutama di percabangan / daerah penggabungan; jika Anda melakukannya dengan benar (seperti yang disinggung di atas, terutama dengan --no-ff
) itu adalah dengan lompatan dan lebih unggul untuk pendekatan lain (misalnya, kekacauan subversi memiliki struktur direktori paralel untuk cabang).
itu berarti kusut yang tak ada habisnya, sejarah pengembangan paralel.
Tak berujung, paralel - ya.
Tidak dapat dinavigasi, kusut - tidak.
Tetapi saya tidak melihat alternatif apa yang kita miliki.
Mengapa tidak bekerja seperti yang dilakukan oleh penemu git
, kolega Anda dan seluruh dunia, setiap hari?
Apakah kita punya opsi di sini selain terus-menerus menggabungkan sidebranch menjadi master dengan gabungan-komitmen? Atau, adakah alasan bahwa terus menggunakan komit gabungan tidak seburuk yang saya takutkan?
Tidak ada pilihan lain; tidak seburuk itu.