Saya menggunakan repositori Git perantara untuk mencerminkan repositori SVN jarak jauh, dari mana orang dapat mengkloning dan mengerjakannya. Repositori perantara memiliki cabang masternya direproduksi malam dari SVN hulu, dan kami sedang mengerjakan cabang fitur. Sebagai contoh:
remote:
master
local:
master
feature
Saya berhasil mendorong cabang fitur saya kembali ke jarak jauh, dan berakhir dengan apa yang saya harapkan:
remote:
master
feature
local:
master
feature
Saya kemudian mengatur ulang cabang untuk melacak remote:
remote:
master
feature
local:
master
feature -> origin/feature
Dan semuanya baik-baik saja. Apa yang ingin saya lakukan dari sini adalah rebase cabang fitur ke cabang master pada remote, tetapi saya ingin melakukan ini dari mesin lokal saya. Saya ingin dapat melakukan:
git checkout master
git pull
git checkout feature
git rebase master
git push origin feature
Agar cabang fitur remote selalu terbarui dengan master jarak jauh. Namun, metode ini menyebabkan Git mengeluh:
To <remote>
! [rejected] feature -> feature (non-fast-forward)
error: failed to push some refs to '<remote>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again. See the
'Note about fast-forwards' section of 'git push --help' for details.
git pull
melakukan trik tetapi menyebabkan gabungan komit yang ingin saya hindari. Saya khawatir bahwa pesan menyatakan feature -> feature
daripada feature -> origin/feature
tetapi ini mungkin hanya hal presentasi.
Apakah saya melewatkan sesuatu, atau melakukan hal ini dengan cara yang sepenuhnya salah? Itu tidak penting untuk menghindari melakukan rebase pada server jauh, tetapi itu membuat memperbaiki konflik penggabungan dari rebase jauh lebih sulit.
Jawaban:
Ini tergantung pada apakah fitur tersebut digunakan oleh satu orang atau jika orang lain tidak menggunakannya.
Anda dapat memaksakan dorongan setelah rebase jika hanya Anda:
Namun, jika orang lain sedang mengusahakannya, Anda harus bergabung dan tidak rebase dari master.
Ini akan memastikan bahwa Anda memiliki sejarah yang sama dengan orang-orang yang bekerja sama dengan Anda.
Pada level yang berbeda, Anda seharusnya tidak melakukan back-merge. Apa yang Anda lakukan adalah mencemari riwayat cabang fitur Anda dengan komitmen lain yang bukan milik fitur tersebut, membuat pekerjaan selanjutnya dengan cabang itu lebih sulit - rebasing atau tidak.
Ini adalah artikel saya tentang subjek yang disebut cabang per fitur .
Semoga ini membantu.
sumber
if others are working on it, you should merge and not rebase off of master
, rebase lebih baik digunakan hanya di cabang pribadi.git push origin feature -f
. Dalam konteks tertentu mungkin perlu melakukan rebase bahkan dengan cabang yang jauh. Intinya adalah mengetahui apa yang Anda lakukan. Dan kita harus mengambil alih bahwa Anda mungkin menghapus komit dalam repo jarak jauh.Senang bahwa Anda mengangkat topik ini.
Ini adalah hal / konsep penting dalam git yang akan bermanfaat bagi pengguna git. git rebase adalah alat yang sangat kuat dan memungkinkan Anda untuk menekan komit bersama, menghilangkan komit dll. Tetapi seperti halnya alat yang kuat, Anda pada dasarnya perlu tahu apa yang Anda lakukan atau ada yang salah.
Ketika Anda bekerja secara lokal dan bermain-main dengan cabang lokal Anda, Anda dapat melakukan apa pun yang Anda suka selama Anda belum mendorong perubahan ke repositori pusat. Ini berarti Anda dapat menulis ulang riwayat Anda sendiri, tetapi bukan riwayat orang lain. Dengan hanya bermain-main dengan barang-barang lokal Anda, tidak ada yang akan berdampak pada repositori lain.
Inilah sebabnya mengapa penting untuk diingat bahwa setelah Anda mendorong komit, Anda tidak boleh rebase nanti. Alasan mengapa ini penting, adalah bahwa orang lain mungkin menarik komitmen Anda dan mendasarkan pekerjaan mereka pada kontribusi Anda ke basis kode, dan jika Anda kemudian memutuskan untuk memindahkan konten itu dari satu tempat ke tempat lain (rebase) dan mendorong mereka perubahan, maka orang lain akan mendapat masalah dan harus rebase kode mereka. Sekarang bayangkan Anda memiliki 1000 pengembang :) Itu hanya menyebabkan banyak pengerjaan ulang yang tidak perlu.
sumber
Karena Anda memunculkan kembali
feature
di atas yang barumaster
, lokal Andafeature
tidak maju cepatorigin/feature
lagi. Jadi, saya pikir, baik-baik saja dalam hal ini untuk mengesampingkan pemeriksaan maju-cepat dengan melakukangit push origin +feature
. Anda juga dapat menentukan ini di konfigurasi AndaJika orang lain bekerja di atas
origin/feature
, mereka akan terganggu oleh pembaruan paksa ini. Anda dapat menghindari itu dengan menggabungkan yang barumaster
ke dalamfeature
alih-alih rebasing. Hasilnya memang akan menjadi maju cepat.sumber
Anda dapat menonaktifkan pemeriksaan (jika Anda benar-benar yakin tahu apa yang Anda lakukan) dengan menggunakan
--force
opsi untukgit push
.sumber