Geliştirme dalını master ile birleştir


764

İki şube yani var masterve developmentbir GitHub depodaki. Gösterildiği gibi kalkınma branşındaki tüm gelişimimi yapıyorum.

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

Şimdi developmentdaldaki tüm değişiklikleri master. Mevcut yaklaşımım:

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

Takip ettiğim prosedürün doğru olup olmadığını lütfen bize bildirin.


7
git pull -udalın (veya birden fazla itiyorsa tüm dalların) akış yukarı izlemesini ayarlar. Ayarlandıktan sonra izleme devam eder. Sürekli kullanmak için bir sebep yok.
David Culp

Yanıtlar:


1165

Genellikle birleştirme nasıl ben masteriçine developmentherhangi bir çatışma varsa, ben de çözebilirsiniz ilk So developmentdalı kendisi ve benim masterkalıntıları temiz.

(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)

İki yaklaşımda çok fazla fark yoktur, ancak bazen şubeyi birleştirdikten mastersonra henüz birleştirmek istemediğimi veya bunların birleştirilmeden önce yapılması gereken daha çok iş olduğunu fark ettim. , bu yüzden masterson şeylere kadar el değmeden bırakma eğilimindeyim .

EDIT: Yorumlardan

Birleştirmeyi kimin ne zaman gerçekleştirdiğini takip etmek istiyorsanız, birleştirme sırasında --no-ffbayrağı kullanabilirsiniz . Bu birleştirme yalnızca genel olarak yararlıdır developmentiçine masterbirleştirmek gerekebilir, çünkü (Son adımda) masteriçine developmentsizin iş akışında (ilk adım) birden çok kez ve çok kullanışlı olmayabilir bunlar için düğümünü taahhüt yaratır.

git merge --no-ff development

71
Bu yaklaşımda önemli bir dezavantaj var: ustalaşmak için gerçek birleştirme büyük olasılıkla hızlı ileri bir birleştirme ve bu nedenle herhangi bir taahhüt düğümü oluşturmaz. Bu, daldaki gerçek kodla ilgili bir sorun değildir, ancak daha sonra öğrenmek, kimin hangi zamanda ustalaşacağını öğrenmek için zorlaştırır. --no-ffBunu düzeltmek için master ile birleştirmenin açık olması gerekir.
michas

11
Evet, tam da bunun --no-ffiçin. :)
michas

19
Bu git merge --no-ff developmentsadece @ elect'in kullanımını düzeltmek içindir.
jewbix.cube

2
@sailesh, yorumlarınızı kabul ediyorsanız, git birleştirme bayrağını içerecek şekilde lütfen cevabınızı güncelleyebilir misiniz?
Web Kullanıcısı

2
@Mars, eski değişiklik taahhüdün doğrudan soyundaysa, birleştirme bir dosyayı geçersiz kılar. Örneğin, A->B->Custa ol ve geliştirici A->X->Ydalın. Bir dosyanın değişiklikle çakışmış Xolabileceği bir bölümünü değiştirirseniz, dosyanın atası olduğu için Abu bir çakışma olmaz . Kayıp değişikliklerle ilgili olarak, değişiklikleri kurtarmak için stackoverflow.com/questions/7147680/… adresine bakın. AX
Sailesh

103

Şahsen benim yaklaşımım sizinkine benziyor, birkaç dal daha ve ustalığa geri döndüklerinde bazı taahhütler eziliyor.

İş arkadaşlarımdan biri şubeleri çok fazla değiştirmek zorunda kalmıyor ve kalkınma dalında, kalkınma dalında yürütülen aşağıdakilere benzer bir şeyle kalıyor.

git fetch origin master

git merge master

git push origin development:master

İlk satır, yerel deposunu son kez güncellediğinden beri master yapmak için yukarı akış taahhütleri olmasını sağlar.

İkincisi bu değişiklikleri (eğer varsa) ustadan gelişime çeker

Üçüncüsü, geliştirme dalını (şimdi master ile tamamen birleştirilmiştir) başlangıç ​​noktasına / master'a iter.

Temel iş akışını biraz yanlış yapabilirim, ama ana özü bu.


Teşekkürler! Bu benim için daha sezgisel bir anlam ifade ediyor.
Jamie Nicholl-Shelley

2
Evet - bunu yazdığım 6 yıldan bu yana, ben de kabul ettim - bunun yerine şubeyi rebasegüncellemeye rağmen . devmerge
David Culp

32

Şube bilgisi olmadan buraya gelenler için aşağıdan açıklama.

Temel ana dal geliştirme mantığı: Yalnızca başka bir dalda çalışırsınız ve yalnızca başka bir dal birleştirmek için ana bilgisayarı kullanırsınız.

Bu şekilde yeni bir dal oluşturmaya başlarsınız:

1) Yerel yöneticinizdeki depoyu klonlayın (veya yeni bir depo oluşturun):

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

2) Yeni bir şube oluşturun. Ana şube deponuzun en son dosyalarını içerecektir

$ git branch new_branch

3) Geçerli git dalınızı new_branch olarak değiştirin

$ git checkout new_branch

4) Her zamanki gibi kodlama yapın, taahhüt edin…

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

5) Bu dalda iş bittiğinde, “ana” dal ile birleştir:

$ 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”)

Güncelleme: GitKraken'i görsel değişiklik ağacını görmek ve tüm mantık ve taahhütleri daha iyi görmek için kullanmanızı şiddetle tavsiye ederim.


Usta üzerinde çalışmama yaklaşımını beğendim. ama bugün gitflow ile oynarken, releasebizim şube oluşturdu develop. Sonra bir sürüm notu dosyası eklendi ve taahhüt edildi. Daha sonra her ikisiyle de birleşen sürümü bitirdi master/develop. ancak ana şubemde yeni eklenen sürüm notu vardı. önceki geliştirme işlemleri sırasında başka dosya güncellenmedi.
Amit Shah

master dışında başka bir dalda çalışıyorsanız, söz konusu dalda değişiklikler yaptığınızdan ve aktardığınızdan emin olun. Daha sonra, dosyaların github.com veya bitbucket.com grafik arayüzünde nasıl göründüğüne bakabilir ve web sitesinde Birleştir'i tıklamaya çalışabilirsiniz. Branşınızdan ustaya her şeyi güncellemelidir. Master'ın daha yeni dosyaları varsa, bu bir çakışma olmalıdır ve hata mesajını alırsınız. Yeterince iyi cevap verdiğimden emin değilim, lütfen bana mesaj ver :)
Gediminas

Sourcetree'yi GUI ve github deposu olarak kullanıyorum. Serbest bırakma testi ile 2 kez denedim. Master en son geliştirme dalı ile hiç güncellenmedi.
Amit Shah

canlı github.com web sitesinde üzerinde çalıştığınız şubenizin dosyalarını kullanmaya çalışın. Onlar itildi mi? Evetse, aynı dalı tıklamayı deneyin - Birleştir ve ne olacağını göreceksiniz. Sourcetree ile kişisel deneyimim oldukça kötü - şubelerimde neler olduğunu tam olarak anlayamadım
Gediminas

Detaylı açıklama için @Gediminas'a teşekkürler. Ben cevabınızı okumadan önce git anahtar kelimeler karıştı .. :)
Dinesh Suthar

21

Git Flow iş akışını kullanabilmeniz harika olur . Geliştirmek şube kolayca master içine birleştirebilirsiniz.

Yapmak istediğiniz sadece burada belirtilen git-flow talimatını takip etmektir:

ADIMLAR:

  • git-flow projesini kur
  • dallar oluşturun ve geliştirmek için her şeyi birleştirin
  • komutu çalıştır git flow release start <version_number>
  • ardından sürüm için anlamlı bir mesaj sağlayın
  • komutu çalıştır git flow release finish <version_number>
  • o her şeyi birleştirir usta ve şube değiştirmek usta .
  • git pushdeğişiklikleri uzak ana bilgisayarda yayınlamak için komutu çalıştırın .

Daha fazla bilgi için sayfayı ziyaret edin - http://danielkummer.github.io/git-flow-cheatsheet/


1
Birisi git akış kullanıyorsa çözüm!
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


6

Mac veya Ubuntu kullanıyorsanız, şubenin çalışma klasörüne gidin. Terminalde

diyelim ki harisdev şube adıdır.

git checkout master

izlenmemiş veya teslim edilmemiş dosyalar varsa bir hata mesajı alırsınız ve izlenmeyen veya teslim edilmeyen tüm dosyaları taahhüt etmeniz veya silmeniz gerekir.

git merge harisdev 

git push origin master

Şubeyi silmek için son bir komut.

$ git branch -d harisdev

Mac veya Ubuntu'ya özgü olan nedir?
talonx

Afedersiniz. Diğer cevapların hiçbiri, komutların Terminal'de ve şubeyi silme komutunda verilmesi gerektiğini söylememiştir. Aslında, geliştiricinin gelecekte aynı dalla uğraşmaması için dalı silme komutunu eklemek istedim. Mac kullanıyorum, bundan bahsettim. Sorunuz geçerli ve bu komutların hiçbiri Mac veya Ubuntu'ya özgü değil.
Haris Np

Açıkladığınız için teşekkürler.
talonx

5

Aşama 1

Oluşturun ve yerel git dosyalarınızın uzaktan kumanda ile senkronize edildiği ancak "dev" dalı henüz mevcut olmayan yeni bir "dev" dalı oluşturun.

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.

Adım 2

"Dev" dalında değişikliklerinizi yapın (adım 1'i uygularsanız geçerli olanınız), bunları gerçekleştirin ve uzak "dev" dalına aktarın.

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.

Aşama 3

"Dev" dalınızı "master" ile birleştirin.

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.

4

Ben genellikle böyle yaparım. İlk olarak, değişikliklerinizi master ile birleştirmeye hazır olduğunuzdan emin olun.

  1. Geliştirmenin, uzak sunucunuzdaki en son değişikliklerle güncel olup olmadığını kontrol edin. git fetch
  2. Getirme işlemi tamamlandığında git checkout master.
  3. Ana şubenin çalıştırarak en son güncellemelere sahip olduğundan emin olun git pull
  4. Hazırlıklar tamamlandıktan sonra, birleştirmeye aşağıdakilerle başlayabilirsiniz: git merge development
  5. Değişiklikleri ile itin git push -u origin masterve işiniz bitti.

Makalede git birleştirme hakkında daha fazla bilgi bulabilirsiniz .


3

1) Şube Geliştirme'de, git durumunu aşağıdaki komutu kullanarak kontrol edin:

git status

Taahhütsüz kod olmamalıdır. Öyleyse, kodunuzu Geliştirme dalına aktarın:

git add *

git commit -m "My initial commit message"

git push origin Development

2) Geliştirme dalında aşağıdaki iki komutu çalıştırın:

git branch -f master HEAD

git push -f origin master

Geliştirme şube kodunuzu ana şubeye gönderir.


Bu, tüm geliştirme taahhütlerini de ustalaştırmaya mı, yoksa sadece ustaya yeni bir tek taahhüt mi ekliyor?
yuvarlanıyor

1
bu gerçekten nasıl çalışıyor? özellikle "git şube ustası" olduğunda geliştirmek delilik gibi görünüyor. zaten master adlı bir dal varsa, master adlı yeni bir dalı nasıl oluşturabilirsiniz? dokümanlar -f'nin bunu yaptığını söylüyor: <branchname> öğesini <başlangıç ​​noktası> olarak sıfırlayın. Ne anlama geliyor?
John Little

Bu güç yerel ustayı uzak ustaya itmiyor mu? Bir ekipte çalışıyorsanız bu kötü bir fikir gibi görünüyor.
Nick

-fönerilmez.
DawnSong

2

@Sailesh ve @DavidCulp temel alınmıştır:

(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)

İlk komut, Sailesh yanıtı gerçekleşmeyecek şekilde uzak ana bilgisayara tüm yukarı akış taahhütlerinin yapılmasını sağlayacaktır.

İkincisi bir birleştirme gerçekleştirir ve sonra çözebileceğiniz çakışmalar oluşturur.

Bunu yaptıktan sonra, sonunda master'a geçmek için master'a göz atabilirsiniz.

Daha sonra geliştirme dalını yerel master ile birleştirirsiniz. No-ff bayrağı, tüm birleşmenin izlenebilir olması için master'da bir kesin düğüm oluşturur.

Bundan sonra birleştirmenizi taahhüt edip itebilirsiniz.

Bu prosedür, insanların görebileceği ustalıktan geliştirmeye birleştirme taahhüdü olmasını sağlar, o zaman geliştirme dalına bakarlarsa, geliştirme sırasında bu dalda yaptığınız bireysel taahhütleri görebilirler.

İsteğe bağlı olarak, geliştirme dalında neler yapıldığının bir özetini eklemek istiyorsanız, birleştirme işleminizi zorlamadan önce değiştirebilirsiniz.

EDIT: orijinal cevabım git merge masterhiçbir şey yapmadı önerdi git merge FETCH_HEAD, kökeni / usta getirdikten sonra yapmak daha iyidir


2

Geliştirme şubesini 'kontrol ettikten' sonra ...

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

 git checkout master 
 git merge dev
 git push origin master 

1

Gerrit kullanıyorsanız, aşağıdaki komutlar mükemmel çalışır.

git checkout master
git merge --no-ff development

Varsayılan kaydetme mesajı ile kaydedebilirsiniz. Değişiklik kimliğinin oluşturulduğundan emin olun. Emin olmak için aşağıdaki komutu kullanabilirsiniz.

git commit --amend

Ardından aşağıdaki komutla itin.

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

Aşağıdaki gibi bir hata mesajı ile karşılaşabilirsiniz.

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

Bu sorunu çözmek için, gerrit proje yöneticisi 'refs / for / refs / heads / master' veya 'refs / for / refs / heads / *' (gelecekte tüm şubeleri kapsayacak) adında başka bir referans oluşturmalıdır. Ardından, bu referansa 'Push Merge Command' izni verin ve GCR'yi göndermek için gerekirse 'Submit' izni verin.

Şimdi, yukarıdaki push komutunu tekrar deneyin ve çalışması gerekir.

Kredi:

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

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


1

Bence en kolay çözüm

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

Bu aynı zamanda kullanılan tüm dalların tarihini de korur


-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

1
Yerel şubenizin neden eksik olduğunu bilmediğinizden çok emin değilseniz, bu hatanın neredeyse hiçbir zaman doğru bir şey olmadığını gördüğünüzde zorlama. Genel olarak, 3. adıma geri dönmek çok daha iyidir pull. Ayrıca, bu cevabın mevcut cevaplara kıyasla kattığı değeri açık değildir.
Kyle Strand
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.