OK, saya pikir ini adalah skenario git sederhana, apa yang saya lewatkan?
Saya memiliki master
cabang dan feature
cabang. Saya melakukan beberapa pekerjaan master
, beberapa feature
, dan kemudian beberapa lagi master
. Saya berakhir dengan sesuatu seperti ini (urutan leksikografis menyiratkan urutan komitmen):
A--B--C------F--G (master)
\
D--E (feature)
Saya tidak punya masalah untuk git push origin master
menjaga remote master
diperbarui, atau dengan git push origin feature
(saat aktif feature
) untuk menjaga cadangan jarak jauh untuk feature
pekerjaan saya . Sampai sekarang, kami baik-baik saja.
Tetapi sekarang saya ingin rebase feature
di atas F--G
komit pada tuan, jadi saya git checkout feature
dan git rebase master
. Masih bagus. Sekarang kita punya:
A--B--C------F--G (master)
\
D'--E' (feature)
Masalah: saat saya ingin mem-backup feature
cabang rebased baru dengan git push origin feature
, dorongan ditolak karena pohon telah berubah karena rebasing. Ini hanya dapat diselesaikan dengan git push --force origin feature
.
Saya benci menggunakan --force
tanpa yakin saya membutuhkannya. Jadi, apakah saya membutuhkannya? Apakah rebasing harus menyiratkan bahwa berikutnya push
harus --force
memuaskan?
Cabang fitur ini tidak dibagi dengan pengembang lain, jadi saya tidak punya masalah secara de facto dengan dorongan paksa, saya tidak akan kehilangan data apa pun, pertanyaannya lebih konseptual.
git pull feature-branch
, tarikan ini akan menghasilkan komit gabungan baru (dengan menggabungkan versi lokal dan jauh dari cabang fitur). Jadi, Anda mendapatkan gabungan yang tidak perlu setelah rebasing, atau Anda mendorong dengan--force
.push --force
bukan masalah) untuk menjaga linear komit tetap tanpa penggabungan komit sama sekali.--force-with-lease
seperti yang disarankan @hardev adalah pilihan yang bagusAlih-alih menggunakan -f atau - memaksa pengembang harus menggunakan
Mengapa? Karena memeriksa cabang jarak jauh untuk perubahan yang benar-benar ide yang bagus. Mari kita bayangkan bahwa James dan Lisa sedang bekerja di cabang fitur yang sama dan Lisa telah mendorong sebuah komit. James sekarang mengubah cabang lokalnya dan ditolak ketika mencoba mendorong. Tentu saja James berpikir ini karena rebase dan menggunakan --force dan akan menulis ulang semua perubahan Lisa. Jika James menggunakan - force-with-leasing, ia akan menerima peringatan bahwa ada komitmen yang dilakukan oleh orang lain. Saya tidak melihat mengapa ada orang yang menggunakan --force bukannya --force-with-leasing saat mendorong setelah rebase.
sumber
git push --force-with-lease
telah menyelamatkan saya banyak.--force-with-lease
membahas masalah menggunakan--force
Saya akan menggunakan "checkout -b" dan lebih mudah dimengerti.
ketika Anda menghapus, Anda mencegah untuk mendorong cabang keluar yang berisi ID SHA berbeda. Saya hanya menghapus cabang jarak jauh dalam kasus ini.
sumber
push --force
, jadi hanya cara untuk menghindari repro git--force
. Dengan demikian, saya tidak berpikir ini adalah ide yang bagus - baik repo mengizinkanpush --force
, atau karena alasan yang baik itu menonaktifkannya. Jawaban Nabi lebih tepat jika--force
dinonaktifkan pada repo jarak jauh, karena tidak memiliki risiko kehilangan komit dari pengembang lain atau jika tidak menyebabkan masalah.Salah satu solusi untuk ini adalah melakukan apa yang dilakukan skrip penggabungan msysGit - setelah rebase, gabungkan di kepala lama
feature
dengan-s ours
. Anda berakhir dengan grafik komit:... dan dorongan Anda
feature
akan menjadi maju cepat.Dengan kata lain, Anda dapat melakukan:
(Tidak diuji, tapi saya pikir itu benar ...)
sumber
git rebase
(alih-alih menggabungkanmaster
kembali ke cabang fitur Anda) adalah membuat histori linear yang bersih. Dengan pendekatan Anda, sejarah menjadi semakin buruk. Dan karena rebasing membuat komit baru tanpa referensi ke versi sebelumnya, saya bahkan tidak yakin bahwa hasil penggabungan ini akan memadai.merge -s ours
adalah bahwa itu secara buatan menambahkan referensi induk ke versi sebelumnya. Tentu, sejarahnya tidak kelihatan bersih, tetapi si penanya tampaknya sangat terganggu karena harus memaksakan doronganfeature
cabang, dan ini berhasil. Jika Anda ingin rebase, ini lebih atau kurang satu atau yang lain. :) Lebih umum, saya pikir itu menarik bahwa proyek msysgit melakukan ini ....ours
strategi sebelumnya, tetapi saya pikir itu hanya berlaku untuk situasi konflik dengan secara otomatis menyelesaikannya menggunakan perubahan di cabang kami. Ternyata kerjanya berbeda. Dan bekerja dengan cara itu sangat berguna jika Anda memerlukan versi rebased (misalnya, untuk repo maintainer menerapkannya dengan bersihmaster
) tetapi ingin menghindari memaksakan dorongan (jika banyak ppl lain karena alasan tertentu menggunakan cabang fitur Anda).Mungkin atau mungkin tidak ada kasus bahwa hanya ada satu pengembang di cabang ini, yaitu sekarang (setelah rebase) tidak sejalan dengan asal / fitur.
Karena itu saya menyarankan untuk menggunakan urutan berikut:
Ya, cabang baru, ini harus menyelesaikan ini tanpa --force, yang saya pikir umumnya adalah kelemahan utama git.
sumber
Cara saya menghindari dorongan gaya adalah dengan membuat cabang baru dan melanjutkan pekerjaan pada cabang baru itu dan setelah beberapa stabilitas, hapus cabang lama yang telah direstrukturisasi:
sumber
Yang lain telah menjawab pertanyaan Anda. Jika Anda rebase cabang, Anda harus memaksa untuk mendorong cabang itu.
Rebase dan repositori bersama umumnya tidak cocok. Ini adalah penulisan ulang sejarah. Jika orang lain menggunakan cabang itu atau telah bercabang dari cabang itu maka rebase akan sangat tidak menyenangkan.
Secara umum, rebase bekerja dengan baik untuk manajemen cabang lokal. Manajemen cabang jarak jauh bekerja paling baik dengan penggabungan eksplisit (--no-ff).
Kami juga menghindari penggabungan master ke cabang fitur. Alih-alih, kami rebase menjadi master tetapi dengan nama cabang baru (mis. Menambahkan akhiran versi). Ini menghindari masalah rebasing di repositori bersama.
sumber
Apa yang salah dengan
git merge master
difeature
cabang? Ini akan mempertahankan pekerjaan yang Anda miliki, sambil tetap memisahkannya dari cabang jalur utama.Sunting: Ah maaf tidak membaca pernyataan masalah Anda. Anda akan membutuhkan kekuatan saat Anda melakukan a
rebase
. Semua perintah yang mengubah riwayat akan membutuhkan--force
argumen. Ini adalah cara yang gagal untuk mencegah Anda kehilangan pekerjaan (yang lamaD
danE
akan hilang).Jadi, Anda melakukan apa
git rebase
yang membuat pohon itu terlihat (meskipun sebagian disembunyikanD
danE
tidak lagi dalam cabang bernama):Jadi, ketika mencoba untuk mendorong
feature
cabang baru Anda (denganD'
danE'
di dalamnya), Anda akan kehilanganD
danE
.sumber
Bagi saya langkah-langkah mudah berikut berfungsi:
Setelah melakukan semua hal di atas, kita dapat menghapus cabang myFeature juga dengan mengikuti perintah:
sumber
Berikut ini berfungsi untuk saya:
git push -f origin branch_name
dan itu tidak menghapus kode saya.
Tetapi, jika Anda ingin menghindari ini maka Anda dapat melakukan hal berikut:
maka Anda dapat memilih semua komitmen Anda ke cabang baru.
git cherry-pick COMMIT ID
dan kemudian dorong cabang baru Anda.sumber
-f
adalah alias untuk--force
, yang merupakan pertanyaan yang coba dihindari jika mungkin.Karena OP memang memahami masalahnya, hanya mencari solusi yang lebih baik ...
Bagaimana ini sebagai praktik?
Miliki cabang pengembangan fitur yang sebenarnya (di mana Anda tidak pernah rebase dan memaksa, jadi sesama pengembang fitur Anda tidak membenci Anda). Di sini, secara teratur ambil perubahan itu dari main dengan penggabungan. Sejarah Messier , ya, tapi hidup itu mudah dan tidak ada yang terganggu dalam karyanya.
Memiliki cabang pengembangan-fitur yang kedua, di mana satu anggota tim pengawas fitur mendorong semua fitur berkomitmen untuk, memang diubah, memang dipaksa. Jadi hampir bersih berdasarkan komit master yang cukup baru. Setelah fitur lengkap, dorong cabang itu di atas master.
Mungkin sudah ada nama pola untuk metode ini.
sumber