Kapan Anda menggunakan git rebase dan bukannya git merge?

Ketika dianjurkan untuk menggunakan git rebase vs. git merge ?

Apakah saya perlu bersatu lagi setelah reboot berhasil?

1330
29 апр. Coocoo4Cocoa didefinisikan pada 29 Apr. 2009-04-29 23:26 '09 pada 11:26 malam 2009-04-29 23:26
@ 15 jawaban

Versi singkat

  • Menggabungkan menerima semua perubahan dalam satu cabang dan menggabungkannya ke cabang lain dalam satu komit.
  • Rebase mengatakan bahwa saya perlu titik di mana saya bercabang untuk pindah ke titik awal yang baru.

Jadi kapan Anda menggunakan salah satunya?

Gabungkan

  • Misalkan Anda membuat cabang untuk mengembangkan fungsi tunggal. Saat Anda ingin mengembalikan perubahan ini ke master, Anda mungkin perlu menggabungkan (Anda tidak peduli untuk menyimpan semua komitmen perantara).

Rebase

  • Skenario kedua adalah jika Anda mulai melakukan pengembangan, dan kemudian pengembang lain membuat perubahan yang tidak terkait. Anda mungkin ingin menarik keluar dan kemudian rebase untuk mendasarkan perubahan Anda pada versi saat ini dari repo.
1018
29 апр. Balas diberikan oleh Rob Di Marco pada 29 Apr. 2009-04-29 23:38 '09 pada 11:38 PM 2009-04-29 23:38

Sederhana, dengan rebase, Anda mengatakan untuk menggunakan cabang lain sebagai basis baru untuk pekerjaan Anda.

Jika Anda memiliki, misalnya, cabang master , dan Anda membuat cabang untuk mengimplementasikan fungsi baru, katakanlah, Anda menyebutnya " cool-feature , maka, tentu saja, cabang utama adalah dasar untuk fungsi baru Anda.

Sekarang pada titik tertentu Anda ingin menambahkan fungsi baru yang Anda terapkan di cabang master . Anda cukup beralih untuk master dan menggabungkan cabang dengan fitur cool-feature :

 $ git checkout master $ git merge cool-feature 

tetapi ini menambahkan komit palsu baru, jika Anda ingin menghindari sejarah spageti, Anda dapat pindah :

 $ git checkout cool-feature $ git rebase master 

dan kemudian menggabungkannya menjadi master :

 $ git checkout master $ git merge cool-feature 

Kali ini, karena utas tema memiliki komit master yang sama dan berkomitmen dengan fungsi baru, penggabungannya hanya akan maju cepat.

316
05 февр. jawabannya diberikan oleh Aldo 'xoen' Giambelluca 05 Feb. 2012-02-05 09:28 '12 pada 9:28 2012-02-05 09:28

Untuk melengkapi jawaban saya sendiri , disebutkan dari TSamper ,

  • reposisi sering kali merupakan ide yang baik sebelum penggabungan, karena idenya adalah Anda mengintegrasikan ke dalam cabang Y pekerjaan cabang B , yang dengannya Anda akan bergabung.
    Tetapi sekali lagi, sebelum penggabungan, Anda menyelesaikan konflik apa pun di cabang Anda (mis. "Rebase", seperti pada "u>B )
    Jika dilakukan dengan benar, penggabungan berikutnya dengan cabang Anda ke cabang B bisa maju cepat.

  • dampak penggabungan >B , yang berarti bahwa merger akan lebih sepele, jika tidak cabang B mungkin lama untuk kembali ke keadaan stabil (saat ketika Anda menyelesaikan semua konflik)


menggabungkan titik setelah menginstal u>

Dalam kasus ketika saya jelaskan, saya menginstal u>B ke cabang saya untuk dapat mereproduksi pekerjaan saya dari titik kemudian dari B , tetapi tetap di cabang saya.
Dalam hal ini, merger masih diperlukan sehingga "pereigravshaya" saya bekerja pada B

Skenario lain ( dijelaskan dalam Git Ready , misalnya) adalah membawa pekerjaan Anda >B melalui rebase (yang menyimpan semua komitmen baik Anda atau bahkan memberi Anda kesempatan untuk memesan u> Dalam hal ini (di mana Anda menginstal u>

Pohon Git default saat kami belum bergabung dan dibangun kembali

2019

258
29 апр. jawabannya diberikan VonC 29 April. 2009-04-29 23:44 '09 pada 11:44 PM 2009-04-29 23:44

Banyak jawaban di sini menyarankan bahwa menggabungkan mengubah semua komit Anda menjadi satu, dan karenanya menyarankan menggunakan rebase untuk menyelamatkan komit Anda. Ini salah. Dan ide yang buruk jika Anda sudah membuat komitmen Anda .

Merger tidak merusak komitmen Anda. Gabung menyimpan sejarah! (lihat saja gitk) Rebase riwayat penulisan u>

Gunakan gabungan - bukan rebase jika Anda sudah mengklik.

Di sini Linus (penulis git) akan mengambil alih . Sangat bagus untuk dibaca. Atau Anda dapat membaca versi saya sendiri dari ide yang sama di bawah ini.

Pulihkan cabang di server utama:

  • berisi kesalahpahaman tentang bagaimana komit dibuat.
  • mencemari master dengan sekelompok komitmen menengah yang mungkin belum diuji dengan baik
  • benar-benar dapat memperkenalkan jeda build untuk komitmen perantara ini karena perubahan yang dibuat untuk mengatasinya, ketika utas asli dibuat dan saat itu dipasang kembali.
  • sulit untuk menemukan tempat yang baik dalam prosedur induk.
  • Menyebabkan stempel waktu untuk berkomitmen untuk tidak bertepatan dengan urutan kronologisnya di pohon. Dengan demikian, Anda akan melihat bahwa komit A mendahului fiksasi B pada master, tetapi komit B pertama kali ditulis oleh penulis. (Apa?!)
  • Ini menciptakan lebih banyak konflik, karena komitmen individu dalam cabang topik dapat mencakup menggabungkan konflik, yang harus diselesaikan secara individual (cerita menceritakan tentang apa yang terjadi dalam setiap transaksi).
  • - sejarah penulisan u>

Sebaliknya, penggabungan utas topik dalam master:

  • menyimpan sejarah di mana utas dibuat, termasuk penggabungan dari ujung ke utas topik, agar tetap terkini. Anda benar-benar mendapatkan ide yang akurat tentang kode apa yang bekerja dengan pengembang ketika mereka dibuat.
  • master pada dasarnya adalah cabang gabungan, dan masing-masing gabungan ini biasanya merupakan "momen baik" dalam sejarah yang aman untuk diperiksa karena di mana cabang tema siap untuk diintegrasikan.
  • semua perbaikan individu dari utas topik disimpan, termasuk fakta bahwa mereka ada di utas topik, jadi menyoroti perubahan ini adalah wajar, dan Anda dapat menggunakannya jika perlu.
  • menggabungkan konflik harus diselesaikan hanya sekali (pada titik gabungan), oleh karena itu, perubahan komit menengah yang dibuat pada utas topik tidak boleh diselesaikan secara independen.
  • dapat dilakukan beberapa kali dengan lancar. Jika Anda mengintegrasikan cabang topik untuk pelatihan berkala, orang-orang dapat terus membangun cabang topik, dan dapat terus digabung secara mandiri.
161
04 февр. Jawabannya diberikan oleh Andrew Arnott pada 04 Feb. 2014-02-04 01:17 '14 pada 1:17 2014-02-04 01:17

Tl; DR

Jika ragu, gunakan gabungan.

Jawaban singkat

Satu-satunya perbedaan antara rebase dan gabungan adalah:

  • Struktur pohon yang dihasilkan dari sejarah (sebagai aturan, hanya terlihat ketika melihat jadwal fiksasi) berbeda (satu memiliki cabang, dan yang lainnya tidak).
  • Penggabungan biasanya membuat komit tambahan (misalnya, simpul di pohon).
  • Menggabungkan dan menginstal u>

Jadi, jawaban singkatnya adalah memilih rebase atau gabung berdasarkan bagaimana Anda ingin cerita Anda terlihat.

Jawaban panjang

Ada beberapa faktor yang perlu dipertimbangkan ketika memilih transaksi untuk digunakan.

Apakah afiliasi yang Anda lakukan perubahan dengan pengembang lain di luar tim Anda (misalnya, open source, publik)?

Jika ya, jangan instal u>git pull --rebase . Ini adalah cara yang baik untuk dengan cepat mengecewakan pengembang lain.

Seberapa mumpuni tim pengembangan Anda?

Rebase adalah operasi yang merusak. Ini berarti bahwa jika Anda tidak menerapkannya dengan benar, Anda mungkin kehi>

Saya bekerja pada tim-tim di mana semua pengembang berasal dari waktu ketika perusahaan dapat membeli staf yang berdedikasi untuk bercabang dan bergabung. Pengembang ini tahu sedikit tentang Git dan tidak ingin tahu banyak. Dalam perintah ini, saya tidak akan mengambil risiko merekomendasikan reboot untuk alasan apa pun.

Apakah utas itu sendiri informasi yang berguna?

Beberapa perintah menggunakan model untuk setiap cabang, di mana setiap cabang adalah fungsi (atau perbaikan, atau fungsi tambahan, dll.). Dalam model ini, cabang membantu mengidentifikasi agregat dari komit terkait. Misalnya, Anda dapat dengan cepat mengembalikan fungsi, mengembalikan gabungan cabang ini (dalam keadilan, ini adalah operasi yang jarang terjadi). Atau membandingkan fungsinya dengan membandingkan dua cabang (lebih umum). Rebase akan menghancurkan cabang, dan itu akan sulit.

Saya juga bekerja pada tim yang menggunakan model untuk setiap pengembang (kami semua ada di sana). Dalam hal ini, cabang itu sendiri tidak mengirimkan informasi tambahan (komit sudah memiliki penulis). Tidak akan ada salahnya ketika me-reboot.

Mungkin Anda ingin mengembalikan merger dengan alasan apa pun?

Pengembalian (seperti dalam kasus pembatalan) dari rebid sangat kompleks dan / atau tidak mungkin (jika rebase memiliki konflik) dibandingkan dengan kembalinya merger. Jika Anda berpikir bahwa ada kemungkinan Anda ingin kembali, gunakan penggabungan.

Apakah Anda bekerja dalam tim? Jika demikian, apakah Anda setuju untuk menerima semua atau tidak sama sekali di utas ini?

Operasi reboot perlu ditarik menggunakan git pull --rebase sesuai. Jika Anda bekerja secara mandiri, Anda dapat mengingat apa yang harus Anda gunakan pada waktu yang tepat. Jika Anda bekerja dalam tim, akan sangat sulit untuk berdamai. Inilah sebabnya mengapa sebagian besar alur kerja rabat merekomendasikan penggunaan rebase untuk semua penggabungan (dan git pull --rebase untuk semua klik).

Mitos umum

Gabungkan riwayat kehancuran (squash berkomitmen)

Dengan asumsi Anda memiliki gabungan berikut:

  B -- C / \ A--------D 

Beberapa orang akan menunjukkan bahwa penggabungan "menghancurkan" sejarah komit, karena jika Anda harus melihat log hanya dari cabang utama (AD), Anda akan kehi>

Jika ini masalahnya, kami tidak akan memiliki pertanyaan seperti ini . Pada prinsipnya, Anda akan melihat B dan C, kecuali jika Anda secara eksplisit meminta mereka untuk tidak melihat (menggunakan orang tua pertama). Sangat mudah untuk mencoba sendiri.

Rebase memungkinkan merger lebih aman / sederhana

Kedua pendekatan bergabung secara berbeda, tetapi tidak jelas bahwa itu selalu lebih baik daripada yang lain, dan mungkin tergantung pada alur kerja pengembang. Misalnya, jika pengembang cenderung membuat reguler (misalnya, mereka dapat melakukan dua kali sehari ketika pindah dari kantor ke rumah), maka mungkin ada banyak komitmen untuk cabang tertentu. Banyak dari komitmen ini mungkin tidak terlihat seperti produk akhir (saya cenderung mengatur u>

Rebase lebih dingin / seksi / lebih profesional

Jika Anda menyukai alias rm ke rm -rf untuk "menghemat waktu", Anda mungkin perlu menginstal u>

Dua sen saya

Saya selalu berpikir bahwa suatu hari nanti saya akan menemukan sebuah skenario di mana Git rebase adalah alat hebat yang memecahkan masalah. Menurut saya, saya menemukan naskah di mana Git reflog adalah alat yang hebat untuk menyelesaikan masalah saya. Saya telah bekerja dengan Git selama lebih dari lima tahun sekarang. Ini tidak terjadi.

Cerita yang tidak berguna tidak pernah menjadi masalah bagi saya. Saya tidak pernah membaca kisah penganiayaan sebagai novel yang mengasyikkan. Dalam kebanyakan kasus, saya butuh cerita, saya akan tetap menggunakan w20> wame atau Git bisect. Dalam hal ini, kehadiran merger sangat berguna bagi saya, karena jika merger memperkenalkan masalah yang memiliki informasi penting bagi saya.

Pembaruan (4/2017)

Saya merasa berkewajiban untuk menyebutkan bahwa saya pribadi mengalah ketika menggunakan rebase, meskipun saran umum saya masih sepadan. Baru-baru ini saya banyak berinteraksi dengan proyek Bahan 2 Angular . Mereka menggunakan rebase untuk menyimpan riwayat perbaikan yang sangat bersih. Ini membuatnya sangat mudah bagi saya untuk melihat bahwa cacat ini sudah diperbaiki, dan apakah komitmen ini termasuk dalam rilis. Ini berfungsi sebagai contoh yang sangat baik tentang penggunaan penerusan panggilan yang tepat.

143
13 апр. jawab diberikan Laju 13 Apr 2016-04-13 05:16 '16 pada jam 5:16 sore 2016-04-13 05:16

Menggabungkan dana: membuat komit baru yang menggabungkan perubahan saya ke tujuan saya.

Rebase berarti: membuat serangkaian komit menggunakan set komit saya saat ini sebagai petunjuk. Dengan kata lain, cari tahu bagaimana perubahan saya akan terlihat jika saya mulai melakukannya sejak saya membangun kembali. Karena itu, setelah menginstal u>

Mengingat ini, mengapa Anda perlu menginstal u>

Namun, jika Anda telah mengklik cabang yang sedang Anda kerjakan, Anda seharusnya tidak membangun kembali, tetapi menggabungkan saja. Untuk cabang yang belum didorong ke atas, instal u>

Lain waktu, ketika Anda ingin menginstal u>git rebase -i <branch/commit/tag>

PEMBARUAN: Anda juga ingin menggunakan rebase ketika menggunakan Git untuk berinteraksi dengan sistem kontrol versi yang tidak mendukung riwayat non-linear (misalnya, operasi yang mengganggu). Saat menggunakan jembatan git -svn, sangat penting bahwa perubahan yang Anda gabungkan kembali ke subversi mewakili daftar perubahan yang konsisten atas perubahan terakhir di trunk. Ini hanya dapat dilakukan dengan dua cara: (1) Secara manual membuat kembali perubahan dan (2) Gunakan perintah rebase, yang berjalan lebih cepat.

UPDATE2: Cara lain untuk memikirkan pengalihan adalah bahwa hal itu memungkinkan Anda untuk mencocokkan tampilan gaya pengembangan Anda dengan gaya yang diadopsi dalam repositori yang Anda komit. Biarkan dikatakan bahwa Anda suka tampil dalam potongan-potongan kecil kecil. Anda memiliki satu perbaikan, untuk memperbaiki kesalahan ketik, satu perbaikan, untuk menghi>

UPDATE3: Does one still need to merge after a successful rebase? Ya, ya Alasannya adalah bahwa rebid pada dasarnya melibatkan komitmen "switching". Seperti yang saya katakan di atas, komit ini dihitung, tetapi jika Anda memiliki 14 komit dari titik cabang, maka, asalkan transposisi Anda tidak berfungsi, Anda akan 14 komit di depan (dari saat Anda mengatur u>

66
05 февр. jawabannya diberikan oleh Carl 05 feb. '12 в 9:47 2012-02-05 09:47