Sering dikatakan bahwa, Anda tidak boleh melakukan rebase terhadap komitmen yang telah Anda dorong. Apa artinya itu?
The book ProGit memiliki penjelasan yang baik .
Jawaban spesifik untuk pertanyaan Anda dapat ditemukan di bagian berjudul " The Perils of Rebasing ". Kutipan dari bagian itu:
Saat Anda melakukan rebase, Anda meninggalkan komitmen yang ada dan membuat yang baru yang serupa tetapi berbeda. Jika Anda mendorong komitmen di suatu tempat dan orang lain menariknya ke bawah dan mendasarkannya pada mereka, lalu Anda menulis ulang komitmen tersebut dengan git rebase dan mendorongnya lagi, kolaborator Anda harus menggabungkan kembali pekerjaan mereka dan hal-hal akan menjadi berantakan saat Anda mencoba melakukannya. menarik pekerjaan mereka kembali ke pekerjaan Anda.
Pembaruan:
Berdasarkan komentar Anda di bawah ini, sepertinya Anda mengalami kesulitan dengan alur kerja Git Anda. Berikut beberapa referensi yang mungkin bisa membantu:
gitworkflows
halaman manual: Lihat "Penggabungan Ke atas" dan "Topik Cabang"
git rebase
(--interactive?) Untuk menulis ulang histori itu, ini pasti resep gagal. Di sisi lain, jika saya telah mengubah dasar perubahan tertentu pada topik cabang (dari cabang X) dan mendorongnya, itu normal untuk rebase lagi setelah pengembang lain mengubah cabang topik. Pada dasarnya, saya telah menggunakanmerge
cukup lama, tetapi kami berada dalam perahu yang sama dengan, darwinweb.net/articles/86 dan riwayatnya hampir tidak dapat digunakan.Untuk memahami ini, kita perlu memahami sedikit tentang cara kerja git. Repositori git adalah struktur pohon, di mana simpul dari pohon tersebut terikat. Berikut adalah contoh repositori yang sangat sederhana:
itu memiliki empat komit pada cabang master, dan setiap komit memiliki ID (dalam hal ini, a, b, c, dan d). Anda akan melihat bahwa d saat ini adalah komit (atau HEAD) terbaru dari cabang master.
Di sini, kami memiliki dua cabang: master dan my-branch. Anda dapat melihat bahwa master dan my-branch keduanya berisi komit a dan b, tetapi kemudian mereka mulai menyimpang: master berisi c dan d, sedangkan my-branch berisi e dan f. b dikatakan sebagai "basis gabungan" dari my-branch dibandingkan dengan master - atau lebih umum, hanya "basis". Masuk akal: Anda dapat melihat bahwa my-branch didasarkan pada versi master sebelumnya.
Jadi katakanlah my-branch telah basi, dan Anda ingin memperbaruinya dengan versi master terbaru. Dengan kata lain, my-branch perlu berisi c dan d. Anda bisa melakukan penggabungan, tetapi itu menyebabkan cabang berisi komit penggabungan aneh yang membuat peninjauan permintaan penarikan jauh lebih sulit. Sebagai gantinya, Anda bisa melakukan rebase.
Saat Anda melakukan rebase, git menemukan basis dari cabang Anda (dalam hal ini, b), menemukan semua komit antara basis tersebut dan HEAD (dalam hal ini, e dan f), dan memainkan ulang komit tersebut di HEAD cabang Anda rebasing ke (dalam hal ini, master). Git sebenarnya membuat komit baru yang merepresentasikan seperti apa perubahan Anda di atas master: dalam diagram, komit ini disebut e ′ dan f ′. Git tidak menghapus komit Anda sebelumnya: e dan f tidak tersentuh, dan jika ada yang salah dengan rebase, Anda dapat langsung kembali ke kondisi semula.
Saat banyak orang berbeda mengerjakan sebuah proyek secara simultan, permintaan tarik bisa menjadi basi dengan cepat. Permintaan tarik "lama" adalah permintaan yang tidak lagi diperbarui dengan jalur utama pengembangan, dan perlu diperbarui sebelum dapat digabungkan ke dalam proyek. Alasan paling umum mengapa permintaan tarik menjadi basi adalah karena konflik: jika dua permintaan tarik mengubah baris serupa dalam file yang sama, dan satu permintaan tarik digabung, permintaan tarik yang tidak digabungkan sekarang akan memiliki konflik. Terkadang, permintaan tarik bisa menjadi basi tanpa konflik: mungkin perubahan dalam file yang berbeda dalam basis kode memerlukan perubahan yang sesuai dalam permintaan penarikan Anda untuk menyesuaikan dengan arsitektur baru, atau mungkin cabang dibuat ketika seseorang secara tidak sengaja menggabungkan pengujian unit yang gagal ke cabang master. Terlepas dari alasannya,
sumber
Rebasing menulis ulang sejarah. Jika tidak ada yang tahu tentang sejarah itu, maka itu tidak masalah. Namun, jika sejarah itu diketahui publik, maka penulisan ulang sejarah di Git berfungsi seperti di dunia nyata: Anda memerlukan konspirasi.
Konspirasi sangat sulit untuk disatukan, jadi sebaiknya Anda menghindari rebasing cabang publik sejak awal.
Perhatikan bahwa ada yang contoh konspirasi berhasil:
pu
cabang repositori git Junio C. Hamano ini (repositori resmi dari Git SCM) adalah rebased sering. Cara kerjanya adalah hampir semua orang yang menggunakanpu
juga berlangganan milis pengembang Git, dan fakta bahwapu
cabang tersebut di-rebased dipublikasikan secara luas di milis dan situs web Git.sumber
pu
cabang git.git adalah contoh yang sangat berguna tentang bagaimana menggunakan rebase dalam alur kerja (publik). Bagi mereka yang tidak terbiasa dengannya, ide umumnya adalah untuk me-rebase cabang topik yang tidak memiliki komit dinext
(cabang yang tidak stabil sebelum menggabungkan ke master), kemudian membangun kembalipu
cabang dengan mengatur ulang kenext
, dan menggabungkan semua cabang topik. (Sumber: Dokumentasi / howto / maintain-git.txt git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/… )Sebuah rebase mengubah sejarah repositori Anda. Jika Anda mendorong komitmen ke dunia, yaitu membuatnya tersedia untuk orang lain, dan kemudian Anda mengubah pandangan Anda tentang riwayat komitmen, akan sulit untuk bekerja dengan siapa pun yang memiliki riwayat lama Anda.
Rebase yang dianggap berbahaya adalah gambaran yang bagus, menurut saya.
sumber