Cara menggabungkan master jarak jauh ke cabang lokal

238

Saya memiliki cabang lokal dari sebuah proyek ("configUpdate") yang telah saya cabut dari proyek orang lain dan saya telah melakukan banyak perubahan di dalamnya dan ingin menggabungkan perubahan yang telah mereka buat ke cabang lokal saya.

Saya sudah mencoba

git pull --rebase origin configUpdate

tetapi belum meraih perubahan terbaru - bagaimana saya bisa menggabungkan keduanya? (juga untuk poin bonus apa yang saya lakukan dengan pull --rebaseperintah?)

Martyn
sumber
Kemungkinan duplikat Git: Gabungkan cabang Remote secara lokal
Michael Freidgeim

Jawaban:

354

Dari cabang fitur Anda (mis. configUpdateJalankan):

git fetch
git rebase origin/master

Atau bentuk yang lebih pendek:

git pull --rebase

Mengapa ini bekerja:

  • git merge branchnamemengambil komit baru dari cabang branchname, dan menambahkannya ke cabang saat ini. Jika perlu, itu secara otomatis menambahkan komit "Gabung" di atas.

  • git rebase branchname mengambil komitmen baru dari cabang branchname , dan memasukkannya "di bawah" perubahan Anda. Lebih tepatnya, itu memodifikasi sejarah cabang saat ini sehingga didasarkan pada ujung branchname, dengan setiap perubahan yang Anda buat di atas itu.

  • git pull pada dasarnya sama dengan git fetch; git merge origin/master .

  • git pull --rebase pada dasarnya sama dengan git fetch; git rebase origin/master .

Jadi mengapa Anda ingin menggunakannya git pull --rebase daripada git pull? Berikut ini contoh sederhana:

  • Anda mulai bekerja pada fitur baru.

  • Pada saat Anda siap untuk mendorong perubahan Anda, beberapa komitmen telah didorong oleh pengembang lain.

  • Jika kamu git pull (yang menggunakan penggabungan), perubahan Anda akan dikubur oleh komit baru, selain komit gabungan yang dibuat secara otomatis.

  • Jika Anda git pull --rebasesebaliknya, git akan memajukan master Anda ke hulu, lalu menerapkan perubahan Anda di atas.

Joey Adams
sumber
Saya melakukan ini pada cabang yang benar, tetapi saya masih dapat melihat perbedaan antara file lokal saya dan cabang master jarak jauh dari proyek asli (meskipun dikatakan semuanya sudah terbaru!) Mungkin saya sudah mengatur proyek dengan salah? Ada cara untuk memeriksa?
Martyn
1
@ Martyn: Perbedaannya haruslah perubahan lokal Anda. Buat cabang lain dari cabang jarak jauh dan periksa apakah cabang itu memiliki konten file yang benar.
ZeissS
4
Saya tahu ini adalah jawaban lama, tetapi perhatikan bahwa Anda mungkin lebih suka melakukan MERGE daripada rebase. Anda tidak ingin melakukan rebase jika nantinya Anda harus bergabung dengan repo jarak jauh yang sudah memiliki beberapa perubahan.
Domino
1
Bagaimana dengan (anggap Anda sedang di configUpdate cabang) ... git pull pada dasarnya sama dengan git fetch; git menggabungkan asal / master. <- TIDAK BENAR
Chris
@ Chris: Dalam arti apa itu tidak benar? Asumsi asal / master sebagai hulu? Atau sudahkah git pull diubah?
Joey Adams
81

Saya menemukan itu:

$ git fetch upstream
$ git merge upstream/master
Martyn
sumber
6
Jadi, jika Anda belum mengetahuinya, Anda pull --rebasetidak berhasil karena originmenunjuk ke garpu Anda. Ini akan berhasil jika Anda melakukannya git pull --rebase upstream/master.
Karl Bielefeldt
3
Coba: git merge origin / master
Chris
Saya melewatkan pengambilan, jawaban ini memecahkannya untuk saya.
nurettin
39

Beralih ke cabang lokal Anda

> git checkout configUpdate

Gabungkan master jarak jauh ke cabang Anda

> git rebase master configUpdate

Jika Anda memiliki konflik, perbaiki mereka dan untuk setiap file yang bertentangan lakukan perintah

> git add [path_to_file / konflikted_file] (mis. git add app / assets / javascripts / test.js)

Lanjutkan rebase

> git rebase --continue

Serge Seletskyy
sumber
jangan takut untuk menggunakan rebase daripada penggabungan menghabiskan beberapa waktu menyelidiki perbedaannya jika Anda merasakan kesenjangan dalam pertanyaan ini
Serge Seletskyy
13

git rebase sepertinya tidak berhasil untukku. Setelah git rebase, ketika saya mencoba untuk mendorong perubahan ke cabang lokal saya, saya terus mendapatkan kesalahan ("petunjuk: Pembaruan ditolak karena ujung cabang Anda saat ini berada di belakang mitra jarak jauhnya. Integrasikan perubahan jarak jauh (mis. 'Git pull. .. ') sebelum mendorong lagi. ") bahkan setelah git menarik. Yang akhirnya berhasil bagi saya adalah git merge.

git checkout <local_branch>
git merge <master> 

Jika Anda seorang pemula seperti saya, berikut adalah artikel bagus tentang git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

AJC
sumber