Menggunakan gitk log
, saya tidak bisa menemukan perbedaan di antara keduanya. Bagaimana saya bisa mengamati perbedaannya (dengan perintah git atau beberapa alat)?
Menggunakan gitk log
, saya tidak bisa menemukan perbedaan di antara keduanya. Bagaimana saya bisa mengamati perbedaannya (dengan perintah git atau beberapa alat)?
Jawaban:
The --no-ff
bendera mencegah git merge
dari mengeksekusi "fast-forward" jika mendeteksi bahwa saat ini Anda HEAD
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 melakukan git 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 dan git merge
akan selalu membuat gabungan alih-alih penerusan cepat.
Demikian pula, jika Anda ingin mengeksekusi git pull
atau menggunakan git 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 seperti git pull --ff-only
tanpa berpikir, dan kemudian jika itu salah, Anda dapat kembali dan memutuskan apakah Anda ingin bergabung atau rebase.
gitk
atau git 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
.
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.
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.
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:
git checkout -b contact-form
(do your work on "contact-form")
git status
git commit -am "updated form in contact module"
git checkout master
git merge --no-ff contact-form
git branch -d contact-form
git push origin master
Bawah: penggunaan aktual, termasuk penjelasan.
Catatan: output di bawah ini terpotong; git cukup bertele-tele.
$ git status
# On branch master
# Changed but not updated:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: ecc/Desktop.php
# modified: ecc/Mobile.php
# deleted: ecc/ecc-config.php
# modified: ecc/readme.txt
# modified: ecc/test.php
# deleted: passthru-adapter.igs
# deleted: shop/mickey/index.php
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# ecc/upgrade.php
# ecc/webgility-config.php
# ecc/webgility-config.php.bak
# ecc/webgility-magento.php
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 dengan ecc
, saya akan membuat cleanup
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 saya git add
, tetapi karena sudah dilacak di git, saya harus menghapusnya dari komit cabang ini:
$ git checkout -b ecc
$ git add ecc/*
$ git reset HEAD passthru-adapter.igs
$ git reset HEAD shop/mickey/index.php
Unstaged changes after reset:
M passthru-adapter.igs
M shop/mickey/index.php
$ git commit -m "Webgility ecc desktop connector files; integrates with Quickbooks"
$ git checkout master
D passthru-adapter.igs
D shop/mickey/index.php
Switched to branch 'master'
$ git merge --no-ff ecc
$ git branch -d ecc
Deleted branch ecc (was 98269a2).
$ git push origin master
Counting objects: 22, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (14/14), 59.00 KiB, done.
Total 14 (delta 10), reused 0 (delta 0)
To git@github.com:me/mywebsite.git
8a0d9ec..333eff5 master -> master
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 melalui git status
dan kemudian menempelkan mereka dalam skrip ini. Ini terjadi karena saya membuat lusinan pengeditan tetapi menginginkan berbagai nama cabang untuk membantu mengelompokkan perubahan.
--no-ff
opsi?
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:
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 menggunakan git merge --no-ff
dan sisi kanan adalah contoh menggunakan di git 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.
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 .
git merge --no-ff ecc
Anda hanya akan memiliki komit gabungan tambahan git 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