Bagaimana cara membuat Git pull use rebase secara default untuk semua repositori saya?

186

Apakah ada cara untuk mengatur repositori host Git sedemikian rupa sehingga ada yang git pulldilakukan dari klon (lokal) yang digunakan --rebasesecara default? Dengan mencari di Stack Overflow, saya belajar tentang branch.autosetuprebase, tetapi perlu dikonfigurasi per klon secara individual.

Aliran proyek saya sudah diatur sedemikian rupa sehingga kita pullyang developcabang sebelum mergeing cabang fitur untuk itu. Ini pullhampir selalu menggunakan --rebase, jadi saya mencoba mencari tahu apakah ini bisa menjadi default.

Pria bertopeng
sumber
6
Mengapa kamu menginginkan itu? Saya pikir lebih masuk akal untuk mengajarkan para pengguna untuk secara aktif memikirkan kasus mana yang akan lebih sesuai (berdasarkan besarnya perubahan yang mereka buat atau harapkan dari hulu) '
Jonas Schäfer
4
@JonasWielicki Ya, saya setuju. Hanya beberapa anggota tim saya yang baru mengenal Git, dan saya ingin tahu apakah ada cara untuk menegakkannya untuk menghindari masalah selama fase awal (sampai mereka mempelajarinya). Tim juga bekerja jarak jauh di zona waktu yang berbeda, yang berarti mereka akan mandek selama beberapa jam jika terjadi kesalahan. Hanya ingin tahu apakah ini mungkin.
Masked Man
1
Saya pikir terutama untuk pengaturan awal, lebih baik untuk menggabungkan. Rebase membuat banyak hal aneh jika kode Anda benar-benar berbeda. Anda harus menyelesaikan konflik yang sama berulang-ulang sampai Anda mendorong. Jadi, jika seorang anggota tim ingin mengerjakan beberapa kode, selalu menggunakan rebase dan tidak mendorong sampai selesai (yang mungkin dilakukan pendatang baru, alih-alih bercabang sendiri), mereka akan dihadapkan dengan konflik yang sama yang telah mereka selesaikan X kali sudah .
Jonas Schäfer
3
@JonasWielicki Para anggota tim melakukan membuat cabang baru untuk setiap fitur baru mereka bekerja pada (dan ini, mereka sudah mengerti cukup baik). Kebutuhan untuk rebase muncul karena pengembang lain telah berkomitmen untuk mengembangkan cabang "jarak jauh" pada saat ia siap untuk mendorong perubahannya. Oleh karena itu, saya ingin dia melakukan rebase dari jarak jauh sebelum mendorong perubahannya. Proyek itu sendiri cukup matang, hanya tim yang baru. :) Jadi ini adalah "pengaturan awal" hanya dalam hal orang. Apa saran Anda untuk skenario ini?
Masked Man
5
Membalas komentar pertama Anda, dalam sebagian besar kasus (hampir semua), rebase adalah pilihan yang tepat, karena dibutuhkan banyak waktu untuk menguji fitur baru secara menyeluruh, dll. Pada saat itu dilakukan, pasti akan ada banyak komitmen dari pengembang lain.
Masked Man

Jawaban:

205

Sekarang ada 3 level konfigurasi untuk perilaku tarikan default. Dari yang paling umum hingga yang berbutir halus, mereka adalah:

1. pull.rebase

Mengatur ini trueberarti git pullselalu setara dengan git pull --rebase(kecuali jika branch.<branchname>.rebasediatur secara eksplisit ke false). Ini juga dapat diatur per repositori atau secara global.

2. branch.autosetuprebase

Mengatur ini alwaysberarti bahwa setiap kali cabang pelacakan dibuat, entri konfigurasi seperti yang di bawah ini akan dibuat untuknya. Untuk kontrol berbutir halus, ini juga dapat diatur ke never, localatau remotedan dapat diatur per repositori atau secara global. Lihat git config --helpuntuk keterangan lebih lanjut.

3. branch.<branchname>.rebase

Pengaturan ini trueberarti bahwa cabang tertentu akan selalu menarik dari hulu melalui rebasing, kecuali git pull --no-rebasedigunakan secara eksplisit.

Kesimpulan

Jadi, sementara Anda tidak dapat mengubah perilaku default untuk semua klon repositori di masa depan, Anda dapat mengubah default untuk semua repositori pengguna saat ini (yang ada dan yang akan datang) melalui git config --global pull.rebase true.

Parker Coates
sumber
4
Terimakasih atas tanggapan Anda. Saya sedang mengeksplorasi jika saya dapat memiliki pengaturan sehingga siapa pun yang mengkloning repositori mengaktifkannya secara default. Pengaturan di atas akan disimpan ~/.gitconfig, yang berarti setiap pengembang yang mengkloning repositori host perlu menjalankan perintah. Tidak mengeluh tentang solusi Anda. Itu bagus, saya hanya ingin memastikan saya mengerti maksud Anda dengan benar.
Masked Man
Terima kasih atas jawabannya. Memang terlihat seperti ini sedekat yang bisa didapat.
Masked Man
139

Bagaimana tentang

git config --global pull.rebase true

Ini akan memberitahu git untuk selalu menarik dengan rebase.

mackuntu
sumber
3
Terima kasih, ini berfungsi baik untuk cabang pelacakan yang ada.
Fls'Zen
1
Harap hapus --bool, itu tidak perlu
diralik
38

Jawabannya adalah tidak.

Tidak ada cara untuk mengatur repositori jarak jauh sehingga setiap orang yang mengkloningnya memiliki perilaku default yang git pulldiubah.

Anda bisa, bagaimanapun, mengatur kait sisi server yang memeriksa bahwa tidak ada yang mendorong gabungan melakukan ( sesuatu seperti ini , mungkin).

Ada juga beberapa opsi konfigurasi yang mungkin menarik bagi Anda. Semua pengembang yang mengkloning dari repositori jarak jauh harus mengaturnya sendiri secara manual.

1. Opsi branch.<name>.rebase

Anda dapat mengonfigurasi cabang lokal untuk selalu menggunakan --rebase, seperti ini, mengganti <name>dengan nama cabang:

git config branch.<name>.rebase true

Setelah menjalankan ini master, masterbagian dalam .git/configtampak seperti ini:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Opsi branch.autosetuprebase

Menjalankan perintah konfigurasi sebelumnya untuk setiap cabang Git bisa merepotkan, jadi Anda bisa mengonfigurasi Git untuk mengaturnya secara otomatis untuk setiap cabang baru:

git config branch.autosetuprebase always

(Anda juga dapat menentukan never, remotedan local, melihat man git-configuntuk rincian.)

Tanpa --globalopsi, konfigurasi disimpan .git/config, dan hanya repositori saat ini yang terpengaruh. Dengan --global, konfigurasi disimpan ke ~/.gitconfig, dan setiap repositori yang tidak dikonfigurasi terpengaruh.

Opsi ini tidak memengaruhi cabang yang sudah ada.

3. Opsi pull.rebase

git config --bool pull.rebase true

(Anda juga bisa memberikannya --globalopsi.)

Jika opsi ini benar, menjalankan git pullsetara dengan git pull --rebase, kecuali jika branch.<name>.rebasetelah diatur ke false.

Flimm
sumber
3

Ini menjadikan --rebaseopsi sebagai default saat mengeluarkan git pull pada cabang tertentu.

@ Flimm, saya perlu menambahkan trueuntuk membuat opsi pertama Anda berfungsi.

Jadi sintaks yang benar adalah:

git config branch.<branch>.rebase true

Untuk menjalankan perintah ini di developcabang:

git config branch.develop.rebase true

Dan sekarang developbagian dalam .git/configterlihat seperti ini:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true
Daishi
sumber
Terima kasih, saya sudah mengedit jawaban saya, di masa depan, silakan mengedit sendiri jawabannya.
Flimm
2
Donwvoter, siapa pun Anda, tolong jelaskan alasan Anda. Menunduk tanpa komentar sepertinya benar-benar sewenang-wenang dan tidak konstruktif bagi saya.
Daishi
1

Saat ini tidak ada cara untuk mengatur kebijakan default untuk repositori.

Jika Anda menginginkannya sendiri dan Anda menggunakan setidaknya git 1.7.9, Anda dapat secara global mengatur pull.rebasekonfigurasi sebagai berikut:

git config --global pull.rebase true

Tetapi Anda harus melakukannya di setiap mesin. Salah satu opsi bisa dengan mengkonfigurasi templat / kerangka rumah pengguna default dengan opsi itu. Namun, pengguna dapat mengubah opsi itu.

Jika Anda tidak ingin gabungan, Anda bisa menentukan kait sisi server untuk menolak dorongan dengan gabungan.

Untuk referensi Anda, ini adalah dokumentasi sumber untuk pull.rebase:

Ketika benar, rebase cabang di atas cabang yang diambil, alih-alih menggabungkan cabang default dari jarak jauh default saat "git pull" dijalankan. Lihat "branch..rebase" untuk mengatur ini berdasarkan per cabang.

Saat menggabungkan, berikan opsi --rebase-merge untuk git rebase sehingga komit gabungan lokal dimasukkan dalam rebase (lihat git-rebase untuk detailnya).

Saat mempertahankan, berikan juga --preserve-merge bersama untuk git rebase sehingga komitmen gabungan yang berkomitmen tidak akan diratakan dengan menjalankan git pull.

Ketika nilainya interaktif, rebase dijalankan dalam mode interaktif.

CATATAN: ini adalah operasi yang mungkin berbahaya; jangan menggunakannya kecuali Anda memahami implikasinya (lihat git-rebase untuk detailnya).

David
sumber