Bagaimana menghindari neraka merge-commit di GitHub / BitBucket

100

Kami berakhir dengan banyak komitmen seperti ini di repo kami:

Merge branch 'master' of bitbucket.org:user/repo

Ini terjadi setiap kali pengembang menyinkronkan garpu lokalnya ke repo level teratas.

Apakah ada cara untuk menghindari neraka komit-gabungan ini dari mengacaukan semua log repo? Bisakah seseorang menghindarinya saat memulai permintaan tarik dengan cara tertentu?

Saya tahu saya dapat melakukan git rebase jika ini dilakukan hanya di VM lokal saya, apakah ada kesetaraan di UI GitHub / BitBucket?

bagaimana kalian melakukannya?

Niklas9
sumber

Jawaban:

135

Cabang Fitur Rebase Sebelum Penggabungan

Jika Anda ingin menghindari menggabungkan komit, Anda perlu memastikan bahwa semua komit dipercepat. Anda melakukan ini dengan memastikan cabang fitur Anda naik pangkat dengan rapi ke garis pengembangan Anda sebelum penggabungan seperti ini:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase juga memiliki banyak flag, termasuk rebasing interaktif dengan -iflag tersebut, tetapi Anda mungkin tidak memerlukannya jika Anda membuat semuanya sesederhana mungkin dan ingin menyimpan semua histori cabang Anda pada penggabungan.

Gunakan --ff-onlyBendera

Selain rebasing, penggunaan --ff-onlyflag akan memastikan bahwa hanya komit maju cepat yang diizinkan. Komit tidak akan dibuat jika itu akan menjadi komit gabungan. Halaman manual git-merge (1) mengatakan:

--ff-only

Menolak untuk menggabungkan dan keluar dengan status bukan nol kecuali HEAD saat ini sudah diperbarui atau penggabungan dapat diselesaikan sebagai percepatan.

Todd A. Jacobs
sumber
1
Ini jawaban yang bagus. Saya menggunakan rebase sesering mungkin. Saya tidak tahu tentang bendera --ff-only. Sangat keren!
Leo Correa
3
Terima kasih atas saran rebase dan --ff-only. Namun, seperti yang dikatakan dalam pertanyaan saya, bagaimana saya bisa melakukan ini dalam UI GitHub / BitBucket?
Niklas9
3
@Niklas Saya cukup yakin Anda perlu menggunakan CLI untuk melakukan apa yang Anda inginkan. GitHub tidak menampilkan kekuatan penuh Git; hanya sebagian dari fitur-fiturnya ditambah beberapa nilai tambah grafis dan jejaring sosial. Semoga berhasil!
Todd A. Jacobs
3
Satu hal yang perlu diperhatikan dengan proses ini adalah, sebelum menggabungkan cabang topik (feature / foo) kembali ke master, sebaiknya master git pull origin (jika menggunakan remote), untuk memastikan cabang master up-to-date . Jika pembaruan ditemukan, pastikan untuk sekali lagi me-rebase master ke cabang topik sebelum menggabungkannya kembali ke master.
chikamichi
19
@CodeGnome jangan menyebutnya "beralih" ke CLI ... pada kenyataannya Anda harus memperingatkan tentang "beralih" ke UI!
Droogans
9

"Todd A. Jacobs" telah menyebutkan "rebase" adalah konsepnya di sini. Ini hanyalah cara yang lebih rinci dalam melakukan sesuatu.

Katakanlah Anda berada di cabang master

$ git branch
  * master

Anda ingin membuat perbaikan, jadi buatlah "cabang tetap" yang bercabang dari master

$ git checkout -b fixbranch

Mungkin Anda akan bekerja selama beberapa hari di cabang ini dan memiliki beberapa komitmen.

Hari di mana Anda ingin mendorong komitmen Anda ke repo master pusat! Checkout master dan dapatkan perubahan terbaru dari repo master pusat

$ git checkout master
$ git pull origin master

Basiskan cabang tetap Anda dengan master untuk memiliki riwayat yang bersih dan menyelesaikan konflik jika ada di repo lokal itu sendiri.

$ git checkout fixbranch
$ git rebase master

Sekarang fixbranch sudah uptodate dengan master pusat, izinkan saya menggabungkan fixbranch ke cabang master

 $ git checkout master
 $ git merge fixbranch

Saya selesai! biarkan saya mendorong master lokal ke master pusat

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Kondal Kolipaka
sumber
Saya menghargai jawaban ini.
lasec0203