Katakanlah kita memiliki situasi berikut di Git:
Repositori yang dibuat:
mkdir GitTest2 cd GitTest2 git init
Beberapa modifikasi dalam master berlangsung dan dikomit:
echo "On Master" > file git commit -a -m "Initial commit"
Feature1 bercabang master dan beberapa pekerjaan dilakukan:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
Sementara itu, bug ditemukan dalam kode master dan cabang hotfix dibuat:
git checkout master git branch hotfix1 git checkout hotfix1
Bug diperbaiki di cabang perbaikan terbaru dan bergabung kembali ke master (mungkin setelah peninjauan permintaan / kode tarik):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
Pengembangan fitur1 berlanjut:
git checkout feature1
Katakanlah saya perlu perbaikan terbaru di cabang fitur saya, mungkin karena bug juga terjadi di sana. Bagaimana saya bisa mencapai ini tanpa menduplikasi komitmen ke cabang fitur saya?
Saya ingin mencegah untuk mendapatkan dua komitmen baru pada cabang fitur saya yang tidak ada hubungannya dengan implementasi fitur. Ini tampaknya penting bagi saya jika saya menggunakan permintaan tarikan: Semua komitmen ini juga akan dimasukkan dalam permintaan tarikan dan harus ditinjau meskipun ini sudah dilakukan (karena perbaikan terbaru sudah ada di master).
Saya tidak bisa melakukan git merge master --ff-only
: "fatal: Tidak mungkin untuk maju cepat, batal.", Tapi saya tidak yakin apakah ini membantu saya.
sumber
feature1
sepenuhnya lokal, lihatlahgit rebase
.git rebase
sepertinya ilmu hitam bagi saya ....git branch feature1
dangit checkout feature1
bisa digabungkan menjadigit checkout -b feature1
4. bisa sepenuhnya dikurangi menjadigit checkout -b hotfix1 master
Jawaban:
Bagaimana kita menggabungkan cabang master ke cabang fitur? Mudah:
Tidak ada gunanya memaksa penggabungan maju cepat di sini, karena hal itu tidak dapat dilakukan. Anda berkomitmen baik ke cabang fitur dan cabang master. Maju cepat tidak mungkin sekarang.
Lihatlah GitFlow . Ini adalah model percabangan untuk git yang dapat diikuti, dan Anda secara tidak sadar sudah melakukannya. Ini juga merupakan ekstensi untuk Git yang menambahkan beberapa perintah untuk langkah-langkah alur kerja baru yang melakukan hal-hal secara otomatis yang seharusnya perlu Anda lakukan secara manual.
Jadi apa yang Anda lakukan dengan benar dalam alur kerja Anda? Anda memiliki dua cabang untuk dikerjakan, cabang feature1 Anda pada dasarnya adalah cabang "berkembang" dalam model GitFlow.
Anda membuat cabang perbaikan terbaru dari master dan menggabungkannya kembali. Dan sekarang kamu terjebak.
Model GitFlow meminta Anda untuk menggabungkan perbaikan terbaru juga ke cabang pengembangan, yang merupakan "feature1" dalam kasus Anda.
Jadi jawaban sebenarnya adalah:
Ini menambahkan semua perubahan yang dibuat di dalam perbaikan terbaru ke cabang fitur, tetapi hanya perubahan itu. Mereka mungkin bertentangan dengan perubahan pengembangan lainnya di cabang, tetapi mereka tidak akan bertentangan dengan cabang master jika Anda menggabungkan cabang fitur kembali ke master pada akhirnya.
Berhati-hatilah dengan rebasing. Hanya rebase jika perubahan yang Anda lakukan tetap lokal ke repositori Anda, misalnya Anda tidak mendorong cabang apa pun ke beberapa repositori lainnya. Rebasing adalah alat yang hebat bagi Anda untuk mengatur komit lokal Anda ke dalam urutan yang berguna sebelum mendorongnya ke dunia, tetapi rebasing setelahnya akan mengacaukan hal-hal untuk pemula git seperti Anda.
sumber
git merge master
wasiat akan bergabung dari salinan master lokal Anda , jadi meskipun Anda telah melakukangit pull
di cabang fitur Anda setelah orang lain menggabungkan cabang yang berbeda menjadi master, Anda harusgit checkout master
, kemudiangit pull
, kemudian,git checkout feature1
lagi dan MAKAgit merge master
.git fetch
andgit merge origin/master
git pull origin master
akan secara otomatis bergabungorgin/master
ke cabang saat iniAnda harus dapat rebase cabang Anda pada master:
Kelola semua konflik yang muncul. Ketika Anda sampai di commit dengan perbaikan bug (sudah di master), Git akan mengatakan bahwa tidak ada perubahan dan bahwa mungkin itu sudah diterapkan. Anda kemudian melanjutkan rebase (sambil melewatkan komit yang sudah di master) dengan
Jika Anda melakukan
git log
pada cabang fitur Anda, Anda akan melihat komit perbaikan bug hanya muncul sekali, dan di bagian master.Untuk diskusi yang lebih terperinci, lihat dokumentasi Git book di
git rebase
( https://git-scm.com/docs/git-rebase ) yang membahas kasus penggunaan persis ini.================ Edit untuk konteks tambahan ====================
Jawaban ini diberikan khusus untuk pertanyaan yang diajukan oleh @theomega, dengan mempertimbangkan situasinya. Perhatikan bagian ini:
Rebasing cabang pribadinya pada master adalah persis apa yang akan menghasilkan hasil itu. Sebaliknya, menggabungkan master ke cabangnya justru akan melakukan apa yang secara spesifik tidak diinginkannya terjadi : menambahkan komit yang tidak terkait dengan implementasi fitur yang sedang dikerjakannya melalui cabangnya.
Untuk mengatasi pengguna yang membaca judul pertanyaan, lewati konten aktual dan konteks pertanyaan, dan kemudian hanya baca jawaban atas secara membabi buta dengan asumsi itu akan selalu berlaku untuk kasus penggunaan mereka (berbeda), izinkan saya untuk menguraikan:
git merge master
seperti pada jawaban @ Sven).Akhirnya, jika Anda tidak senang dengan kenyataan bahwa jawaban ini bukan yang paling cocok untuk situasi Anda walaupun itu untuk @theomega, menambahkan komentar di bawah ini tidak akan sangat membantu: Saya tidak mengontrol jawaban mana yang dipilih, hanya @theomega yang melakukannya.
sumber
-f
ketika mendorong untuk menimpa cabang dengan versi rebased. Hati-hati!-f
? Atau apakah alur kerja lengkap saya cacat karena saya perlu-f
?feature1
dari Github.master
menjadi cabang pribadi (ia menyebutkan cabang lokal "nya"). Dalam hal ini,rebase
baik-baik saja dan sama halnya dengan "membersihkan" yang Anda sebutkan.Berdasarkan artikel ini , Anda harus:
buat cabang baru yang didasarkan pada versi master baru
git branch -b newmaster
menggabungkan cabang fitur lama Anda ke yang baru
git checkout newmaster
menyelesaikan konflik pada cabang fitur baru
Dua perintah pertama dapat digabungkan ke
git checkout -b newmaster
.Dengan cara ini riwayat Anda tetap jelas karena Anda tidak perlu penggabungan kembali. Dan Anda tidak perlu menjadi sangat berhati-hati karena Anda tidak perlu melakukan rebase Git.
sumber
git merge
1. menggabungkan
origin/master
cabang kefeature
cabang2. menggabungkan
feature
cabang keorigin/master
cabangsumber
Jawaban Zimi menggambarkan proses ini secara umum. Berikut spesifiknya:
Buat dan alihkan ke cabang baru. Pastikan cabang baru didasarkan
master
sehingga akan menyertakan perbaikan terbaru terbaru.Setelah beralih ke cabang baru, gabungkan perubahan dari cabang fitur yang ada. Ini akan menambahkan komit Anda tanpa menduplikasi komit perbaikan terbaru.
Di cabang baru, selesaikan konflik antara fitur Anda dan cabang master.
Selesai! Sekarang gunakan cabang baru untuk terus mengembangkan fitur Anda.
sumber
Berikut ini adalah skrip yang dapat Anda gunakan untuk menggabungkan cabang master Anda ke cabang Anda saat ini.
Script melakukan hal berikut:
Simpan kode ini sebagai file batch (.bat) dan letakkan skrip di mana saja di repositori Anda. Kemudian klik untuk menjalankannya dan Anda siap.
sumber
Anda mungkin dapat melakukan "cherry-pick" untuk menarik komit yang tepat yang Anda perlukan ke cabang fitur Anda.
Lakukan
git checkout hotfix1
untuk mendapatkan cabang hotfix1. Kemudian lakukan agit log
untuk mendapatkan hash SHA-1 (urutan besar huruf dan angka acak yang secara unik mengidentifikasi komit) dari komit tersebut. Salin itu (atau 10 karakter pertama atau lebih).Kemudian,
git checkout feature1
untuk kembali ke cabang fitur Anda.Kemudian,
git cherry-pick <the SHA-1 hash that you just copied>
Itu akan menarik komit itu, dan hanya komit itu, ke cabang fitur Anda. Perubahan itu ada di cabang - Anda tinggal "memetiknya". Kemudian, lanjutkan pekerjaan, edit, komit, dorong, dll. Sesuka hati Anda.
Ketika, pada akhirnya, Anda melakukan penggabungan lain dari satu cabang ke cabang fitur Anda (atau sebaliknya), Git akan mengenali bahwa Anda telah bergabung dalam komit tertentu , tahu bahwa itu tidak harus membuatnya lagi, dan hanya "lewati" itu.
sumber
git merge
berfungsi dalam "replay commit" ini - cara yang sepertinya Anda mengisyaratkan ("dan lewati saja"). Memadukan memetik dan menggabungkan buah ceri tampaknya dapat menyebabkan masalah; lihat: news.ycombinator.com/item?id=3947950Saya berada di cabang fitur dan membuat refactorings. Saya ingin menggabungkan perubahan master sekarang ke cabang fitur saya. Saya jauh di belakang. Catatan Saya tidak ingin menarik perubahan master ke lokal saya karena cabang fitur saya memiliki modul yang dipindahkan dari satu tempat ke tempat lain. Saya menemukan hanya melakukan di bawah tanpa tarikan tidak bekerja. itu tertulis "Sudah up to date."
Ini di bawah ini berfungsi, perhatikan menggunakan git merge origin / master:
sumber