Cara menjaga agar cabang git tetap sinkron dengan master

276

Pada saat git melakukan kepalaku, aku tidak bisa menemukan solusi terbaik untuk yang berikut.

Ada dua cabang, satu disebut master dan satu disebut dukungan mobilede . Saya ingin menjaga layanan ponsel sebagai cabang terus menerus yang akan digabungkan / disinkronkan dengan cabang master setiap kali layanan mobilede layanan tetap stabil. Ini akan menggabungkan perubahan dari mobiledevicesupport menjadi master tetapi juga membawa semua perubahan dari master ke mobiledevicesupport sehingga cabang dapat terus dikerjakan dan fitur ditingkatkan atau diubah. Ini perlu bekerja dengan repositori pusat dan beberapa pengembang.

Tolong contoh alur kerja serupa yang digunakan orang lain atau katakan saja jika ide ini bodoh dan saya harus mempertimbangkan opsi lain. Saat ini alur kerja tampaknya baik, tetapi saya tidak tahu bagaimana saya bisa membuat git bekerja seperti ini.

Terima kasih, semua bantuan sangat dihargai.

Pembaruan 1: Jika saya menggabungkan master ke dalam dukungan layanan mobilede dan dukungan layanan perangkat seluler menjadi master, apakah saya mendapatkan replikasi komitmen di kedua cabang. Atau apakah git cukup pintar untuk mengetahui bahwa saya telah menarik perubahan terbaru dari cabang A ke cabang B dan menambahkan gabungan komit C ke cabang B. Dan saya telah menarik perubahan terbaru dari cabang B ke cabang A dan menambahkan gabungan komit D ke cabang SEBUAH?

Saya akan memposting gambar tetapi saya tidak memiliki reputasi yang cukup untuk itu, jadi saya kira ilustrasi berikut harus dilakukan. Dua cabang terus-menerus berjalan dengan penggabungan yang menuju kedua arah sering. Hal utama yang saya tidak yakin tentang adalah bagaimana git akan memainkan komit dan akankah mengisi salah satu cabang dengan komit dari cabang lain pada penggabungan atau akan tetap bersih. Saya telah menggunakan rebase sebelumnya tetapi tampaknya mengakhiri cabang dan meletakkan semua komit ke dalam master, atau saya melakukan kesalahan. Terima kasih atas bantuannya sejauh ini.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L
Tn. EZEKIEL
sumber
1
Jika Anda, seperti saya, mencari cara untuk melakukannya dengan klien GitHub : help.github.com/articles/merging-branches
cregox
1
Pertanyaan ini menyelamatkan hidup saya selama berabad-abad; Terima kasih atas upaya besar Anda meluangkan waktu untuk mengatur pertanyaan luar biasa ini @Mr. Yehezkiel
DJphy
Jika Anda mengerjakan garpu, Anda harus mengikuti help.github.com/articles/syncing-a-fork
koppor

Jawaban:

417

ya lakukan saja

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

untuk menjaga agar layanan ponsel tetap sinkron dengan master

maka ketika Anda siap untuk menempatkan dukungan mobilede ke dalam master, pertama menggabungkan master seperti di atas, lalu ...

git checkout master
git merge mobiledevicesupport
git push origin master

dan itu saja.

asumsinya di sini adalah bahwa mobilexxx adalah cabang topik dengan pekerjaan yang belum siap untuk masuk ke cabang utama Anda. Jadi hanya bergabung menjadi master ketika dukungan layanan mobil berada di tempat yang baik

concept47
sumber
Ini kedengarannya masuk akal bagi saya, saya kira saya tidak yakin seberapa kotor ini akan membuat histori komit, saya akan memperbarui pertanyaan saya dengan contoh apa yang saya pikir akan terjadi.
Tn. EZEKIEL
1
Anda akan memiliki beberapa "gabungan komit", pada dasarnya git mencoba menyelesaikan perbedaan antara cabang-cabang Anda. jika Anda khawatir tentang hal itu DAN Anda satu-satunya yang menggunakan cabang maka lakukan "master git rebase" alih-alih "master git merge" DAN JANGAN PUSH KOMIT KE CABANG REMOTE. Jika Anda melakukannya, Anda akan menemukan diri Anda melakukan banyak dorongan gaya (git push --force) ke asal / mobiledevicesupport karena Anda akan (mungkin) selalu mengirim baik itu sejarah komitmen yang tidak sesuai dengan apa yang cabang terpencil memiliki. lebih detail di sini git-scm.com/book/en/Git-Branching-Rebasing
concept47
Saya percaya ini adalah jawaban yang benar, kedengarannya persis seperti yang saya inginkan. Saya menambahkan ilustrasi di atas untuk membuatnya sedikit lebih jelas tetapi jika apa yang Anda katakan itu benar, maka ini harus bekerja persis seperti yang saya inginkan. Terima kasih.
Tn. EZEKIEL
2
Baca ini untuk memahami mengapa ini bukan saran yang bagus: kentnguyen.com/development/visualized-git-practices-for-team/… . Itu ditulis oleh pengelola Git, jadi mungkin adil untuk mengatakan dia tahu apa yang dia bicarakan mengenai topik khusus ini.
Dan Moulding
2
Ini membuat sejarah komit berantakan, lihat jawaban saya melakukannya melalui rebase.
Gob00st
43

Kapan pun Anda ingin mendapatkan perubahan dari master ke cabang kerja Anda, lakukan a git rebase <remote>/master. Jika ada konflik. mengatasinya.

Ketika cabang kerja Anda siap, rebase lagi dan kemudian lakukan git push <remote> HEAD:master. Ini akan memperbarui cabang utama pada remote (repo pusat).

euphoria83
sumber
3
Apa pro / kontra dari melakukannya dengan cara ini alih-alih seperti pada jawaban yang diterima?
Hampus Ahlgren
33
Sane sampai Anda menghabiskan 5 jam di neraka rebase
IcedDante
21
Ini benar hanya jika cabang Anda berada di repositori pribadi. Jangan pernah rebase sesuatu yang telah didorong ke hulu. Inilah sebabnya: git-scm.com/book/en/v2/…
Kleag
3
Masalah dengan rebasing menjadi penulisan ulang sejarah adalah bahwa SHA komit yang dirubah diubah dan dengan demikian Anda tidak dapat mengandalkan output dari (misalnya) git branch --contains <commit>.
jnns
13

Pendekatan concept47 adalah cara yang tepat untuk melakukannya, tetapi saya menyarankan untuk bergabung dengan opsi --no-ff untuk menjaga riwayat komit Anda tetap jelas.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master
IwishIcanFLighT
sumber
9

Ya saya setuju dengan pendekatan Anda. Untuk menggabungkan dukungan ponsel ke master yang dapat Anda gunakan

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Demikian pula Anda juga dapat menggabungkan master dalam dukungan layanan mobilede.

Q. Jika penggabungan silang adalah masalah atau tidak.

A. Yah, itu tergantung pada komit yang dibuat dalam mobile * branch dan master branch sejak terakhir kali mereka disinkronkan. Ambil contoh ini: Setelah sinkronisasi terakhir, komit berikut terjadi pada cabang-cabang ini

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Sekarang, misalkan komit B membuat beberapa perubahan pada file a.txt dan komit D juga membuat beberapa perubahan pada a.txt. Mari kita lihat dampak dari setiap operasi penggabungan sekarang,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Sekarang, ada dua jenis penggabungan yang mungkin

  1. Penggabungan maju cepat
  2. True merge (Membutuhkan upaya manual)

Git pertama-tama akan mencoba untuk membuat penggabungan FF dan jika menemukan konflik tidak dapat diselesaikan oleh git. Gagal menggabungkan dan meminta Anda untuk bergabung. Dalam hal ini, sebuah komit baru akan muncul yang bertanggung jawab untuk menyelesaikan konflik di a.txt.

Jadi Intinya adalah penggabungan Cross bukan masalah dan akhirnya Anda harus melakukannya dan itulah yang artinya sinkronisasi. Pastikan Anda mengotori tangan Anda dalam menggabungkan cabang sebelum melakukan apa pun dalam produksi.

sachinjain024
sumber
1
Jadi penggabungan silang seperti ini bukan masalah?
Tn. EZEKIEL
Penggabungan silang adalah apa yang kami katakan disinkronkan dan bukan merupakan masalah kecuali komitmen di kedua cabang tidak menyebabkan konflik. Silakan lihat jawaban saya yang diperbarui.
sachinjain024
3

Jawaban yang diterima melalui git merge akan menyelesaikan pekerjaan tetapi meninggalkan komit berantakan, cara yang benar harus 'rebase' melalui langkah-langkah berikut (dengan asumsi Anda ingin menyimpan cabang fitur Anda di sycn dengan mengembangkan sebelum Anda melakukan dorongan terakhir sebelum PR ).

1 git fetchdari cabang fitur Anda (pastikan cabang fitur yang sedang Anda perbarui diperbarui ke tanggal)

2 git rebase origin/develop

3 jika timbul konflik, selesaikan satu per satu

4 gunakan git rebase --continuesetelah semua konflik ditangani

5 git push --force

Gob00st
sumber
1
Ini sulit dibaca dan sulit dimengerti. Harap perbarui jawaban Anda dan gunakan penurunan kode yang tepat, untuk memisahkan komentar Anda dari perintah.
not2qubit
2

Anda berpikir ke arah yang benar. Gabungkan master dengan dukungan layanan mobile secara terus menerus dan gabungkan dukungan layanan mobil dengan master ketika dukungan layanan mobil stabil. Setiap pengembang akan memiliki cabang sendiri dan dapat bergabung ke dan dari dukungan master atau mobil tergantung pada peran mereka.

faisal
sumber