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.


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.


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).


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

1
git config --global pull.rebase true # notice 'true' di akhir baris
zowers

Terima kasih @zower, saya telah memperbaiki ini
bastian
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.