Cara rebase cabang lokal dengan master jarak jauh

934

Saya punya proyek kloning dari cabang master dari repositori jarak jauh remote_repo. Saya membuat cabang baru dan saya berkomitmen untuk cabang itu. Pemrogram lain didorong ke remote_repocabang utama.

Sekarang saya perlu rebase RB cabang saya ke remote_repomaster.

Bagaimana cara melakukannya? Apa perintah untuk mengetik ke terminal?

Damir
sumber
14
Bagi saya pertanyaan ini tidak jelas karena "dengan" bisa berarti rebasing di kedua arah. Melihat jawaban yang saya lihat, maksudnya adalah untuk rebase cabang Anda ke master jarak jauh, bukan sebaliknya. Saya menyebutkannya jika seseorang mengikuti jawaban di bawah ini dan mendapatkan kebalikan dari apa yang mereka inginkan.
Glenn Lawrence
8
@ GlennLawrence Saya pikir lebih baik mengedit pertanyaan asli daripada menambahkan komentar. Ini juga didorong oleh stackoverflow. Selain itu, rebasing master ke RB mungkin akan gagal juga, karena RB tergantung pada sejarah master.
daniel kullmann

Jawaban:

1245

Pertama ambil master baru dari repositori hulu, kemudian rebase cabang kerja Anda pada itu:

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

Pembaruan : Silakan lihat jawaban Paul Draper untuk cara yang lebih ringkas untuk melakukan hal yang sama - versi Git terbaru menyediakan cara yang lebih sederhana untuk melakukan yang setara dengan dua perintah di atas.

Frerich Raabe
sumber
16
inilah satu-satunya jawaban yang benar-benar melakukan apa yang diminta
kayaker243
5
@ kayaker243 Tidak, itu sama dengan jawaban Paul Drapers tetapi dalam bentuk panjang, saya pikir.
erik
7
@ erik Perhatikan bahwa Paul Draper menulis jawabannya sekitar setengah tahun setelah komentar kayaker243 (dan hampir dua tahun setelah jawaban ini).
Frerich Raabe
3
Saya mendapatkan yang berikut: Your branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.Sepertinya git pulldibutuhkan yang lain. Apakah ini benar atau saya kehilangan sesuatu di sini?
Dror
2
@RGC Tidak, git rebase mastertidak akan melakukan pekerjaan yang sama dengan perintah kedua ( git rebase origin/master) karena masterdan origin/mastermungkin menunjukkan komit yang berbeda (terutama mengingat bahwa perintah pertama adalah git fetch origin, yang dapat memodifikasi origin/master).
Frerich Raabe
816
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]
Paul Draper
sumber
19
(Setara dengan jawaban Frerich)
Paul Draper
12
bukankah ini sedikit berbeda dari jawaban Frerich, dalam hal ini akan melakukan perubahan dari master asal ke master lokal, sedangkan jawaban Frerich membuat master lokal tidak tersentuh? (tarik vs. ambil)
Jimmy Huch
7
Tidak, dalam jawaban Frerich, rebase memodifikasi master lokal. Tarikan --rebase adalah hal yang sama dengan pengambilan diikuti oleh rebase
adhominem
9
FYI Anda dapat melakukan rebases interaktif dengangit pull --rebase=interactive origin master
emmby
14
@adhominem - Saya memeriksa dokumentasi git-pull , dan saya tidak bisa melihat apa pun yang mendukung klaim bahwa master lokal dimodifikasi. Jika saya di cabang bernama devdan jalankan git pull --rebase origin master, hanya cabang devyang akan dimodifikasi, tidak master. The --rebasedokumentasi bendera menyatakan bahwa ia mencoba untuk rebase the current branch on top of the upstream branch after fetchingdan apa-apa tentang memodifikasi cabang pelacakan lokal.
Reinstate Monica 2331977
227

Setelah melakukan perubahan pada cabang Anda, checkout masterdan tarik untuk mendapatkan perubahan terbaru dari repo:

git checkout master
git pull origin master

Kemudian checkout cabang Anda dan rebase perubahan Anda pada master:

git checkout RB
git rebase master

... atau dua perintah terakhir dalam satu baris:

git rebase master RB

Saat mencoba mendorong kembali ke origin/RB, Anda mungkin akan mendapatkan kesalahan; jika Anda satu-satunya yang bekerja RB, Anda bisa memaksakan dorongan:

git push --force origin RB

... atau sebagai berikut jika Anda telah mengkonfigurasi git dengan tepat:

git push -f
CharlesB
sumber
4
ketika mencoba untuk mendorong kembali ke asal / RB, Anda mungkin akan mendapatkan kesalahan. Jika Anda satu-satunya yang bekerja pada RB, Anda bisa mendapatkan push - force RB asal. sumber: stackoverflow.com/questions/8939977/…
Joey Baruch
1
Ah .... Aku punya ini. "RB" saya direstrukturisasi dengan benar, tetapi saya mendapatkan kesalahan tanpa akhir ketika mencoba mendorongnya setelah rebase. Selain dari push - force asal RB - apakah ada cara "lebih baik" (tidak dipaksa) untuk melakukannya? Saya hanya mencoba memahami persepsi gits di sini - dan gagal.
Motti Shneor
2
@MottiShneor Tidak, tidak ada cara yang baik. Jika ada orang lain yang mendorong ke cabang dalam waktu yang bersamaan, perubahan mereka akan hilang! Jika Anda ingin bersikap baik terhadap sejarah git commit, Anda sebaiknya menggabungkan master ke cabang Anda, yang aman (Anda dapat melakukannya git pushtanpa -f).
daniel kullmann
110

Catatan: Jika Anda sudah memiliki pengetahuan luas tentang rebase maka gunakan di bawah satu liner untuk rebase cepat. Solusi: Dengan asumsi Anda berada di cabang kerja Anda dan Anda adalah satu-satunya orang yang mengerjakannya.

git fetch && git rebase origin/master

Selesaikan konflik apa pun, uji kode Anda, komit dan dorong perubahan baru ke cabang jarak jauh.

                            ~:   For noobs   :~

Langkah-langkah berikut dapat membantu siapa saja yang baru git rebasedan ingin melakukannya tanpa kerumitan

Langkah 1: Dengan asumsi bahwa tidak ada komitmen dan perubahan yang harus dilakukan pada YourBranch pada saat ini. Kami mengunjungi YourBranch.

git checkout YourBranch
git pull --rebase

Apa yang terjadi? Tarik semua perubahan yang dibuat oleh pengembang lain yang bekerja di cabang Anda dan rebase perubahan Anda di atasnya.

Langkah 2: Selesaikan konflik yang muncul.

Langkah 3:

git checkout master
git pull --rebase

Apa yang terjadi? Tarik semua perubahan terbaru dari master jarak jauh dan rebase master lokal di master jarak jauh. Saya selalu menjaga master jarak jauh bersih dan melepaskan siap! Dan, lebih suka bekerja pada master atau cabang secara lokal. Saya sarankan dalam melakukan ini sampai Anda mendapatkan perubahan git atau melakukan. Catatan: Langkah ini tidak diperlukan jika Anda tidak mempertahankan master lokal, sebagai gantinya Anda dapat melakukan pengambilan dan rebase master remote secara langsung di cabang lokal secara langsung. Seperti yang saya sebutkan di langkah tunggal di awal.

Langkah 4: Selesaikan konflik yang muncul.

Langkah 5:

git checkout YourBranch
git rebase master

Apa yang terjadi? Rebase pada master terjadi

Langkah 6: Selesaikan konflik apa pun, jika ada konflik. Gunakan git rebase --continueuntuk melanjutkan rebase setelah menambahkan konflik yang diselesaikan. Kapan saja Anda dapat menggunakan git rebase --abortuntuk membatalkan rebase.

Langkah 7:

git push --force-with-lease 

Apa yang terjadi? Mendorong perubahan pada YourBranch remote Anda. --force-with-leaseakan memastikan apakah ada perubahan masuk lainnya untuk YourBranch dari pengembang lain saat Anda melakukan rebasing. Ini sangat berguna daripada memaksa. Seandainya ada perubahan yang masuk maka ambil mereka untuk memperbarui YourBranch lokal Anda sebelum mendorong perubahan.

Mengapa saya harus mendorong perubahan? Untuk menulis ulang pesan commit di remote YourBranch setelah rebase yang tepat atau Jika ada konflik yang diselesaikan? Maka Anda perlu mendorong perubahan yang Anda selesaikan dalam repo lokal ke repo jarak jauh YourBranch

Yahoooo ...! Anda berhasil menyelesaikan rebasing.

Anda mungkin juga ingin melakukan:

git checkout master
git merge YourBranch

Kapan dan Mengapa? Gabungkan cabang Anda menjadi master jika dilakukan dengan perubahan oleh Anda dan co-developer lainnya. Yang membuat YourBranch diperbarui dengan master ketika Anda ingin bekerja di cabang yang sama nanti.

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~
bh4r4th
sumber
Untuk apa ini: "Tarik semua perubahan terbaru dari master dan rebases master pada master terbaru." Rebase master pada master? Apakah Anda hanya perlu menarik master terbaru?
John Little
@ JohnLittle Terima kasih telah menunjukkan. Maksudku Pulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!. Saya akan memperbarui deskripsi saya.
Bh4r4th
21

Langkah 1:

git fetch origin

Langkah 2:

git rebase origin/master

Langkah 3: (Perbaiki jika ada konflik)

git add .

Langkah 4:

git rebase --continue

Langkah 5:

git push --force
GauthamManivannan
sumber
5
Tidak ada penjelasan untuk cabang mana untuk memulai. Bukan jawaban yang bagus.
Karl Morrison
12

1.Perbarui Master dulu ...

git checkout [master branch]
git pull [master branch]

2. Sekarang rebase sumber-cabang dengan cabang master

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

JIKA cabang sumber belum ada pada remote maka lakukan:

git push -u origin [source branch]

"et voila ..."

N Djel Okoye
sumber
Saya suka sifat langkah demi langkah dari jawaban ini. Ini membantu memecah apa yang sebenarnya terjadi.
Dave Liu
6

git fetch origin master:master menarik versi master terbaru tanpa perlu memeriksanya.

Jadi yang Anda butuhkan adalah:

git fetch origin master:master && git rebase master 👌

Naz
sumber
Tidak git fetchmemperbarui master tanpa perlu memeriksanya juga? Tapi git fetchbukankah git mergepembaruan itu benar? Jadi, jika kami checkout mastertidak akan memiliki pembaruan terbaru. Jadi bukankah lebih pendek untuk dilakukan saat di cabang fitur, kalau git fetchbegitu git rebase origin/master? Kita tidak bisa melakukan itu git rebase masterkarena itu akan mencoba untuk rebase dari masterdi ruang kerja, kita harus origin/masterdapatkan dari yang tidak bergerak tetapi duduk di lokal.
Noitidart