Menggunakan gitk log
, saya tidak bisa menemukan perbedaan di antara keduanya. Bagaimana saya bisa mengamati perbedaannya (dengan perintah git atau beberapa alat)?
git
merge
fast-forward
pengguna1162226
sumber
sumber
Jawaban:
The
--no-ff
bendera mencegahgit merge
dari mengeksekusi "fast-forward" jika mendeteksi bahwa saat ini AndaHEAD
adalah nenek moyang komit Anda mencoba untuk menggabungkan. Sebuah fast-forward adalah ketika, alih-alih membangun komit gabungan, git hanya memindahkan pointer cabang Anda ke titik di komit yang masuk. Ini biasanya terjadi ketika melakukangit pull
tanpa perubahan lokal.Namun, kadang-kadang Anda ingin mencegah perilaku ini terjadi, biasanya karena Anda ingin mempertahankan topologi cabang tertentu (misalnya Anda menggabungkan dalam cabang topik dan Anda ingin memastikannya terlihat seperti itu ketika membaca sejarah). Untuk melakukan itu, Anda bisa melewati
--no-ff
flag dangit merge
akan selalu membuat gabungan alih-alih penerusan cepat.Demikian pula, jika Anda ingin mengeksekusi
git pull
atau menggunakangit merge
secara eksplisit fast-forward, dan Anda ingin bail out jika tidak bisa fast-forward, maka Anda bisa menggunakan--ff-only
flag. Dengan cara ini Anda dapat secara teratur melakukan sesuatu sepertigit pull --ff-only
tanpa berpikir, dan kemudian jika itu salah, Anda dapat kembali dan memutuskan apakah Anda ingin bergabung atau rebase.sumber
gitk
ataugit log --graph
bahwa penggabungan maju tidak membuat komit penggabungan, sedangkan yang tidak maju cepat.--no-ff
dari fitur untuk dikembangkan atau dikembangkan untuk dikuasai mirip dengan menggabungkan permintaan tarik?--no-ff
.Jawaban grafis untuk pertanyaan ini
Berikut adalah situs dengan penjelasan yang jelas dan ilustrasi grafis tentang penggunaan
git merge --no-ff
:Sampai saya melihat ini, saya benar-benar bingung dengan git. Menggunakan
--no-ff
memungkinkan seseorang meninjau riwayat untuk melihat dengan jelas cabang yang Anda periksa untuk dikerjakan. (tautan itu menunjuk ke alat visualisasi "jaringan" github) Dan inilah referensi hebat lainnya dengan ilustrasi. Referensi ini melengkapi yang pertama dengan lebih fokus pada mereka yang kurang mengenal git.Info dasar untuk pemula seperti saya
Jika Anda seperti saya, dan bukan seorang Git-guru, jawaban saya di sini menjelaskan tentang menangani penghapusan file dari pelacakan git tanpa menghapusnya dari sistem file lokal, yang sepertinya tidak terdokumentasi dengan baik tetapi sering kali terjadi. Situasi newb lain adalah mendapatkan kode saat ini , yang masih berhasil menghindari saya.
Contoh Alur Kerja
Saya memperbarui paket ke situs web saya dan harus kembali ke catatan saya untuk melihat alur kerja saya; Saya pikir bermanfaat untuk menambahkan contoh pada jawaban ini.
Alur kerja git saya:
Bawah: penggunaan aktual, termasuk penjelasan.
Catatan: output di bawah ini terpotong; git cukup bertele-tele.
Perhatikan 3 hal dari atas:
1) Dalam output Anda dapat melihat perubahan dari upgrade paket ECC, termasuk penambahan file baru.
2) Juga perhatikan ada dua file (tidak ada dalam
/ecc
folder) yang saya hapus terlepas dari perubahan ini. Alih-alih membingungkan penghapusan file denganecc
, saya akan membuatcleanup
cabang yang berbeda nanti untuk mencerminkan penghapusan file-file itu.3) Saya tidak mengikuti alur kerja saya! Saya lupa tentang git ketika saya mencoba membuat ECC bekerja kembali.
Bawah: daripada melakukan semua-inklusif seperti
git commit -am "updated ecc package"
biasanya, saya hanya ingin menambahkan file di/ecc
folder. File-file yang dihapus itu bukan bagian dari sayagit add
, tetapi karena sudah dilacak di git, saya harus menghapusnya dari komit cabang ini:Script untuk mengotomatisasi di atas
Setelah menggunakan proses ini 10+ kali dalam sehari, saya telah menulis skrip batch untuk menjalankan perintah, jadi saya membuat
git_update.sh <branch> <"commit message">
skrip yang hampir tepat untuk melakukan langkah-langkah di atas. Berikut adalah sumber inti untuk skrip itu.Alih-alih
git commit -am
saya memilih file dari daftar "dimodifikasi" yang dihasilkan melaluigit status
dan kemudian menempelkan mereka dalam skrip ini. Ini terjadi karena saya membuat lusinan pengeditan tetapi menginginkan berbagai nama cabang untuk membantu mengelompokkan perubahan.sumber
--no-ff
opsi?Gabungkan Strategi
Penggabungan Eksplisit : Membuat komit gabungan baru. (Ini yang akan kamu dapatkan jika kamu digunakan
--no-ff
.)Penggabungan Maju Cepat: Maju cepat, tanpa membuat komit baru:
Rebase : Menetapkan level dasar baru:
Squash: Hancurkan atau remas (sesuatu) dengan paksa sehingga menjadi rata:
sumber
The
--no-ff
Memastikan opsi yang maju penggabungan cepat tidak akan terjadi, dan bahwa komit baru objek akan selalu dibuat . Ini dapat diinginkan jika Anda ingin git mempertahankan riwayat cabang fitur. Pada gambar di atas, sisi kiri adalah contoh dari sejarah git setelah menggunakangit merge --no-ff
dan sisi kanan adalah contoh menggunakan digit merge
mana penggabungan ff dimungkinkan.EDIT : Versi gambar ini sebelumnya hanya mengindikasikan satu induk tunggal untuk komit gabungan. Komitmen gabungan memiliki beberapa komitmen induk yang digunakan git untuk mempertahankan riwayat "cabang fitur" dan cabang asli. Beberapa tautan induk disorot dalam warna hijau.
sumber
Ini adalah pertanyaan lama, dan ini agak halus disebutkan dalam posting lain, tetapi penjelasan yang membuat klik ini untuk saya adalah bahwa penggabungan non-maju akan memerlukan komit terpisah .
sumber
git merge --no-ff ecc
Anda hanya akan memiliki komit gabungan tambahangit log
untuk master cabang. Itu secara teknis tidak diperlukan jika master menunjuk ke leluhur langsung dari komit ecc aktif tetapi dengan menentukan opsi --no-ff Anda memaksa penciptaan komit gabungan tersebut. Judulnya:Merge branch 'ecc'
Bendera --no-ff menyebabkan penggabungan untuk selalu membuat objek komit baru, bahkan jika penggabungan dapat dilakukan dengan fast-forward. Ini menghindari kehilangan informasi tentang keberadaan historis cabang fitur dan grup bersama-sama semua komit yang bersama-sama menambahkan fitur
sumber