Apakah salah dengan git mendorong cabang?

11

Ketika saya sedang bekerja pada cabang fitur, saya cenderung ingin membersihkan komit di cabang menggunakan rebase interaktif sebelum pekerjaan saya ditinjau dan diintegrasikan di cabang utama.

Selama pengembangan fitur, saya ingin mendorong pekerjaan antara saya ke repositori jarak jauh sebagai ukuran cadangan. Yaitu ketika hard drive saya crash, saya tidak ingin seluruh cabang fitur saya hilang.

Namun, ini mengarah pada fakta bahwa saya sering harus melakukan git push --forceke repositori jarak jauh setelah rebase, suatu tindakan yang umumnya disukai. Atau seperti yang dikatakan halaman github:

Karena mengubah riwayat komit Anda dapat mempersulit orang lain menggunakan repositori, itu dianggap praktik yang buruk untuk mengubah komitmen ketika Anda sudah mendorong ke repositori.

Apakah ada kebijakan (yang diterima secara umum) yang menyelesaikan konflik ini?

Mengapa ini bukan duplikat Apakah git "Peraturan Emas untuk Rebasing" begitu penting?

Pertanyaan saya di sini meminta kebijakan untuk menyelesaikan konflik antara keinginan untuk membackup pekerjaan Anda di repositori jarak jauh dan memoles kembali pekerjaan Anda , sementara pertanyaan lain mencoba menyangkal bahwa ada konflik dan bertanya mengapa beberapa orang berpikir konflik itu ada, dan dengan demikian bertanya mengapa "sangat penting" untuk tidak mendorong kekuatan kembali?

Chiel ten Brinke
sumber
1
Duplikat yang mungkin dari Apakah git "Aturan Emas untuk Rebasing" begitu penting?
gbjbaanb
1
@ gbjbaanb jika Anda membuat komit WIP, rebase sangat berguna untuk menghindari komit banyak untuk satu hari kerja. Saya sering membuat komitmen untuk perubahan kecil jadi saya memiliki opsi "batalkan ke keadaan saya ingat" jika diperlukan - sebagian besar tidak relevan / berisik dengan sejarah utama repo (itulah sebabnya rebase sangat berguna).
enderland
1
@ gbjbaanb Itu masalah pendapat saya pikir. Banyak tim menggunakan strategi rebasing untuk menjaga sejarah mereka tetap bersih.
Chiel ten Brinke
1
@enderland semua orang menginginkan sejarah yang cantik, masih merupakan hal yang salah (dan berbahaya) untuk dilakukan seperti yang ditunjukkan oleh tautan. Seharusnya Torvalds tidak memasukkannya ke dalam, ia seharusnya membiarkan komit untuk "dikompresi" sebagai gantinya.
gbjbaanb
1
@ Gbjbaanb tapi ... dia tidak, dan jadi kita harus bekerja dengan apa yang kita miliki. Bagi saya itu jauh lebih berguna untuk memiliki satu komit pada cabang master daripada 30+ individu dan komitmen tambahan dari setiap cabang fitur. Tetapi setiap orang akan memiliki alur kerja yang berbeda, saya kira ...
enderland

Jawaban:

5

Pertanyaan kunci untuk ditanyakan pada diri sendiri:

  • Apakah Anda menjaga cabang jarak jauh Anda setelah bergabung kembali ke master?

Jika Anda menghapus cabang fitur jarak jauh Anda setelah bergabung ke master, Anda sudah kehilangan sejarah. Dengan asumsi Anda squash / rebase cabang sebelum membuat merger / PR Anda, Anda kehilangan sejarah ini. Semua dorongan kekuatan Anda lakukan dalam hal ini memungkinkan Anda untuk menggunakan github sebagai cadangan.

Situasi di mana Anda ingin menyimpan sejarah dan tidak memaksakan push adalah jika cabang jarak jauh Anda bertahan setelah digabung dan tidak hanya ada untuk jangka waktu sementara.

Saya kira Anda bertanya apakah saya akan tetap menggunakan ranting yang tidak direferensikan? Tidak, AFAIC. Namun, push force mungkin secara teoritis mengakibatkan hilangnya komitmen dari pengguna lain yang mendorong ke cabang yang sama

Sepertinya Anda memiliki banyak orang yang mendorong ke cabang itu secara bersamaan. Ini berarti Anda melakukan peduli tentang sejarah di cabang.

Apa yang bisa Anda lakukan sebagai gantinya antara pekerjaan menengah adalah membuat garpu cabang itu. Anda dapat mendorong ini dan kemudian mengubah semua komit Anda menjadi satu komit sebelum penggabungan, jadi ketika Anda menggabungkannya ke dalam cabang-fitur Anda, Anda hanya memiliki 1 komit (dengan sejarah rebased seluruh cabang Anda).

enderland
sumber
"Apakah kamu menjaga cabang jarak jauhmu setelah bergabung kembali ke master?" Saya kira Anda bertanya apakah saya akan tetap menggunakan ranting yang tidak direferensikan? Tidak, AFAIC. Namun, push force mungkin secara teoritis mengakibatkan hilangnya komitmen dari pengguna lain yang mendorong ke cabang yang sama.
Chiel ten Brinke
@ChieltenBrinke Saya mengedit sedikit tentang itu. FYI
enderland
Saya pikir bahwa bercabang sebagai langkah untuk mencegah penghancuran komitmen ketika push force sebenarnya adalah saran yang sangat bagus. Tetapi AFAIK sebenarnya bukan konsep git, dan Anda membutuhkan pembungkus layanan untuk melakukan ini dengan mudah (seperti github). Apakah saya benar tentang itu? Atau mungkin saya salah mengira Anda menggunakan istilah "forking" hanya dengan membuat cabang terpisah?
Chiel ten Brinke
@ChieltenBrinke baik Anda dapat mencapai hal yang sama dalam berbagai cara. Jika cabang fitur Anda ada di repositori jarak jauh, Anda dapat melakukan fork repo dan memiliki versi cabang itu. Dan kemudian gabungkan cabang itu ke cabang jauh Anda setelah melakukan squashing. Atau Anda bisa membuat cabang lokal yang berbeda (mungkin featurebranch-local) dan kemudian melakukan dev aktif di cabang itu, dengan banyak komitmen yang Anda inginkan. Setelah Anda ingin menggabungkan, tekan komit itu dan kemudian gabungkan ke dalam fitur. Pada dasarnya hanya melakukan dev di cabang sementara yang sebenarnya dan kemudian menekan / menggabungkan ke fitur Anda.
enderland
Dengan anggapan bahwa forking repo adalah pilihan karena seseorang tidak menggunakan github, kami akan bekerja dengan develop-featurecabang "pribadi" . Tentu saja kerahasiaan murni berdasarkan konvensi dan tidak ditegakkan oleh apa pun, tetapi dapat menjadi bagian dari kebijakan, terutama jika konvensi penamaan cabang tertentu diperkenalkan untuk ini. (Mungkin saya terlalu cemas sekarang, mungkin tidak :) Kombinasi dengan --force-with-leasetidak ada salahnya, meskipun tidak harus diandalkan, seperti yang ditunjukkan dalam posting saya yang lain.
Chiel ten Brinke
3

Saya mendaftar beberapa kemungkinan di sini yang terlintas di benak saya.

Selalu rebase di cabang baru

Saat memiliki cabang yang berantakan some-feature, rebase di cabang baru. Misalnya

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

Kemudian telah some-feature-rebaseditinjau dan terintegrasi.

Masalah: Kelemahan besar di sini adalah bahwa, sebenarnya, Anda memerlukan cabang baru untuk setiap rebase. (Anda bisa mendapatkan beberapa rebases jika Anda membuat perubahan setelah ulasan kode, misalnya)

Menggunakan git push --force-with-lease

Saya baru belajar tentang git push --force-with-leasealternatifgit push --force , yang

menolak untuk memperbarui cabang kecuali itu adalah keadaan yang kami harapkan; yaitu tidak ada yang memperbarui cabang hulu.

Masalah : Hal ini tampaknya membaik secara langsung pada situasi di mana kami menggunakan hanya --force, tetapi masih memiliki beberapa peringatan, terutama ketika saya melakukan git fetchalih - alih git pull, yang memperbarui cabang-cabang hulu lokal kami, menipu --force-with-leaseberpikir bahwa tidak ada perubahan yang tak terhapuskan dibuat pada remote cabang.

Chiel ten Brinke
sumber