Rebasing cabang jarak jauh di Git

135

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 pullmelakukan trik tetapi menyebabkan gabungan komit yang ingin saya hindari. Saya khawatir bahwa pesan menyatakan feature -> featuredaripada feature -> origin/featuretetapi 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.

kfb
sumber
Saya memiliki masalah yang sama. Saya ingin memulai model rebase cabang ( seperti ini ). Lalu saya perhatikan bahwa saya membuat kesalahan: Jika Anda ingin melakukan rebase (Anda seharusnya tidak mendorong perubahan Anda ke fitur jarak jauh sebelum Anda melakukan rebase ke master) Jadi Anda melakukan beberapa kode pada fitur Anda. Dan sekarang Anda ingin mendorongnya ke fitur jarak jauh Anda. Bevor Anda melakukan ini: -Anda harus mengambil dan menarik tuanmu jika perlu. -Anda harus rebase ke master jika ada beberapa perubahan pada master yang tidak Anda miliki di fitur Anda. Sekarang Anda dapat mendorong fitur dan tidak akan ada masalah.
Markus

Jawaban:

185

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:

git push origin feature -f

Namun, jika orang lain sedang mengusahakannya, Anda harus bergabung dan tidak rebase dari master.

git merge master
git push origin feature

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.

Adam Dymitruk
sumber
29
+1 untuk if others are working on it, you should merge and not rebase off of master, rebase lebih baik digunakan hanya di cabang pribadi.
Hendra Uzia
6
alternativ to git push origin feature -jika Anda juga bisa menghapus fitur jarak jauh dan fitur push lagi
Markus
2
Menggabungkan master ke cabang Anda akan membuat komit penggabungan dan akan menyebabkan konflik dengan cabang fitur terbuka lainnya dari master setelah perubahan Anda didorong.
Steven
+1 untuk 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.
Enagra
33

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.

ralphtheninja
sumber
Diturunkan untuk bahasa yang buruk: meta.stackexchange.com/questions/22232/…
Powers
1
Diperbarui bahasa saya.
ralphtheninja
5

Karena Anda memunculkan kembali featuredi atas yang baru master, lokal Anda featuretidak maju cepat origin/featurelagi. Jadi, saya pikir, baik-baik saja dalam hal ini untuk mengesampingkan pemeriksaan maju-cepat dengan melakukan git push origin +feature. Anda juga dapat menentukan ini di konfigurasi Anda

git config remote.origin.push +refs/heads/feature:refs/heads/feature

Jika orang lain bekerja di atas origin/feature, mereka akan terganggu oleh pembaruan paksa ini. Anda dapat menghindari itu dengan menggabungkan yang baru masterke dalam featurealih-alih rebasing. Hasilnya memang akan menjadi maju cepat.

Tilman Vogel
sumber
1

Anda dapat menonaktifkan pemeriksaan (jika Anda benar-benar yakin tahu apa yang Anda lakukan) dengan menggunakan --forceopsi untuk git push.

Andrew Aylett
sumber
15
Masalahnya adalah, saya tidak yakin saya benar-benar tahu apa yang saya lakukan :)
kfb
@r_: Silakan baca jawaban saya. Ini mungkin membantu Anda dalam memahami apa yang Anda lakukan :)
ralphtheninja