Bisakah saya membuat penerusan cepat mati secara default di git?

263

Saya benar-benar tidak pernah bisa memikirkan saat ketika saya akan menggunakan git mergedaripada git rebasedan tidak ingin memiliki komit muncul. Apakah ada cara untuk mengkonfigurasi git agar penerusan cepat secara default? Fakta bahwa ada --ffpilihan tampaknya menyiratkan bahwa ada jalan, tetapi sepertinya saya tidak menemukannya dalam dokumentasi.

Jason Baker
sumber
3
Saya menggunakan mergesemua waktu untuk cabang ketika belum membuat komit dari jarak jauh mereka untuk memajukan mereka. Tampaknya cara paling sederhana dan paling aman untuk melakukan ini. Saya ingin tahu, Anda jelas memiliki use case. Mengapa Anda ingin membuat komit gabungan di mana tidak ada komit di satu sisi cabang?
CB Bailey
12
Saya menggunakan cabang untuk membuat pengelompokan komit logis. Jadi jika saya membuat penggabungan, pada dasarnya cara untuk mengatakan "komit ini berjalan bersama". Anda hampir dapat menganggapnya sebagai rebase dan squash interaktif orang miskin. :-)
Jason Baker
13
Mematikan penerusan cepat sangat berguna, terutama ketika mengikuti model seperti Model percabangan Git yang sukses
steinybot
2
Silakan ubah jawaban yang diterima untuk ini ke jawaban Eric Platon, stackoverflow.com/a/6810687/3408 - Saya melakukan langkah-langkah dalam jawaban yang diterima, kemudian menyadari bahwa itu hanya untuk cabang master di repositori saat ini, yang konyol.
rjmunro
3
@ jpmc26 Masing-masing untuk mereka sendiri kurasa. Saya kebetulan tidak setuju dengan artikel itu. Menemukan dua orang tua dari gabungan komit tidaklah sulit dan memberi tahu Anda dengan tepat apa perubahannya. Kemudian Anda dapat mengambil perubahan itu dan melakukan "rebase ke" cabang lain. Dengan model flat Anda harus menemukan dan memilih cherry secara manual. Kami memilih untuk merangkul percabangan. Memang rumit ketika melihat seluruh pohon tetapi itulah kenyataannya, banyak perubahan terjadi secara paralel. Meratakan semuanya hanya menyembunyikan apa yang sebenarnya terjadi.
steinybot

Jawaban:

282

Ya ada --no-ff. Anda dapat mengonfigurasi opsi gabungan per cabang, mis

git config branch.master.mergeoptions  "--no-ff"

menambahkan yang berikut ke $(REPO)/.git/configfile Anda :

[branch "master"]
    mergeoptions = --no-ff

Catatan kaki: berbicara tentang pengalaman saya, saya akhirnya menemukan beralih maju-cepat ke off sebagian besar bermanfaat bagi git pendatang baru - namun begitu nuansa alur kerja dan konsep mulai meresap Anda pasti ingin menghindari mengaburkan grafik log Anda dengan berton-ton penggabungan yang tidak berguna jenis remote ..blarf 'melakukan.

Catatan kaki 2, satu dekade kemudian: jawaban lain di bawah ini menyediakan opsi konfigurasi yang lebih modern, tetapi sungguh, Anda mungkin DO ingin tetap menggunakan default (yaitu, maju-cepat bila memungkinkan) di zaman sekarang ini, karena penggabungan-komit yang kosong benar-benar hanya dilakukan membuat sejarah jauh lebih sulit untuk dipikirkan.

conny
sumber
142
Belajar git agak mirip pendakian gunung; tetapi alih-alih memulai dengan tebing kecil dan maju ke yang lebih keras, git membuat Anda memanjat gunung yang sama lagi dan lagi, hanya untuk jatuh pada ketinggian yang berbeda setiap kali, setiap kali sama terkejutnya bahwa garis hidup tidak melekat.
conny
12
@ Thomas: Ya; git pulladalah git fetch+ git merge.
Michelle Tilley
9
Ini terlihat bagus, tetapi apakah ada cara untuk melakukannya secara global, untuk semua cabang, daripada harus mengaturnya untuk setiap cabang?
bwinton
33
Waspadalah terhadap naga. Opsi ini berbahaya seperti yang dikatakan @Thomas ... Setiap tarikan git menciptakan gabungan komit. git pull --ff tidak mengesampingkan opsi gabungan = no-ff dalam konfigurasi git.
Dalibor Filus
15
Bagaimana jika saya bosan mengetik git merge --no-ff (branchname)? Dan saya ingin git pullberfungsi seperti biasanya?
Dogweather
341

Tampaknya masih ada pertanyaan yang menunggu di utas: Bagaimana melakukannya secara global (yaitu untuk semua cabang)? Untuk catatan, kita dapat menggunakan yang berikut ini:

git config --add merge.ff false

... untuk membuatnya berlaku untuk semua cabang di repositori saat ini. Untuk membuatnya berlaku untuk semua cabang di semua repositori di mana seseorang belum menjalankannya tanpa --globalopsi (pengaturan lokal menimpa global) jalankan ini:

git config --global --add merge.ff false

Dari dokumentasi :

merge.ff
Secara default, git tidak membuat komit gabungan tambahan saat menggabungkan komit yang merupakan turunan dari komit saat ini. Alih-alih, ujung cabang saat ini diteruskan dengan cepat. Ketika disetel ke false, variabel ini memberitahu git untuk membuat komit gabungan tambahan dalam kasus seperti itu (setara dengan memberikan --no-ffopsi dari baris perintah). Ketika diatur hanya, hanya penggabungan maju-cepat yang diizinkan (setara dengan memberikan --ff-onlyopsi dari baris perintah).

Eric Platon
sumber
18
Catatan: merge.ffdiperkenalkan di Git 1.7.6. Itu tidak efektif di versi yang lebih lama.
Chris Johnsen
2
Untuk orang yang menggunakan Git 1.7.6, ini adalah solusi terbaik dan paling sederhana.
Ryan Lundy
22
Saya menggunakan ini bersama-sama dengan aliaspuff = "pull --ff --ff-only"
stigi
11
Theres juga (sekarang, lihat git-scm.com/docs/git-config ) opsi pull.ff yang dapat disetel hanya , yang akan melakukan hal yang sama seperti alias.
jotomo
1
Terima kasih, @jotomo. Fitur itu tersedia dari Git v2.0.0 (dari commit b814da891e8261b909fc5d9fb07b4e8b13989c2d).
Eric Platon
14

Membaca utas jawaban saya akhirnya menggunakan dua opsi berikut

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

Hanya terkait longgar, saya juga menemukan pengaturan ini menghindari masalah saat menarik

git config --global pull.rebase true # set up pull to rebase instead of merge
bastian
sumber
1
git config --global pull.rebase true # notice 'true' di akhir baris
zowers
Terima kasih @zower, saya telah memperbaiki ini
bastian