Dapatkan perubahan dari master menjadi cabang di Git


689

Dalam repositori saya, saya memiliki cabang bernama aqyang saya kerjakan.

Saya kemudian melakukan pekerjaan baru dan bug di master.

Apa cara terbaik untuk memasukkan komitmen itu ke aqcabang? Buat cabang baru dari masterdan gabungkan dengan aq?


3
Di masa mendatang, Anda juga bisa memulai cabang perbaikan bug dari leluhur umum master dan cabang lain yang membutuhkan perbaikan, sehingga Anda bisa menggabungkannya ke semua cabang itu, tanpa mengambil yang lain.
Cascabel

2
@ Jeffromi tapi itu di luar kendalinya jika dia bukan satu-satunya orang yang mengerjakan proyek. orang lain memperbarui master. persetan, Anda sendiri dapat memperbarui master dari cabang ketiga, dan situasinya tidak akan terhindarkan, dan membutuhkan solusi umum.
ahnbizcad

@ ahnbizcad Saya cukup yakin dia mengendalikan di mana dia memulai cabangnya sendiri. Jika cabangnya adalah nenek moyang yang sama yang ingin ia gabungkan, dan orang-orang kemudian menambah cabang-cabangnya, itu akan tetap menjadi leluhur yang sama.
Cascabel

pertanyaan git pull origin my_branch_name
kawan

Jawaban:


794

Lihat aqcabang, dan rebase dari master.

git checkout aq
git rebase master

dapat rebase datang dari cabang lain? Yaitu. git rebase cabang lainnya? Sepertinya saya sedikit bingung dengan pertanyaan saya, saya bercabang dari cabang kemudian membuat perubahan ke cabang asli.
Lengan

2
Jika saya benar, rebase pada permintaan tarik itu akan menunjukkan semua komitmen master. jika Anda menggunakan gabungan master / asal semua komit master akan ditampilkan sebagai 1 komit, yang membuatnya lebih mudah untuk ditinjau kode.
Pengguna Foo Bar

4
Terkadang, git mergeakan lebih baik. Jika kedua cabang berkembang dari waktu ke waktu, Anda harus mempertimbangkan mana yang terbaik untuk Anda.
erick2red

70
Terlambat ke pesta, tetapi ini adalah ikhtisar besar kapan harus rebase vs penggabungan: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989

7
Jika komit Anda sebelumnya pada cabang aq bersifat publik maka jangan lakukan rebase. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

Anda harus bisa tepat git merge origin/masterketika Anda berada di cabang aq Anda.

git checkout aq
git merge origin/master

55
Jika rebase "lebih baik" tergantung sepenuhnya pada situasi tertentu.
Bombe

13
kenapa tidak Anda sebut saja "git merge master" alih-alih "git merge origin / master"?
Michael Küller

145
Gunakan rebasejika cabang Anda lokal dan belum didorong origin. Gunakan mergejika cabang Anda sudah didorong. rebaseakan menulis ulang sejarah.
garbagecollector

17
@Toskan Anda dapat mengalami masalah di mana master lokal Anda tidak ketinggalan dengan remote. Dengan cara ini memastikan bahwa Anda menggabungkan salinan kode yang jauh.
Chris Kooken

8
@garbagecollector Saya menentang rebase (saya bisa, tetapi tidak akan rebase) Saya tidak melihat alasan untuk bertaruh dengan rebase. Itu hanya membuat berbagai hal menjadi rumit. Anda selalu memiliki pertanyaan "Apakah saya mendorong ini ke jarak jauh?" untuk merenungkan dan itu menyakitkan untuk menjelaskan kepada pendatang baru. Beberapa orang mengatakan itu menghindari gabungan. Tapi saya ingin memiliki komitmen gabungan. Mereka tidak berantakan, mereka mendokumentasikan ketika cabang digabung. Jadi untuk yang terakhir kalinya, bisakah kita akhirnya berhenti bertindak seperti kita semua berkomitmen untuk menguasainya? Jika Anda sangat tidak suka menggabungkan komit dalam log, cukup saring dengan --no-gabungan.
nurettin

92

Pertama-tama periksa untuk dikuasai:

git checkout master

Lakukan semua perubahan, perbaikan terbaru dan lakukan dan tekan master Anda.

Kembali ke cabang Anda, 'aq', dan gabungkan master di dalamnya:

git checkout aq
git merge master

Cabang Anda akan diperbarui dengan master. Contoh penggabungan yang baik dan dasar adalah 3.2 Git Branching - Basic Branching and Merging .


25

Tidak ada jaminan bahwa perbaikan bug utama tidak ada di antara komitmen lainnya, karenanya Anda tidak bisa begitu saja menggabungkan. Melakukan

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

dengan asumsi komit tersebut merepresentasikan perbaikan bug.

Mulai sekarang, tetap perbaiki bug di cabang terpisah. Anda akan bisa adil

git merge hotfixes

ketika Anda ingin menggulung semuanya ke cabang dev biasa.


17

Entah cherry-pickyang bersangkutan berkomitmen menjadi cabang aqatau menggabungkan cabang mastermenjadi cabang aq.


5
@Segera kamu jawab sendiri ... itu bukan solusi untuk situasi ini
mtet88

13

Gabungkan dengan aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

Jalan mudah

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Bagi saya, saya sudah memiliki perubahan di tempat dan saya ingin yang terbaru dari cabang dasar. Saya tidak dapat melakukan rebase, dan cherry-pickakan mengambil selamanya, jadi saya melakukan yang berikut:

git fetch origin <base branch name>  
git merge FETCH_HEAD

jadi dalam hal ini:

git fetch origin master  
git merge FETCH_HEAD

7

Ini ( dari sini ) bekerja untuk saya:

git checkout aq
git pull origin master
...
git push

Mengutip:

git pull origin mastermengambil dan menggabungkan konten cabang master dengan cabang Anda dan membuat komit gabungan. Jika ada konflik penggabungan, Anda akan diberitahu pada tahap ini dan Anda harus menyelesaikan komitmen gabungan sebelum melanjutkan . Saat Anda siap untuk mendorong komit lokal Anda, termasuk komit gabungan baru Anda, ke server jarak jauh, jalankan git push.


Penting untuk dicatat bahwa solusi ini sempurna jika penggabungan diperlukan secara khusus, yaitu, jika cabang master tidak dapat diubah kembali karena alasan tertentu.
cudacoder

3

Anda memiliki beberapa opsi. git rebase master aqke cabang yang akan menyimpan nama-nama komit, tetapi JANGAN REBASE jika ini adalah cabang terpencil. Anda bisa git merge master aqjika Anda tidak peduli tentang menjaga nama komit. Jika Anda ingin menyimpan nama komit dan itu adalah cabang terpencil git cherry-pick <commit hash>komit ke cabang Anda.


0

Anda juga dapat melakukan ini dengan menjalankan satu baris.
git merge aq master

Ini setara dengan

git checkout aq
git merge master

Ini bukan melakukan apa yang Anda pikir itu lakukan. git merge a bmenggabungkan cabang adan bmenjadi cabang saat ini. Tetapi git merge aketika Anda berada di cabang atidak akan melakukan apa-apa (itulah sebabnya ini terlihat seperti melakukan apa yang menurut Anda sedang dilakukan). (Lihat git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton

0

EDIT:

Jawaban saya di bawah dokumen cara untuk menggabungkan masterke aq, di mana jika Anda melihat rincian penggabungan itu daftar perubahan yang dibuat pada aqsebelum penggabungan, bukan perubahan yang dibuat padamaster . Saya menyadari bahwa itu mungkin bukan yang Anda inginkan, bahkan jika Anda mengira itu!

Hanya:

git checkout aq
git merge master

baik-baik saja.

Ya, penggabungan sederhana ini akan menunjukkan bahwa perubahan dari masterdibuat pada aqsaat itu, bukan sebaliknya; tapi tidak apa-apa - karena memang itulah yang terjadi! Kemudian, ketika Anda akhirnya menggabungkan cabang Anda master, saat itulah akhirnya gabungan akan menampilkan semua perubahan Anda sebagaimana dibuat master(yang persis seperti yang Anda inginkan, dan merupakan komit di mana orang akan berharap untuk menemukan info itu pula).

Saya telah memeriksa dan pendekatan di bawah ini juga menunjukkan perubahan yang persis sama (semua perubahan dibuat aqsejak pemisahan asli antara aqdan master) seperti pendekatan normal di atas, ketika Anda akhirnya menggabungkan semuanya kembali master. Jadi saya pikir satu-satunya kerugian nyata (selain dari terlalu kompleks dan non-standar ...: - /) adalah bahwa jika Anda membatalkan kembali perubahan terbaru dengan git reset --hard HEAD~<n>dan ini melewati penggabungan, maka versi di bawah ini menggulung kembali ke bawah cabang 'salah', yang harus Anda perbaiki dengan tangan (mis. dengan git reflog& git reset --hard [sha]).


[Jadi, yang kupikirkan sebelumnya adalah:]

Ada masalah dengan:

git checkout aq
git merge master

karena perubahan yang ditampilkan di komit gabungan (mis. jika Anda melihat sekarang atau nanti di Github, Bitbucket atau penampil riwayat git lokal favorit Anda) adalah perubahan yang dibuat pada master, yang mungkin bukan yang Anda inginkan.

Di samping itu

git checkout master
git merge aq

menunjukkan perubahan yang dibuat dalam aq, yang mungkin adalah apa yang Anda inginkan. (Atau, paling tidak, ini sering yang saya inginkan!) Tetapi gabungan yang menunjukkan perubahan yang tepat ada di cabang yang salah!

Bagaimana cara mengatasinya ?!

Proses penuh, berakhir dengan komit gabungan yang menunjukkan perubahan yang dibuat pada aq (seperti gabungan kedua di atas), tetapi dengan gabungan yang mempengaruhi cabang aq, adalah:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Ini: menggabungkan aq ke master, maju cepat yang sama menggabungkan ke aq, membatalkannya pada master, dan menempatkan Anda kembali pada aq lagi!

Saya merasa seperti kehilangan sesuatu - ini sepertinya sesuatu yang jelas Anda inginkan, dan sesuatu yang sulit dilakukan.

Juga, rebase TIDAK setara. Kehilangan cap waktu dan identitas dari komitmen yang dibuat pada aq, yang juga bukan yang saya inginkan.


0

Skenario:

  • Saya membuat cabang dari master katakan cabang-1 dan menariknya ke lokal saya.
  • Teman saya membuat cabang dari master katakan cabang-2.
  • Dia melakukan beberapa perubahan kode untuk dikuasai.
  • Sekarang saya ingin mengambil perubahan itu dari cabang utama ke cabang lokal saya.

Larutan

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Anda dapat menemukan konflik pada file Anda setelah menjalankan "git stash apply". Anda harus memperbaikinya secara manual dan sekarang Anda siap untuk mendorong.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.