Gabungkan cabang pengembangan dengan master

764

Saya memiliki dua cabang yaitu masterdan developmentdalam Repositori GitHub. Saya melakukan semua perkembangan saya di cabang pengembangan seperti yang ditunjukkan.

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

Sekarang saya ingin menggabungkan semua perubahan pada developmentcabang ke dalam master. Pendekatan saya saat ini adalah:

git checkout master 
git merge development
git push -u origin master 

Tolong beri tahu saya jika prosedur yang saya ikuti benar.

Pawan
sumber
7
git pull -usetel pelacakan hulu untuk cabang (atau semua cabang jika mendorong lebih dari satu). Setelah diatur, pelacakan akan berlanjut. Tidak ada alasan untuk menggunakannya terus menerus.
David Culp

Jawaban:

1166

Saya biasanya suka bergabung masterdengan yang developmentpertama sehingga jika ada konflik, saya bisa menyelesaikannya di developmentcabang itu sendiri dan mastertetap bersih.

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

Tidak ada banyak perbedaan dalam kedua pendekatan itu, tetapi kadang-kadang saya perhatikan bahwa saya belum ingin menggabungkan cabang ke dalam master, setelah menggabungkannya, atau bahwa masih ada banyak pekerjaan yang harus dilakukan sebelum ini dapat digabung. , jadi saya cenderung mastertidak tersentuh sampai barang terakhir.

EDIT: Dari komentar

Jika Anda ingin melacak siapa yang melakukan penggabungan dan kapan, Anda bisa menggunakan --no-ffflag saat penggabungan untuk melakukannya. Ini umumnya berguna hanya ketika menggabungkan developmentke dalam master(langkah terakhir), karena Anda mungkin perlu menggabungkan masterke dalam development(langkah pertama) beberapa kali dalam alur kerja Anda, dan membuat node komit untuk ini mungkin tidak terlalu berguna.

git merge --no-ff development
Sailesh
sumber
71
Ada sedikit kelemahan pada pendekatan itu: gabungan sebenarnya untuk dikuasai kemungkinan besar merupakan gabungan maju-cepat dan karena itu tidak membuat simpul komit. Ini tidak masalah dengan kode aktual di cabang, tetapi membuatnya sulit untuk mengetahui nanti, siapa yang melakukan penggabungan aktual untuk dikuasai dan pada saat itu. --no-ffDiperlukan eksplisit untuk menggabungkan ke master untuk memperbaikinya.
michas
11
Ya, itulah gunanya --no-ff. :)
michas
19
Itu git merge --no-ff developmenthanya untuk memperbaiki penggunaan @ terpilih.
jewbix.cube
2
@sailesh dapatkah Anda memperbarui jawaban Anda untuk menyertakan bendera git merge, jika Anda setuju dengan komentar?
Pengguna Web
2
@ Mars, penggabungan akan menimpa file jika perubahan lama adalah keturunan langsung dari komit. Sebagai contoh, biarkan A->B->Cmenjadi master, dan A->X->Ymerupakan cabang dev Anda. Jika Anda mengubah bagian dari file Xyang mungkin memiliki konflik dengan perubahan A, itu tidak akan menjadi konflik, karena Amerupakan leluhur X. Mengenai perubahan yang hilang, periksa stackoverflow.com/questions/7147680/… untuk memulihkan perubahan apa pun.
Sailesh
103

Secara pribadi, pendekatan saya mirip dengan Anda, dengan beberapa cabang lagi dan beberapa komitmen ketika mereka kembali untuk menguasai.

Salah satu rekan kerja saya tidak suka harus berganti cabang begitu banyak dan tetap di cabang pengembangan dengan sesuatu yang mirip dengan yang berikut semua dijalankan dari cabang pengembangan.

git fetch origin master

git merge master

git push origin development:master

Baris pertama memastikan dia memiliki komit upstream yang telah dibuat untuk dikuasai sejak terakhir kali memperbarui repositori lokalnya.

Yang kedua menarik perubahan itu (jika ada) dari master ke pengembangan

Yang ketiga mendorong cabang pengembangan (sekarang sepenuhnya digabung dengan master) ke asal / master.

Saya mungkin memiliki alur kerja dasarnya yang sedikit salah, tetapi itulah intinya.

David Culp
sumber
Terima kasih! Bagi saya ini lebih masuk akal.
Jamie Nicholl-Shelley
2
Ya - dalam 6+ tahun sejak saya menulis ini, saya juga telah mengadopsinya - meskipun dengan rebasememperbarui devcabang bukan merge.
David Culp
32

Penjelasan dari bawah untuk orang-orang yang datang ke sini tanpa sepengetahuan cabang.

Logika pengembangan cabang master dasar adalah: Anda hanya bekerja di cabang lain dan menggunakan master hanya untuk menggabungkan cabang lain.

Anda mulai membuat cabang baru dengan cara ini:

1) Klon repositori dalam direktori lokal Anda (atau buat repositori baru):

$ cd /var/www
$ git clone [email protected]:user_name/repository_name.git

2) Buat cabang baru. Ini akan berisi file terbaru dari repositori cabang master Anda

$ git branch new_branch

3) Ubah cabang git Anda saat ini ke new_branch

$ git checkout new_branch

4) Lakukan coding, commit, seperti biasa ...

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5) Ketika pekerjaan selesai di cabang ini, bergabung dengan cabang "master":

$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)

Pembaruan: Saya sangat merekomendasikan untuk menggunakan GitKraken untuk ini untuk melihat pohon perubahan visual dan melihat lebih baik semua logika dan komitmen.

Gediminas
sumber
Saya menyukai pendekatan Anda untuk tidak bekerja pada master. tapi hari ini ketika saya sedang bermain dengan gitflow, saya membuat releasecabang dari develop. Kemudian menambahkan file catatan rilis dan berkomitmen. Kemudian selesai rilis yang menggabungkan kembali ke keduanya master/develop. tetapi cabang master saya hanya memiliki catatan rilis yang baru ditambahkan di dalamnya. tidak ada file lain selama komit pengembangan sebelumnya yang diperbarui di dalamnya.
Amit Shah
jika Anda bekerja di cabang lain dari master, pastikan Anda telah melakukan dan mendorong perubahan ke cabang itu. Daripada Anda dapat melihat bagaimana file terlihat pada antarmuka grafis github.com atau bitbucket.com dan coba klik Gabung di sana, di situs web. Itu harus memperbarui semuanya dari branche Anda ke master. Jika master memiliki file yang lebih baru, itu pasti konflik dan Anda akan mendapatkan pesan kesalahan. Tidak yakin saya telah menjawab cukup baik, tolong beri saya pesan jika tidak :)
Gediminas
Saya menggunakan sourcetree sebagai GUI dan repositori github. Saya mencoba 2 kali dengan tes rilis. master tidak pernah memperbarui dengan mengembangkan cabang terbaru.
Amit Shah
coba gunakan di situs github.com langsung file cabang Anda yang sedang Anda kerjakan. Apakah mereka didorong? Jika ya, coba klik pada cabang yang sama - Gabung dan Anda akan melihat apa yang terjadi. Dalam pengalaman pribadi saya dengan sourcetree cukup buruk - saya tidak dapat memahami sepenuhnya apa yang terjadi di cabang saya juga
Gediminas
Terima kasih @Gediminas untuk penjelasan terperinci. Saya bingung dengan kata kunci git sebelum membaca jawaban Anda .. :)
Dinesh Suthar
21

Alangkah baiknya jika Anda bisa menggunakan alur kerja Git Flow . Dapat menggabungkan mengembangkan cabang menjadi master dengan mudah.

Yang ingin Anda lakukan hanyalah mengikuti instruksi git-flow yang disebutkan di sini:

LANGKAH:

  • setup proyek git-flow
  • buat cabang dan gabungkan semuanya untuk dikembangkan
  • jalankan perintah git flow release start <version_number>
  • kemudian berikan pesan yang bermakna untuk rilis
  • jalankan perintah git flow release finish <version_number>
  • itu akan menggabungkan semuanya menjadi master dan mengubah cabang menjadi master .
  • jalankan perintah git pushuntuk mempublikasikan perubahan ke master jarak jauh .

Untuk informasi lebih lanjut, kunjungi halaman - http://danielkummer.github.io/git-flow-cheatsheet/

Harsha
sumber
1
Solusinya jika seseorang menggunakan aliran git!
Csaba Toth
21
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master
Rizwan Siddiquee
sumber
9

Ya, ini benar, tetapi sepertinya alur kerja yang sangat mendasar, di mana Anda hanya menyangga perubahan sebelum siap untuk diintegrasikan. Anda harus melihat alur kerja yang lebih maju yang didukung git. Anda mungkin menyukai pendekatan cabang topik , yang memungkinkan Anda bekerja pada beberapa fitur secara paralel, atau pendekatan kelulusan yang sedikit memperluas alur kerja Anda saat ini.

Sergiu Dumitriu
sumber
6

Jika Anda menggunakan Mac atau Ubuntu, buka folder kerja cabang. Di terminal

misalkan harisdev adalah nama cabang.

git checkout master

jika ada file yang tidak dilacak atau tidak dikomit, Anda akan mendapatkan kesalahan dan Anda harus melakukan atau menghapus semua file yang tidak dilacak atau tidak dikomit.

git merge harisdev 

git push origin master

Satu perintah terakhir untuk menghapus cabang.

$ git branch -d harisdev
Haris Np
sumber
Apa yang di sini khusus untuk Mac atau Ubuntu?
talonx
Maaf. Tidak ada jawaban lain yang menyebutkan bahwa perintah harus diberikan di Terminal dan perintah untuk menghapus cabang. Sebenarnya saya hanya ingin menambahkan perintah untuk menghapus cabang sehingga pengembang tidak main-main dengan cabang yang sama di masa depan. Saya menggunakan Mac, jadi saya sebutkan itu. Pertanyaan Anda valid dan tidak ada perintah ini khusus untuk Mac atau Ubuntu.
Haris Np
Terima kasih telah mengklarifikasi.
talonx
5

Langkah 1

Buat dan alihkan ke cabang "dev" baru, tempat file git lokal Anda tidak disinkronkan dengan remote tetapi cabang "dev" belum ada.

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

Langkah 2

Buat perubahan pada cabang "dev" (saat ini jika Anda mengikuti langkah 1), komit dan dorong ke cabang "dev" yang jauh.

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

Langkah 3

Gabungkan cabang "dev" Anda menjadi "master".

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.
kataras
sumber
4

Beginilah biasanya saya melakukannya. Pertama, yakin bahwa Anda siap untuk menggabungkan perubahan Anda menjadi master.

  1. Periksa apakah pengembangan terkini dengan perubahan terbaru dari server jarak jauh Anda dengan a git fetch
  2. Setelah pengambilan selesai git checkout master .
  3. Pastikan cabang utama memiliki pembaruan terbaru dengan mengeksekusi git pull
  4. Setelah persiapan selesai, Anda dapat memulai penggabungan dengan git merge development
  5. Dorong perubahan dengan git push -u origin masterdan Anda selesai.

Anda dapat menemukan lebih banyak tentang git yang bergabung dalam artikel.

Nesha Zoric
sumber
3

1) Pada Pengembangan cabang, periksa status git menggunakan perintah berikut:

git status

Seharusnya tidak ada kode yang tidak dikomit. Jika ya, dorong kode Anda di cabang Pengembangan:

git add *

git commit -m "My initial commit message"

git push origin Development

2) Di cabang Pengembangan, jalankan dua perintah berikut:

git branch -f master HEAD

git push -f origin master

Ini akan mendorong kode cabang Pengembangan Anda ke cabang utama.

Himanshu Mahajan
sumber
Apakah ini mendorong semua pengembangan berkomitmen untuk menguasai juga, atau hanya menambahkan komit tunggal baru ke master?
gulungan
1
bagaimana cara kerjanya? khusus "master cabang git" ketika Anda berada di mengembangkan terlihat seperti kegilaan. bagaimana Anda bisa membuat cabang baru yang disebut master, jika sudah ada cabang yang disebut master? docs mengatakan bahwa -f melakukan ini: Reset <branchname> ke <startpoint>. Apa artinya ini?
John Little
Bukankah kekuatan ini mendorong master lokal ke master jarak jauh? Ini sepertinya ide yang buruk jika Anda bekerja dalam tim.
Nick
-ftidak direkomendasikan.
DawnSong
2

Berdasarkan @Sailesh dan @DavidCulp:

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

Perintah pertama akan memastikan Anda memiliki semua komitmen upstream yang dibuat untuk master jarak jauh, dengan respons Sailesh yang tidak akan terjadi.

Yang kedua akan melakukan penggabungan dan menciptakan konflik yang kemudian bisa Anda selesaikan.

Setelah melakukannya, Anda akhirnya dapat checkout master untuk beralih ke master.

Kemudian Anda menggabungkan cabang pengembangan ke master lokal. Bendera no-ff akan membuat simpul komit di master agar seluruh gabungan dapat dilacak.

Setelah itu, Anda dapat melakukan dan mendorong penggabungan.

Prosedur ini akan memastikan ada komitmen gabungan dari pengembangan untuk menguasai yang dapat dilihat orang, maka jika mereka melihat cabang pengembangan, mereka dapat melihat komitmen individu yang telah Anda buat pada cabang tersebut selama pengembangannya.

Secara opsional, Anda bisa mengubah komitmen gabungan Anda sebelum mendorongnya, jika Anda ingin menambahkan ringkasan dari apa yang dilakukan di cabang pengembangan.

EDIT: jawaban awal saya menyarankan git merge masteryang tidak melakukan apa-apa, lebih baik dilakukan git merge FETCH_HEADsetelah mengambil asal / master

Cisco
sumber
2

Setelah Anda 'checkout' cabang pengembangan Anda ...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 
Tiago Medici
sumber
1

Jika Anda menggunakan gerrit, perintah berikut ini berfungsi dengan baik.

git checkout master
git merge --no-ff development

Anda dapat menyimpan dengan pesan komit default. Pastikan, id perubahan telah dibuat. Anda dapat menggunakan perintah berikut untuk memastikan.

git commit --amend

Kemudian dorong dengan perintah berikut.

git push origin HEAD:refs/for/refs/heads/master

Anda mungkin menemukan pesan kesalahan seperti di bawah ini.

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

Untuk menyelesaikan ini, admin proyek gerrit harus membuat referensi lain di gerrit bernama 'ref / untuk / ref / kepala / master' atau 'ref / untuk / ref / kepala / *' (yang akan mencakup semua cabang di masa depan). Kemudian beri izin 'Dorong Gabung Komit' untuk referensi ini dan izin 'Kirim' jika diperlukan untuk Kirim GCR.

Sekarang, coba lagi perintah push di atas, dan itu akan berhasil.

Kredit:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642

Sankaran Srinivasan
sumber
1

Saya pikir solusi termudah adalah

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

Ini juga menjaga sejarah semua cabang yang digunakan

Vishal
sumber
-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master
Ankit Kumar Rajpoot
sumber
1
Mendesak secara paksa ketika Anda melihat bahwa kesalahan hampir tidak pernah merupakan hal yang benar untuk dilakukan, kecuali jika Anda sangat yakin bahwa Anda tahu mengapa cabang lokal Anda kehilangan komit dari cabang jarak jauh. Secara umum, jauh lebih baik untuk kembali ke langkah 3 dan pulllagi. Juga, tidak jelas nilai apa yang ditambahkan jawaban ini dibandingkan dengan jawaban yang ada.
Kyle Strand