Git birleştirme bir fark olmasına rağmen “Zaten güncel” raporlarını veriyor


286

Master ve test: 2 şubeli bir git depom var.

Master ve test dalları arasında farklılıklar vardır.

Her iki dalda da tüm değişiklikler yapılmıştır.

Eğer yaparsam:

git ödeme yöneticisi
git fark testi

Değişiklikleri gösteren bir ekran görünür. Test dalındaki değişiklikleri birleştirmek istiyorum ve şunu da yapmak istiyorum:

git birleştirme testi

Ancak "Zaten güncel" mesajını alın

Ancak, her bir farklı dalın altındaki dosyaları incelemek farklılıkları açıkça göstermektedir.

Burada sorun nedir ve nasıl çözerim?


Değiştirilmemiş değiştirilmiş kodunuz var mı?
ozma

Yanıtlar:


146

“Zaten güncel” mesajı, birleştirmeye çalıştığınız şubedeki tüm değişikliklerin zaten üzerinde bulunduğunuz şubeyle birleştirildiği anlamına gelir. Daha spesifik olarak, birleştirmeye çalıştığınız dalın geçerli dalınızın bir ebeveyni olduğu anlamına gelir . Tebrikler, bu şimdiye kadar yapacağınız en kolay birleştirme. :)

gitkDeponuza bir göz atmak için kullanın . “Test” dalı için etiket “ana” şube etiketinizin altında bir yerde olmalıdır.

Şubeniz, ebeveyniyle ilgili olarak günceldir. Birleşmeye göre, ebeveynte son birleşmeden bu yana yeni bir değişiklik yok. Bu, dalların aynı olduğu anlamına gelmez, çünkü çalışma dalınızda çok fazla değişiklik yapabilirsiniz ve bu sizin gibi geliyor.

12/10/2019 Düzenle:

Bu cevaba yapılan yorumda Charles Drake'e göre, sorunu çözmek için bir çözüm:

git checkout master
git reset --hard test

Bu onu tekrar 'test' seviyesine getirir.

Sonra şunları yapın:

git push --force origin master

değişiklikleri merkezi repoya zorlamak için.


2
Kutsal cr * p! Haklısın! Sanırım olan başka bir dalın (kararsız gelişme) ustayla yanlış birleştirilmesi ve test dalının kararsızlığın bir alt kümesi olmasıydı. Yapmaya çalıştığım birleşme ustayı 'test' seviyesine geri getirmekti.
Charles Darke

2
Sağ. Bu işlem hiç mantıklı gelmediği için Git hiçbir şey yapmayı reddediyor. :)
Bombe

24
Şimdi ne yaptım: git checkout master; git reset --hard testi; Bu onu tekrar 'test' seviyesine getirir. Daha sonra değişiklikleri merkezi repoya zorlamak için bir "git push - force origin master" yaptım.
Charles Darke

22
Git "ebeveyn ile birleştirmek için çalışıyor" demek için bir uyarı olsaydı güzel olurdu.
Charles Darke

1
Uzak tarafta zaten var olan dalın torunu olmayan bir dalı itmek kötü bir şey olarak kabul edilir: Git-push ve git-pull için man sayfalarındaki tartışmalara bakın.
Bombe

131

Uzaktaki ana bilgisayarda değişiklikler olduğunu bildiğimde bu sık sık başıma geliyor, bu yüzden bunları kullanarak birleştirmeye çalışıyorum git merge master. Ancak, bu uzak ana sistemle değil, yerel ana sisteminizle birleşir.

Birleştirme yapmadan önce, ödeme ustası ve sonra git pullorada. Ardından, yeni değişiklikleri şubenizde birleştirebileceksiniz.


7
Dalların değiştirilmesinden kaçınılabilecek bir yol var mı, hala birleştirilecek daldayken birleştirilecek dalın çekilmesi ve daha sonra birleştirilmesi gibi bir şey var mı?
Japheth Ongeri - inkalimeva

Ahh, iyi olan. git fetchŞu anda farklı bir dalda olsam bile ana dalı güncelleyeceğini düşündüm . Öyle değil. Teşekkürler! fetchHangi şubenin alınacağını belirtmenize izin veren bir seçenek olduğundan eminim .
Raik

1
@Raik Yapabilirsiniz git fetch --all, ancak bu sadece dalları getirir, çekmez .
Ingo Bürk

6
@ JaphethOngeri-inkalimeva Sadece yapabilirsiniz git fetch --all && git merge origin/master. masterUzaktan değişiklikleri birleştirmek için yerelinizi güncellemeye gerek yoktur .
Ingo Bürk

@ IngoBürk 2 şubem vardı, 1 ile git merge masterve 1 ile güncellendi git merge origin/master. Ayrıca teslim masterve git pull2 şube güncelleme önce. aynı içeriği paylaşsalar da, 2 dal arasında bir PR oluşturmak bazı fark dosyaları gösterdi. git pullHedef dal tarafından gösterilen özellik dalı olarak düzeltildi : Already up to date! Merge made by the 'recursive' strategy.bu değişiklik olmadan birleştirme taahhüdü ile sonuçlandı, ancak beklenmedik fark dosyaları PR kaldırıldı. "eşdeğer" yerel ve uzak dalların birleştirilmesi arasında neden bir fark olduğu hakkında bir fikriniz var mı?
wrapperapps

45

masterAşağıdaki taahhüt geçmişine sahip bir şubeniz olduğunu varsayalım:

A -- B -- C -- D

Şimdi, bir şube testi oluşturuyorsunuz, üzerinde çalışıyorsunuz ve 4 taahhüt gerçekleştiriyorsunuz:


                 E -- F -- G -- H
                /
A -- B -- C -- D

master'nin başı D'yi ve test' nin başı H'yi gösterir.

Birleştirme yapmak istediğiniz şubenin BAŞLIĞI, birleştirmek istediğiniz şubenin taahhüt zincirinin bir ebeveyni olduğunda "Zaten güncel" mesajı görünür. Durum bu, burada: Dbir ebeveyni E.

Dan birleştirme bir şey yok testetmek masterhiçbir şey değişmemiş olmasına beri, mastero zamandan bu yana. Burada yapmak istediğiniz şey Git'e tam anlamıyla masterH'yi işaret etmesini söylemektir , bu yüzden ustanın şubesi aşağıdaki taahhüt tarihine sahiptir:

A -- B -- C -- D -- E -- F -- G -- H

Bu Git komutu için bir iştir reset. Ayrıca bir yapacağız böylece çalışma dizini, bu değişikliği yansıtacak şekilde istediğiniz sabit sıfırlama:

git reset --hard H

3
Geçmişte, kullanmanın git reset --hardoldukça zor bir şey olduğu söylendi, taahhütlerini kaybedebilir mi? Bu değişiklikleri yapmanın daha güvenli bir yolu var mı yoksa git reset --hardabartmanın tehlikeleri var mı?
Graham R. Armstrong

1
Bu komut aklı başında, endişelenme. --hardSeçeneği dikkate almanız gereken tek şey , aslında çalışma dizininizi değiştirdiği ve sonuç olarak değişmeden değişiklikleri kaybettiğinizdir. Şahsen, git statusrepo'mun temiz veya beklenen durumda olduğundan emin olmak için her elle çalıştırılan git komutundan önce ve sonra yapıyorum.
Marek Stanley

bu, "Şubeniz ve" başlangıç ​​noktanız / ana verileriniz birbirinden ayrıldı "durum mesajı verir, bunu nasıl çözebilirim?
Eido95

1
Keşke size birden fazla oy verebilsem. Teşekkürler!
KMC

Bu --hardseçeneğe ihtiyaç var mı ? Ben birkaç kez bu durumda bulundum ve her zaman olmadan sıfırlama --hard. Taahhüt edilmeyen değişiklikleri kaybetme riski olmadan gayet iyi çalıştı.
Casimir

16

Benim için işe yarayan, diyelim ki şube1 var ve şube2 ile birleştirmek istiyorsun.

Git komut satırını açıp branch2 kök klasörüne gidin ve şunu yazın:

git checkout branch1
git pull branch1
git checkout branch2
git merge branch1
git push

Eğer comflicts varsa git push yapmak zorunda değilsiniz, ama önce conflits çözmek ve sonra itin.


6

Birleştirme her zaman geçerli HEAD ile bir veya daha fazla işlem (genellikle, şube başı veya etiketi) arasındadır
ve dizin dosyası başladığında HEAD işleminin ağacıyla (yani son işlemin içeriği) eşleşmelidir.
Başka bir deyişle, git diff --cached HEADhiçbir değişiklik bildirmemelidir.

Birleştirilmiş taahhüt zaten içinde HEAD. Bu, "Zaten güncel" olarak adlandırılan en basit durumdur.

Bu, testteki taahhütlerin zaten master'da birleştirildiği anlamına gelmelidir, ancak diğer taahhütler master'da yapıldığından git diff testhala bazı farklılıklar verecektir.


6

Bunun nedeni, birleştirmek istediğiniz şubenin yerel kopyasının güncel olmamasıdır. Şubem var, aradım MyBranchve birleştirmek istiyorum ProjectMaster.

_>git status
On branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

nothing to commit, working tree clean

_>git merge ProjectMaster
Already up-to-date.

Ancak birleştirilmesi gereken değişiklikler olduğunu biliyorum !

İşte yazdığım zaman git merge ProjectMastergit , bu şubenin güncel olmayan yerel şubeme bakar . Durumun böyle olup olmadığını görmek için önce Git'e şubelerimin güncel olup olmadığını kontrol etmesini ve görmesini ve eğer varsa, uh, kullanarak herhangi bir değişiklik getirmesini söylerim fetch. Sonra orada neler olduğunu görmek için birleştirmek istiyorum şubeye atlıyorum ...

_>git fetch origin

_>git checkout ProjectMaster
Switched to branch ProjectMaster
**Your branch is behind 'origin/ProjectMaster' by 85 commits, and can be fast-forwarded.**
  (use "git pull" to update your local branch)

Ah-ha! Yerel kopyam 85 komisyon tarafından bayat, bu her şeyi açıklıyor! Şimdi, Pulleksik olduğum değişiklikleri aşağıya indiriyorum, sonra atlayıp MyBranchtekrar birleştirmeyi deneyin.

_>git pull
Updating 669f825..5b49912
Fast-forward

_>git checkout MyBranch-Issue2
Switched to branch MyBranch-Issue2
Your branch is up-to-date with 'origin/MyBranch-Issue2'.

_>git merge ProjectMaster
Auto-merging Runbooks/File1.ps1
CONFLICT (content): Merge conflict in Runbooks/Runbooks/File1.ps1

Automatic merge failed; fix conflicts and then commit the result.

Ve şimdi düzeltmem gereken bir sorun daha var ...


5

Bu bana başıma geldi çünkü garip bir şekilde GIT yerel şubenin uzak şubeden farklı olduğunu düşündü. Bu, şube grafiğinde görüldü: iki farklı dal görüntüledi: uzaktan kumandalar / orijin / şube_adı ve şube_adı.

Çözüm, yerel repoyu kaldırmak ve uzaktan klonlamaktı. Bu şekilde GIT, uzaktan kumandalar / origin / branch_name> ve branch_name öğelerinin gerçekten aynı olduğunu anlardı ve git merge branch_name.

rm <my_repo>
git clone <my_repo>
cd <my_repo>
git checkout <branch_name>
git pull
git checkout master
git merge <branch_name>

Bu Acarter'ınkiyle aynı cevap değil mi?
Andrew C

Acarter'ın aslında noktayı kaçırdığını düşünüyorum - uzaktan kumandada herhangi bir değişiklik yoktu - bu hiç sorun değildi. "Git checkout master" ı ve sonra "git merge <branch_name>" hızlı ileri birleştirme zorlamak gerekiyordu. Diğer taraftan, şube ustanın önünde olduğu için hiçbir şey yapmadı. Bombe'nin cevabı güzel bir açıklama ama sorunun "nasıl çözüleceği" kısmını hiç cevaplamadı.
MrMas

5

git merge origin/masteronun yerine git merge masterbenim için çalıştı. Master'ı özellik dalında birleştirmek için şunları kullanabilirsiniz:

git checkout feature_branch
git merge origin/master

5

Önce birleştirmek istediğiniz dalı kontrol ettiğinizden ve ardından çektiğinizden emin olun (böylece yerel sürümünüz uzak sürümle eşleşir).

Ardından, birleştirmeyi yapmak istediğiniz dalınıza geri dönün ve git birleştirme işleminizin çalışması gerekir.


1
Bu benim için buydu - efendideyken bir çekim yaptım; "şube" de yeni taahhütler aldığımı biliyordum. "Şube" yi master ile birleştirmeye çalıştım - "Zaten güncel". Git çıkış "şube" - var " git pull
Şubeniz

3

bana oldu ve aynı senaryoya sahip olup olmadığımdan emin değilim, bu sayfaya gönderildi, ama benimki o "test" dalını yeniden birleştirmeye çalışıyordum.

Bu yüzden daha önce birleştirdim, ancak bu birleştirme sırasında bazı spesifik değişiklikleri kasten hariç tutuyorum, bu yüzden dallar arasında bazı farklar var. Daha sonra yeniden birleştirmeye çalışıyordum, çünkü daha önce hariç tuttuğum belirli bir değişiklik / dosya eklemek zorunda olduğumu fark ettim / unuttum ve birleştirme yaparsam daha önce hariç tuttuğum tüm değişiklikleri göstereceğini umuyordum , ancak yanılmışım ve bunun yerine "Zaten güncel" iletisini alıyorum.

@ Bombe'nin yorum / cevabını okuduktan sonra, haklı ve git Sanırım bu şekilde davranıyor, bu yüzden yaptığım şey test dalındaki dosyaların sabit yedeğini almak, daha sonra ana dalı kontrol etmek ve dosyaları manuel olarak yapıştırmak ve taahhüt etmekti. yeni değişikliklermiş gibi.

bunun doğru yol olup olmadığından emin değilim veya aynı sorunu yaşayan başkalarına yardımcı olabilir, ancak benim özel durumuma çözüm sağladı.


Aynı durum burada. Senaryo, bir "tümleştirme" dalını birden çok "özellik" dalına bölmek istememdir.
Yadli

2
Bunun yerine manuel macunun, geçerli dalı haline bir dalı dosyaları doğrudan ödeme yapabilirsiniz: git checkout srcBranch -- path/to/file. Dosya globlarını da kullanabilir.
Todd

Teşekkürler, ödeme yönteminizi kullandım, ancak koydum checkout srcBranch -- *ve sonra farklarıma baktım
portforwardpodcast

2

A dalını B dalına birleştirmek "Zaten güncel" olarak bildiriyorsa, tersi her zaman doğru değildir. Sadece B dalı A dalının soyundan geliyorsa doğrudur, aksi takdirde B dalı A'da olmayan değişikliklere sahip olabilir.

Misal:

  1. Master ve A dallarını oluşturursunuz
  2. Master'da bazı değişiklikler yaparsınız ve bu değişiklikleri sadece B dalında birleştirirsiniz (A dalını güncellemez veya güncellemeyi unutmazsınız).
  3. A dalında bazı değişiklikler yapar ve A'yı B ile birleştirirsiniz.

Bu noktada A'dan B'ye birleştirme "Zaten güncel" olarak bildirir, ancak dallar farklıdır, çünkü dal B'nin anadan güncellemeleri vardır, ancak dal A değildir.


2

Git Bash kullanarak bu senaryo ile karşı karşıya kaldı.

Depomuzun birden fazla şubesi vardır ve her şubenin farklı bir işlem döngüsü vardır ve birleştirme işlemi arada bir gerçekleşir. Old_Branch, New_Branch için üst öğe olarak kullanıldı

Old_Branch, New_Branch ile birleştirilmesi gereken bazı değişikliklerle güncellendi

Tüm şubelerden tüm kaynakları almak için herhangi bir şube olmadan aşağıdaki çekme komutunu kullanıyordum.

git çekme kökeni

Tuhaf bir şekilde bu, tüm taahhütleri tüm şubelerden çekmiyor. Belirtilen neredeyse tüm dalları ve etiketleri gösterdiği gibi düşünmüştü.

Yani bu düzeltmek için Old_Branch kullanarak son çekti

git checkout Old_Branch

git çekme kökenli Old_Branch

Şimdi kontrol edildi New_Branch

git checkout Yeni_Branç

Emin olmak için çekti

git çekme orijini New_Branch

git birleştirme Old_Branch

Viyola, Old_Branch'tan New_Branch'a düzeltmek için çatışmalar yaşadı :)


0

Bana da aynısı oldu. Ancak senaryo biraz farklıydı, ana dalım vardı ve ondan release_1 (söyle) yaptım. Release_1 dalında bazı değişiklikler yaptı ve başlangıç ​​noktasına birleştirdi. sonra ssh yaptım ve uzak sunucuda yine yeni bir şube sürümü_ yürüten git check -b release_1 komutunu kullanarak release_1 çıkışını yapıyorum! zaten mevcut olan şube release_1 kaynağını kontrol etmek yerine master'dan. "-B" anahtarını kaldırarak sorunu çözdü


0

Ben de aynı problemi yaşadım. Uzaktan kumandada değişiklikler vardı ve hala "Zaten güncel" görünüyordu. Depoyu yeniden derlemek benim için sorunu çözdü.


0

Aptal ama olabilir. Şöyle bir #91-fix-html-markupbirleştirmeyi yaparsanız , şube adınızın önünde bir sorun başvurusu olduğunu (örneğin ) varsayalım :

$ git merge #91-fix-html-markup

amaçlandığı gibi çalışmaz çünkü ondan sonraki her şey #göz ardı edilir, çünkü #satır içi bir yorum başlar.

Bu durumda şube belirtilmemesi yeniden adlandırabilirsiniz #veya şube adını çevrelemek için tek tırnak kullanın: git merge '#91-fix-html-markup'.

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.