Git ve “'x' dalı tam olarak birleştirilmemiş” Hatası


295

İşte ana daldan kullandığım komutlar

git branch experiment
git checkout experiment

Sonra dosyalarımda bazı değişiklikler yaptım, değişiklikleri taahhüt ettim ve yeni şubeyi GitHub'a gönderdim.

git commit . -m 'changed files'
git push -u origin experiment

Daha sonra deney dalımı ana dalla birleştirmeye karar verdim.

git checkout master
git merge experiment

Sonunda değişiklikleri GitHub'a aktardım.

git push -u origin master

Deneme şubemi silmeyi deneyene kadar her şey yolunda gitti

git branch -d experiment

error: The branch 'experiment' is not fully merged.Git için biraz yeniyim hata mesajını aldım ve iki dalı daha ne kadar birleştirebileceğimi bilmiyorum. Burada ne eksik?


2
Bu yayın size yardımcı oluyor mu? stackoverflow.com/questions/1710894/…
Chrisdigital

2
git commit --amend
Arcolye

12
Ayrıca - Bu iletinin şunlardan sonra görüneceğine dikkat edin squash: stackoverflow.com/q/41946475/109941
Jim G.

Bence en yaygın senaryo, şubeyi yerel olarak silmeden önce yeni birleştirilmiş değişikliklerinizi yapmanız gerekir.
Kuru üzümBranCrunch

Yanıtlar:


314

Not Açıklamalara yanıt olarak ifadeler değişti. Teşekkürler @slekse
Bu bir hata değil, bir uyarı. Silmek üzere olduğunuz dalın şunlardan hiçbirinden erişilemeyen taahhütler içerdiği anlamına gelir: akış yukarı kolu veya HEAD (şu anda teslim alınmış revizyon). Başka bir deyişle, taahhütleri kaybedebileceğiniz zaman¹.

Pratikte, muhtemelen değişiklikleri, yeniden temelli veya filtrelenmiş taahhütleri değiştirdiğiniz anlamına gelir ve bunlar aynı görünmüyor .

Bu nedenle , diğer referansı silerek referans dışı olduğunuz taahhütleri içeren bir şubeyi kontrol ederek uyarıyı önleyebilirsiniz.

Aslında hayati taahhütlerin eksik olmadığını doğrulamak isteyeceksiniz:

git log --graph --left-right --cherry-pick --oneline master...experiment

Bu size şubeler arasında paylaşılmayanların bir listesini verecektir. Merak ediyorsanız, onsuz bir fark olabilir --cherry-pickve bu fark, aldığınız uyarının nedeni olabilir:

--cherry-pick

Taahhüt kümesi simetrik farkla sınırlı olduğunda, "diğer tarafta" başka bir taahhütle aynı değişikliği getiren herhangi bir taahhüdü atlayın. Örneğin, iki dalınız (A ve B) varsa, bunların yalnızca bir tarafındaki tüm taahhütleri listelemenin olağan bir yolu, bu seçeneğin açıklamasındaki yukarıdaki örnek gibi - sağa sağdadır. Bununla birlikte, diğer daldan kirazla alınan taahhütleri gösterir (örneğin, "3. on b", dal A'dan kirazla toplanmış olabilir). Bu seçenekle, bu tür taahhüt çiftleri çıktıdan çıkarılır.


Default onlar gerçekten sadece bir süre sonra toplanan çöp, varsayılan olarak. Ayrıca, git-branchkomut tüm dalların revizyon ağacını kontrol etmez . Uyarı, açık hatalardan kaçınmak için vardır.

² (Buradaki tercihim silme işlemini zorlamaktır, ancak ekstra güvence almak isteyebilirsiniz).


24
Teşekkürler. Anahtar kelime "başka bir ref başlığından erişilemeyen taahhütler içeriyor" idi. Artık deneme dalına ihtiyacım olmasa ve zaten master ile birleşmiş ve kökeni silmeyi planlamış olsam da, değişiklikleri denemeye taşımak için değişiklikleri itinceye kadar git mutlu olmayacaktı. Sanırım bu uyarı bir çeşit akıl kontrolü idi.
mellowsoon

35
-1 "Bu, silmek üzere olduğunuz dalın başka herhangi bir ref başlığından erişilemeyen taahhütler içerdiği anlamına gelir." Bu doğru değil. Uyarı, dalın yukarı akışından (varsa) veya mevcut KAFADAN erişilemeyeceği anlamına gelir. Git-şubesinin kılavuz sayfasına bakınız.
sleske

3
@TachyonVortex Güzel bağlantı. Git branch -vv komutu benim için neler olduğunu netleştirdi.
Jason Massey

11
@sleske Yorum için teşekkürler - bu cevap gerçekten düzenlenmelidir. Ana açıklayıcı cümle yanlış olduğu için son derece yükseltilmiş bir utanç. Sadece bu problemi yaşadım ve sorunun ne olduğunu anlamaya çalışmak için can sıkıcı uzun bir zaman geçirdim ve sadece uzaktan izleme şubesi çekme isteğinin bir parçası olarak silindi ve ustadan değişiklikleri çektiğimden beri yerel şubede. Tek 'sorun' silinmiş uzaktan izleme dalı bulmak değildi (ve aynı nedenle yerel şube silmeye çalışıyordum).
ely

3
Evet, yalnızca yerel bir dalı, oluştururken bulunduğunuz daldan farklı bir dalda silmeye çalışırken olabilir. "Başka bir referanstan ulaşılamayan taahhütler" yanlış ve gereksiz derecede korkutucu!
Amalgovinus

80

Drew Taylor'un işaret ettiği gibi, -d ile şube silme sadece mevcut HEAD'ı dalın "tamamen birleştirilip birleştirilmediğini" belirlemede dikkate alır . Şube verirsen, daha şikayet edilir diğer bazı şube ile birleşti. Hata mesajı bu konuda kesinlikle daha açık olabilir ... Silmeden önce birleştirilmiş şubeyi kontrol edebilir veya sadece git -D dalını kullanabilirsiniz. Büyük harf-D, kontrolü tamamen geçersiz kılacaktır.


2
Mevcut HEAD ile ilgili kısım benim için düzeltti. Efendim, çatışan dalını oluşturduğum özellik dalından farklıydı: D
viki.omega9

1
Git'i öğrenen biri için "güncel" kelimesi "HEAD" ile gereksiz görünüyor mu? Bir uncurrent BAŞ diye bir şey yoktur - tanım gereği BAŞ olan cari dalı. Bir şey mi kaçırıyorum? Sanırım "mevcut şube" ya da "HEAD" diyebilirsiniz ama "mevcut HEAD" diyemezsiniz.
Mark Lakata

Bunu değiştirmek / yapılandırmak için herhangi bir yolu var mı (örneğin, her zaman kontrol var origin/mastermı?) Sanırım origin/masterilk kontrol çok zahmetli değil, ama sadece bir tür garip akış gibi geliyor - neden origin/masteryerel olarak kontrol etmem gerekiyor? sadece değişikliklerimin orada birleştirildiğini doğrulamanız için mi?
Alec

15

Sehe'nin cevabını denedim ve işe yaramadı.

Birleştirilmemiş taahhütleri bulmak için şunu kullanın:

git log feature-branch ^master --no-merges

14

Bugün ilk başıma geldi, çünkü ilk uzun dalımı yeniden efendi haline getirdim. Bazılarının SO'nun başka bir yerindeki bir iş parçacığında söylediği gibi, hile dalı silmeye çalışmadan önce master'a geri dönüyordu. Master'a geri döndüğünde git, hiçbir uyarı yapmadan şubeyi silmekten mutluluk duyuyordu.


7
Burada özel bir sorun gibi görünmüyor, ama şimdi açıkladığınız problemle karşılaştım, çok teşekkürler!
Daniel Buckmaster

4

Git, bu dalı silerek geçmişinizi kaybedebileceğiniz konusunda uyarıyor. Gerçekte herhangi bir taahhütü silmese bile, şubedeki bazı taahhütlerin bir kısmı veya tamamı başka bir şubenin parçası değilse de ulaşılamaz hale gelir.

Şubenin experimentbaşka bir şubeye “tamamen birleştirilmesi” için, ipucu taahhüdü diğer şubenin ucunun bir atası olmalı ve taahhütleri experimentdiğer şubenin bir alt kümesinde yapmalıdır . Bu, experimenttüm taahhütleri diğer şube aracılığıyla depo tarihinin bir parçası olarak kalacağından, silinmeyi güvenli hale getirir . "Tamamen" birleştirilmelidir, çünkü zaten birkaç kez birleştirilmiş olabilir, ancak şimdi diğer şubede bulunmayan son birleştirmeden bu yana taahhütler eklenmiştir.

Git depodaki diğer tüm şubeleri kontrol etmez; sadece iki:

  1. Mevcut şube (HEAD)
  2. Eğer varsa, memba şubesi

experimentSizin durumunuzda olduğu gibi “yukarı akış kolu” muhtemelen origin/experiment. Eğer experimenttam şimdiki dalında birleştirilir, ardından Git hiçbir şikayeti ile siler. Değilse, ancak akış yukarı dalında tamamen birleştirilirse, Git aşağıdaki gibi bir uyarı ile devam eder:

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

Burada xxxxxxxxbir taahhüt kimliği belirtilir. Yukarı akışında tam olarak birleştirilmek, taahhütlerin experimentkaynak deposuna itildiğini gösterir, böylece onları burada kaybetseniz bile en azından başka bir yerde saklanabilirler.

Git diğer şubeleri kontrol etmediğinden, bir şubeyi silmek güvenli olabilir çünkü başka bir şubeyle tamamen birleştirildiğini bilirsiniz; bunu -Dbelirtilen seçenekle yapabilir veya önce o şubeye geçebilir ve Git'in sizin için tamamen birleştirilmiş durumu onaylamasına izin verebilirsiniz.


1
Anahtar " geçerli dalda tamamen birleştirilir ". X 'dalından X' tamamen X ile birleşti ve orijin / X 'i zaten sildim. Ama Y kontrol edildiğinde bu uyarıyı aldım. Ne zaman teslim XI X 'silmek mümkün. Bence oldukça aptalca.
Lawrence Dol

2
Bu cevap ilişkilendirme olmadan buradan aşırma olduğunu chimera.labs.oreilly.com/books/1230000000561/...
Mark LAKATA

4

Açıklama ile En Kolay Çözüm (çift kontrollu çözüm) (daha önce problemle karşı karşıya kaldı)

Problem şu:

1- Şube silemiyorum

2- Terminal, henüz onaylanmamış bazı taahhütler olduğuna dair bir uyarı mesajı gösterir

3- kaptanı ve dalı kontrol ettiğimi ve aynı olduklarını bilmek (güncel)

çözüm:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

Açıklama:

şubeniz yukarı akış uzak şubesine (Github, bitbucket veya başka bir şekilde) bağlandığında, onu master'a birleştirmeniz (itmeniz) gerekir ve yeni değişiklikleri (taahhütleri) uzak repoya (Github, bitbucket veya her neyse) daldan,

kodumda yaptığım, master'a geçtim, sonra şubeyi birleştirin (yerel makinenizde aynı olduklarından emin olmak için), sonra tekrar şubeye geçtim ve güncellemeleri veya değişiklikleri uzaktan kumandaya ittim "git push" kullanarak kopyalayın.

Bundan sonra, master'a tekrar geçtim ve şubeyi silmeye çalıştım ve sorun (uyarı mesajı) kayboldu ve şube başarıyla silindi


3

birleştirilmeyen değişiklikleri görmek için şunu yaptım:

git checkout experiment
git merge --no-commit master

git diff --cached

Not: Bu, içinde masterolmayan değişiklikleri gösterir experiment.

Şunu unutmayın:

git merge --abort

İşiniz bittiğinde.


@IgorGanapolsky Dunno tam olarak olsa da, genellikle man git-resetve git reset komutları durum sorunlarından kurtulmak için yeterlidir.
ThorSummoner

3

Sadece şunu anlayabilirsiniz:

git log - kiraz ustası ... deneysel

--cherry seçenek şu anlama gelir: --right-only --cherry-mark --no-merges

git-log man sayfası dedi

Çıktıyı bizim tarafımızdaki taahhütlerle sınırlamak ve çatallı bir tarihin diğer tarafına uygulanmış olanları git log - cherry upstream ... mybranch, git cherry upstream mybranch ile işaretlemek yararlıdır.

Bilginize. --cherry-pickeşdeğer taahhütleri atlar, ancak --cherry-marksyapmaz. Memba bulmak ve yukarı yönlü ve ortak çalışan kamu dalı arasında güncellenmiş değişiklikleri zorlamak yararlıdır


1

Benim yerel git akış yukarı şubesi yoktu. Ben master, git checkout -b mybranch yerel bir şube yaratmıştı. Memba git git üzerinde bitbucket GUI ile bir şube oluşturdum ve yerel şubemi (mybranch) o memba şubesine ittim. Memba şubesini almak için yerel gitimde git getirme yaptıktan sonra, git şubesi -d mybranch yapabilirdim.


0

Bayrağın --forcegerçekten aradığınız şey olduğuna inanıyorum . git branch -d --force <branch_name>Şube zorla silmek için kullanın .

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.