Git maju cepat VS tidak ada penggabungan maju cepat
247
Git merge memungkinkan kami untuk melakukan fast forward dan tidak ada penggabungan cabang fast forward. Adakah ide kapan untuk menggunakan penggabungan maju dan kapan untuk menggunakan tidak ada penggabungan maju?
The --no-ffpilihan berguna ketika Anda ingin memiliki gagasan yang jelas tentang fitur cabang Anda. Jadi, bahkan jika sementara itu tidak ada komitmen yang dibuat, FF dimungkinkan - Anda masih ingin terkadang masing-masing komit di garis utama sesuai dengan satu fitur. Jadi, Anda memperlakukan cabang fitur dengan banyak komit sebagai satu unit, dan menggabungkannya sebagai satu unit. Jelas dari riwayat Anda saat Anda melakukan penggabungan cabang fitur --no-ff.
Jika Anda tidak peduli dengan hal seperti itu - Anda mungkin bisa lolos dengan FF kapan pun memungkinkan. Dengan demikian Anda akan memiliki lebih banyak perasaan seperti alur kerja svn.
Sebagai contoh, penulis artikel ini berpikir bahwa --no-ffopsi harus default dan alasannya dekat dengan yang saya jelaskan di atas:
Pertimbangkan situasi di mana serangkaian komit minor pada cabang "fitur" secara kolektif membentuk satu fitur baru: Jika Anda hanya melakukan "git merge feature_branch" tanpa --no-ff, "tidak mungkin untuk melihat dari sejarah Git yang mana dari objek komit bersama memiliki menerapkan fitur — Anda harus membaca secara manual semua pesan log. Mengembalikan seluruh fitur (mis. sekelompok komit), adalah sakit kepala sejati [jika --no-fftidak digunakan], sedangkan itu mudah dilakukan jika --no-ffbendera digunakan [karena itu hanya satu komit]. "
Dan maju cepat sangat bagus untuk ketika Anda memiliki koleksi cabang terkait erat yang sekarang dan kemudian Anda hanya ingin bergerak bersama. Tidak semua penggabungan adalah peristiwa sejarah nyata.
Cascabel
3
Mengapa memelihara beberapa cabang? Jika mereka berhubungan dekat - mengapa tidak melakukan semuanya di cabang tunggal?
Ivan Danilov
11
Berhubungan erat bukan berarti identik. Selain itu, alur kerja tidak selalu rapi. Anda tidak selalu membuat komitmen yang Anda pikir akan Anda lakukan, Anda tidak selalu bercabang dari tempat terbaik. Mungkin Anda memulai beberapa fitur dari satu tempat, mulai mengerjakan salah satu dari mereka, menyadari itu generik, dan mempercepat fitur lainnya sebelum menyimpang.
Cascabel
2
Adapun balasan pertama, pengertian saya adalah bahwa OP ingin tahu praktik terbaik yang harus diikuti. Hal-hal terjadi dan tidak semuanya ideal tetapi ini sepertinya lebih seperti kompromi paksa.
Ivan Danilov
1
Perlu dicatat bahwa manfaat dari --no-ffriwayat komit Anda mungkin tidak segera terbukti ketika menggunakan alat dasar seperti git log, yang akan terus menunjukkan semua komitmen dari semua cabang yang telah digabungkan ke cabang Anda saat ini. Yang mengatakan, manfaatnya menjadi lebih jelas ketika menggunakan misalnya git log --first-parentpada cabang integrasi seperti developatau master. Jika Anda menggunakan agama --no-ffmaka itu akan secara eksklusif menampilkan permintaan menggabungkan, sementara git logmasih akan memberikan (lebih) sejarah yang komprehensif. Karena itulah Vincent merekomendasikannya untuk digunakan dengan GitFlow .
Jeremy Caney
12
Saya bisa memberikan contoh yang biasa dilihat dalam proyek.
Di sini, opsi --no-ff(yaitu penggabungan sejati ) membuat komit baru dengan banyak orang tua, dan memberikan pelacakan riwayat yang lebih baik. Jika tidak, --ff(yaitu penggabungan maju cepat ) secara default.
$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature' // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk // => see details with graph
$ git checkout -b anotherFeature // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk // => see details with graph
(*) Perhatikan bahwa di sini jika newFeaturecabang digunakan kembali, alih-alih membuat cabang baru, git tetap harus melakukan --no-ffpenggabungan. Ini berarti penggabungan maju cepat tidak selalu memenuhi syarat.
Ketika kita bekerja di lingkungan pengembangan dan menggabungkan kode kita ke staging / cabang produksi maka Git no fast forward bisa menjadi pilihan yang lebih baik. Biasanya ketika kami bekerja di cabang pengembangan untuk fitur tunggal, kami cenderung memiliki banyak komitmen. Melacak perubahan dengan banyak komit dapat merepotkan nantinya. Jika kita bergabung dengan staging / cabang produksi menggunakan Git no fast forward maka hanya akan memiliki 1 commit. Sekarang kapan saja kita ingin mengembalikan fitur, cukup komit itu kembali. Hidup itu mudah.
Ada kemungkinan juga bahwa seseorang mungkin ingin memiliki cabang fitur yang dipersonalisasi di mana kode hanya ditempatkan pada akhir hari. Itu memungkinkan untuk melacak pengembangan secara lebih rinci.
Saya tidak ingin mencemari pengembangan master dengan kode yang tidak berfungsi, sehingga melakukan --no-ff mungkin hanya apa yang dicari.
Sebagai catatan tambahan, mungkin tidak perlu untuk melakukan kode kerja pada cabang yang dipersonalisasi, karena sejarah dapat ditulis ulang git rebase -idan dipaksakan pada server selama tidak ada orang lain yang bekerja pada cabang yang sama.
Jawaban:
The
--no-ff
pilihan berguna ketika Anda ingin memiliki gagasan yang jelas tentang fitur cabang Anda. Jadi, bahkan jika sementara itu tidak ada komitmen yang dibuat, FF dimungkinkan - Anda masih ingin terkadang masing-masing komit di garis utama sesuai dengan satu fitur. Jadi, Anda memperlakukan cabang fitur dengan banyak komit sebagai satu unit, dan menggabungkannya sebagai satu unit. Jelas dari riwayat Anda saat Anda melakukan penggabungan cabang fitur--no-ff
.Jika Anda tidak peduli dengan hal seperti itu - Anda mungkin bisa lolos dengan FF kapan pun memungkinkan. Dengan demikian Anda akan memiliki lebih banyak perasaan seperti alur kerja svn.
Sebagai contoh, penulis artikel ini berpikir bahwa
--no-ff
opsi harus default dan alasannya dekat dengan yang saya jelaskan di atas:Pertimbangkan situasi di mana serangkaian komit minor pada cabang "fitur" secara kolektif membentuk satu fitur baru: Jika Anda hanya melakukan "git merge feature_branch" tanpa
--no-ff
, "tidak mungkin untuk melihat dari sejarah Git yang mana dari objek komit bersama memiliki menerapkan fitur — Anda harus membaca secara manual semua pesan log. Mengembalikan seluruh fitur (mis. sekelompok komit), adalah sakit kepala sejati [jika--no-ff
tidak digunakan], sedangkan itu mudah dilakukan jika--no-ff
bendera digunakan [karena itu hanya satu komit]. "sumber
--no-ff
riwayat komit Anda mungkin tidak segera terbukti ketika menggunakan alat dasar sepertigit log
, yang akan terus menunjukkan semua komitmen dari semua cabang yang telah digabungkan ke cabang Anda saat ini. Yang mengatakan, manfaatnya menjadi lebih jelas ketika menggunakan misalnyagit log --first-parent
pada cabang integrasi sepertidevelop
ataumaster
. Jika Anda menggunakan agama--no-ff
maka itu akan secara eksklusif menampilkan permintaan menggabungkan, sementaragit log
masih akan memberikan (lebih) sejarah yang komprehensif. Karena itulah Vincent merekomendasikannya untuk digunakan dengan GitFlow .Saya bisa memberikan contoh yang biasa dilihat dalam proyek.
Di sini, opsi
--no-ff
(yaitu penggabungan sejati ) membuat komit baru dengan banyak orang tua, dan memberikan pelacakan riwayat yang lebih baik. Jika tidak,--ff
(yaitu penggabungan maju cepat ) secara default.(*) Perhatikan bahwa di sini jika
newFeature
cabang digunakan kembali, alih-alih membuat cabang baru, git tetap harus melakukan--no-ff
penggabungan. Ini berarti penggabungan maju cepat tidak selalu memenuhi syarat.sumber
Ketika kita bekerja di lingkungan pengembangan dan menggabungkan kode kita ke staging / cabang produksi maka Git no fast forward bisa menjadi pilihan yang lebih baik. Biasanya ketika kami bekerja di cabang pengembangan untuk fitur tunggal, kami cenderung memiliki banyak komitmen. Melacak perubahan dengan banyak komit dapat merepotkan nantinya. Jika kita bergabung dengan staging / cabang produksi menggunakan Git no fast forward maka hanya akan memiliki 1 commit. Sekarang kapan saja kita ingin mengembalikan fitur, cukup komit itu kembali. Hidup itu mudah.
sumber
Ada kemungkinan juga bahwa seseorang mungkin ingin memiliki cabang fitur yang dipersonalisasi di mana kode hanya ditempatkan pada akhir hari. Itu memungkinkan untuk melacak pengembangan secara lebih rinci.
Saya tidak ingin mencemari pengembangan master dengan kode yang tidak berfungsi, sehingga melakukan --no-ff mungkin hanya apa yang dicari.
Sebagai catatan tambahan, mungkin tidak perlu untuk melakukan kode kerja pada cabang yang dipersonalisasi, karena sejarah dapat ditulis ulang
git rebase -i
dan dipaksakan pada server selama tidak ada orang lain yang bekerja pada cabang yang sama.sumber