Ayrılmış HEAD'ı master / orijin ile nasıl uzlaştırabilirim?


1558

Git'in dallanma karmaşıklıklarında yeniyim. Her zaman tek bir dal üzerinde çalışıyorum ve değişiklikler yapıyorum ve daha sonra periyodik olarak uzak kökenima geçiyorum.

Son zamanlarda bir yerde, bazı dosyaları kararlı hale getirme aşamasından çıkarmak için bir sıfırlama yaptım ve daha sonra rebase -ison birkaç yerel taahhütten kurtulmak için bir yaptım . Şimdi tam olarak anlamadığım bir durumdayım.

Çalışma git logalanımda tam olarak ne beklediğimi gösteriyor - Gitmek istemediğim taahhütler ve orada yeni olanlarla doğru trenindeyim.

Ama ben sadece uzak depoya doğru ittim ve farklı olan şey var - Rebase'de öldürdüğüm bazı taahhütler itildi ve yerel olarak işlenen yeniler orada değil.

Bence "master / origin" HEAD'den ayrıldı, ama bunun ne anlama geldiği, komut satırı araçlarıyla nasıl görselleştirileceği ve nasıl düzeltileceği konusunda% 100 net değilim.


Taahhütleri yeniden temellerin önüne ittiniz mi?
manojlds

@manojlds: Ne demek istediğinden emin değilim. Rebase'den biraz zaman geçirdim, ama hemen önce değil.
Ben Zotto

Daha önce olduğu gibi rebase kaldırıldı taahhütleri itti -i .. Cevabından sanmıyorum.
manojlds

@manojlds: Doğru. Sadece en son itişmelerden daha yeni taahhütleri öldürdüm. (Bahsettiğim gibi, o zamandan beri her şeyin yolunda olduğunu düşündüğüm için ittim)
Ben Zotto

I did a reset of some files to get them out of commit stagingKısmen ne yaptığınızı açıklayabilir misiniz ? sorular için üzgünüm :)
manojlds

Yanıtlar:


2521

İlk olarak, HEAD'in ne olduğunu ve ayrıldığında ne anlama geldiğini açıklığa kavuşturalım .

HEAD, şu anda teslim alınan işlemin sembolik adıdır. HEAD ayrılmadığında (“normal” 1 durum: bir şubeniz kontrol edildiğinde), HEAD aslında bir şubenin “ref” sini ve şube bu taahhüdü işaret eder. Böylece HEAD bir dala “tutturulur”. Yeni bir taahhütte bulunduğunuzda, HEAD'ın işaret ettiği şube yeni taahhüdü gösterecek şekilde güncellenir. HEAD otomatik olarak dalı takip ettiği için takip eder.

  • git symbolic-ref HEADverim refs/heads/master
    “Master” adlı dal teslim edilir.
  • git rev-parse refs/heads/masterverim 17a02998078923f2d62811326d130de991d1a95a
    Bu taahhüt, ana dalın şu anki ucu veya “başı” dır.
  • git rev-parse HEADaynı zamanda 17a02998078923f2d62811326d130de991d1a95a
    “sembolik ref” olmanın anlamı da budur. Başka bir referans yoluyla bir nesneye işaret eder.
    (Sembolik referanslar başlangıçta sembolik bağlantılar olarak uygulandı, ancak daha sonra sembolik olmayan platformlarda kullanılabilmeleri için ekstra yorumlu düz dosyalara dönüştürüldü.)

Biz HEADrefs/heads/master17a02998078923f2d62811326d130de991d1a95a

HEAD ayrıldığında, bir daldan dolaylı olarak birine işaret etmek yerine doğrudan bir taahhüdü işaret eder. Müstakil bir HEAD'in isimsiz bir dalda olduğunu düşünebilirsiniz.

  • git symbolic-ref HEAD ile başarısız fatal: ref HEAD is not a symbolic ref
  • git rev-parse HEADverim 17a02998078923f2d62811326d130de991d1a95a
    Sembolik bir referans olmadığından, doğrudan taahhüdün kendisine işaret etmelidir.

Biz HEAD17a02998078923f2d62811326d130de991d1a95a

Müstakil bir HEAD ile hatırlanması gereken önemli şey, işaret ettiği taahhüt başka bir şekilde referans verilmezse (başka hiçbir referansa ulaşamazsa), başka bir taahhüdü kontrol ettiğinizde “sarkan” olacaktır. Sonunda, bu tür sarkan taahhütler çöp toplama işlemi boyunca budanır (varsayılan olarak, en az 2 hafta tutulur ve HEAD'in refloguyla referans gösterilerek daha uzun süre saklanabilir).

1 Müstakil bir KAFA ile “normal” iş yapmak gayet iyi, sadece balık bırakılan geçmişi reflog dışında bırakmak zorunda kalmamak için ne yaptığını takip etmek gerekir.


Etkileşimli bir yeniden tabanın ara adımları, bağımsız bir HEAD ile yapılır (kısmen aktif dalın reflogunu kirletmemek için). Tam rebase işlemini tamamlarsanız, orijinal şubenizi rebase işleminin kümülatif sonucu ile günceller ve HEAD'ı orijinal şubeye yeniden bağlar. Benim tahminim, rebase sürecini asla tam olarak tamamlamamanızdır; bu, rebase operasyonu tarafından en son işlenen taahhüdü işaret eden müstakil bir KAFA ile size bırakacaktır.

Durumunuzdan kurtulmak için, müstakil HEAD'in şu anda işaret ettiği taahhüdü gösteren bir şube oluşturmalısınız:

git branch temp
git checkout temp

(bu iki komut şu şekilde kısaltılabilir git checkout -b temp)

Bu, HEAD'inizi yeni tempşubeye yeniden bağlayacaktır .

Ardından, mevcut taahhüdü (ve geçmişini) üzerinde çalışmayı beklediğiniz normal şubeyle karşılaştırmalısınız:

git log --graph --decorate --pretty=oneline --abbrev-commit master origin/master temp
git diff master temp
git diff origin/master temp

(Muhtemelen günlük seçeneklerini denemek isteyeceksiniz: ekleyin -p, --pretty=…tüm günlük mesajını görmek için bırakın , vb.)

Yeni tempşubeniz iyi görünüyorsa, masteronu işaret edecek şekilde güncellemek isteyebilirsiniz :

git branch -f master temp
git checkout master

(bu iki komut şu şekilde kısaltılabilir git checkout -B master temp)

Daha sonra geçici dalı silebilirsiniz:

git branch -d temp

Son olarak, muhtemelen yeniden kurulan tarihi zorlamak isteyeceksiniz:

git push origin master

--forceUzak dal yeni taahhüde "hızlı iletilemiyorsa" (yani varolan bir taahhüdü düşürdünüz veya yeniden yazdınız veya başka bir tarih geçmişini yeniden yazdıysanız), bu komutun sonuna eklemeniz gerekebilir .

Bir rebase operasyonunun ortasındaysanız, muhtemelen temizlemelisiniz. Dizini arayarak bir rebase işleminin devam edip etmediğini kontrol edebilirsiniz .git/rebase-merge/. Devam eden rebase'i yalnızca bu dizini silerek manuel olarak temizleyebilirsiniz (örneğin, etkin rebase işleminin amacını ve içeriğini artık hatırlamıyorsanız). Genellikle kullanırsınız git rebase --abort, ancak bu muhtemelen kaçınmak istediğiniz bazı ekstra sıfırlama yapar (HEAD'ı orijinal şubesine geri taşır ve orijinal taahhüdüne sıfırlar, bu da yukarıda yaptığımız bazı işleri geri alır).


6
İlginç olan man git-symbolic-ref: "Geçmişte, .git/HEADsimgesel bir bağlantıydı refs/heads/master. Başka bir şubeye geçmek istediğimizde, yaptık ln -sf refs/heads/newbranch .git/HEADve hangi şubede olduğumuzu bulmak istediğimizde yaptık readlink .git/HEAD. Ancak sembolik bağlantılar tamamen taşınabilir değil , artık kullanımdan kaldırılmıştır ve varsayılan olarak sembolik referanslar (yukarıda açıklandığı gibi) kullanılmaktadır. "
Dmitry Minkovsky

10
@AntonioSesto'ya katılıyorum: çoğu proje için (oldukça büyük projeler bile) Git olan akıllara durgunluk veren karmaşıklığa ihtiyacınız yok. Beynim çok açık bir şekilde aşırı tasarlanmış bir şeyle boğuşuyor. İhtiyacım yok ve istemiyorum.
Jasper Sprengers

36
Bu iyi bir cevap, ama geçici dal için gerek olmadığını düşünüyorum (genellikle kendim kullanıyorum). git branch -f master HEAD && git checkout masteryeterli - hedefinizin mevcut kafanızı korumak, ancak onu tanımlamak olduğunu varsayalım master. Diğer hedefler de mantıklı ve diğer tarifleri çağırıyor.
Adrian Ratnapala

38
Lol uzunluğu hakkında gurning yorumda. Oysa geri kalanımız basitçe "Durumunuzdan kurtulmak için [...]" yazan çizgiye ulaşıncaya kadar tararız ve oradan gideriz - okuyabileceğimiz iyi açıklanmış yararlı bir arka plan olduğunu akılda tutarak Yağmurlu bir günde. Seçenek size zarar vermez fazla okumak için, ama yok fayda başkalarına durun.
underscore_d

5
Bu yüzden gitmekten nefret ediyorum.
Monica Heddneck

626

Sadece bunu yap:

git checkout master

Veya saklamak istediğiniz değişiklikleriniz varsa şunları yapın:

git checkout -b temp
git checkout -B master temp

57
Bu tehlikeli bir yanıttır. Bu yanıta gelen insanlar farklı durumlara sahiptir ve "bunu düzeltmek için bunu yapın" yanıtları soruları yanıtlamaz. Bu işi kolayca yok edebilir.
Archonic

15
! "git checkout master", ayrılmış kafa master'ın bir parçası değilse tüm değişikliklerin kaybolmasına neden olur!
Tony

3
@Blauhirn Muhtemelen şubeyi kontrol ettiniz. Şube hala aynı taahhüdü işaret ediyor, ancak farklı bir 'modda'sınız.
Daniel Alexiuc

1
git reset"Ne yaptığınız hakkında bir fikriniz yoksa, durdurun" uyarısıyla gelmelidir. İşin son haftasını kaybettiğimi düşünerek bir saatlik terörden kurtuldum. Teşekkürler!
Opus1217

1
@Archonic ile aynı fikirde ol Herhangi bir komutu körü körüne çalıştırmadan önce git'in nasıl çalıştığını anlamak önemlidir. Büyük cevabı okumadan zaman kazanabilirsiniz, ancak işiniz kaybolursa daha fazla zaman kaybedebilirsiniz.
Yusufali2205

132

Bu sorunla karşılaştım ve en çok oy alan cevabı okuduğumda:

HEAD, şu anda teslim alınan işlemin sembolik adıdır.

Düşündüm ki: Ah-ha! Eğer HEADsembolik isim taahhüt Checkout Currenlty içindir, ben karşı uzlaştırabilirsiniz masterkarşı rebasing tarafından master:

git rebase HEAD master

Bu komut:

  1. kontrol eder master
  2. tanımlar ana kaydedilmesini HEADnoktasına arkasından HEADuzaklaşmıştırmaster
  3. bu taahhütleri master

Sonuçta olan tüm kaydedilmesini olduğunu HEADancak masteraynı zamanda daha sonra master. masterkontrol altında kalır.


Uzaktan kumanda ile ilgili olarak:

Rebase'de öldürdüğüm birkaç taahhüt itildi ve yerel olarak işlenen yeniler orada değil.

Uzak geçmiş artık yerel geçmişiniz kullanılarak hızlı bir şekilde iletilemez. git push -fUzak geçmişin üzerine yazmak için zorla ( ) zorlamanız gerekir . Herhangi bir ortak çalışanınız varsa, bunu herkesle koordine etmek genellikle mantıklıdır, böylece herkes aynı sayfada olur.

masterUzaktan kumandayı zorladıktan sonra origin, uzaktan izleme şubeniz origin/masterile aynı taahhüdü gösterecek şekilde güncellenir master.


3
git: "İlk önce, çalışmanızı tekrar oynatmak için geri sarma kafası ... Master'ı HEAD'e hızlı iletin." ben: "güzel!"
Benjamin

81

Ayrılmış kafanın temel açıklaması için buraya bakın:

http://git-scm.com/docs/git-checkout

Görselleştirmek için komut satırı:

git branch

veya

git branch -a

aşağıdaki gibi çıktı alacaksınız:

* (no branch)
master
branch1

* (no branch)Şovlarının müstakil kafasına içindedir.

Bir git checkout somecommitvb. Yaparak bu duruma gelebilirdiniz ve bu sizi aşağıdakilerle uyardı:

'Müstakil KAFA' durumundasınız. Etrafınıza bakabilir, deneysel değişiklikler yapabilir ve bunları yerine getirebilirsiniz ve bu durumda yaptığınız herhangi bir taahhüdü başka bir ödeme yaparak şubeleri etkilemeden atabilirsiniz.

Oluşturduğunuz taahhütleri tutmak için yeni bir şube oluşturmak istiyorsanız, bunu (şimdi veya daha sonra) checkout komutuyla -b'yi kullanarak yapabilirsiniz. Misal:

git checkout -b Instagram Hesabındaki Resim ve Videoları new_branch_name

Şimdi onları ustalaşmak için:

Bir git reflogveya hatta adil yapın git logve taahhütlerinizi not edin. Şimdi git checkout masterve git mergetaahhütler.

git merge HEAD@{1}

Düzenle:

Eklemek için, git rebase -iyalnızca ihtiyacınız olmayan taahhütleri silmek / öldürmek için değil, aynı zamanda bunları düzenlemek için de kullanın. Sadece taahhüt listesinde "düzenle" den bahsettiğinizde, taahhüdünüzü değiştirebilir ve daha sonra git rebase --continuedevam etmek için a düzenleyebilirsiniz. Bu, asla bağımsız bir HEAD'e girmemenizi sağlayacaktır.


Buradaki ayrıntı ve harika bilgi göstergeleri için teşekkürler. Açık bir birleşmenin gerekli olmadığı anlaşılıyor, ancak bu geri döneceğim bazı kavramları görselleştirdi. Teşekkürler.
Ben Zotto

6
"@ {1}" ne yapıyor?
ebi

35

Müstakil taahhüdünüzü kendi şubesine alın

Sadece koş git checkout -b mynewbranch.

Öyleyse koşun git logve taahhütün şimdi HEADbu yeni dalda olduğunu göreceksiniz .


Bunu yaparsam, herhangi bir mynewbranchşeye bağlanır mı?
Benjohn

1
Evet, ayrılan kafanın takıldığı yere bağlanır, bu tam olarak istediğim şeydi. Teşekkürler!
Benjohn

22

sadece ana dalınız varsa ve "geliştirmek" veya bir özellik için geri dönmek istiyorsanız bunu yapın:

git checkout origin/develop

Not: menşei kontrol etme / geliştirme .

Bunlar şunlardır müstakil BAŞ devlet. Etrafınıza bakabilir, deneysel değişiklikler yapabilir ve bunları yerine getirebilirsiniz ve başka bir ödeme yaparak şubeleri etkilemeden bu durumda yaptığınız tüm taahhütleri atabilirsiniz ...

sonra

git checkout -b develop

İşe yarıyor :)


7
Benim için işe yarayan 'git checkout origin / develop' değil, 'git checkout develop'. 'Orijin / geliştirme' kullanılması her zaman hiçbir değişikliğe yol açmaz, böylece "HEAD orijin / gelişimden koparılır". 'Başlangıç' bölümünü atlamak her şeyi düzeltti.
DrStrangepork

18

Mevcut bağımsız HEAD'inizi itmek istiyorsanız (daha git logönce kontrol edin ) deneyin:

git push origin HEAD:master

müstakil KAFA'nızı başlangıçta ana şubeye göndermek için. Zorlamanız reddedilirse, git pull origin masterönce değişiklikleri kökenden almayı deneyin . Kökten gelen değişiklikleri umursamıyorsanız ve reddedilmişse, çünkü kasıtlı bir yeniden taban yaptınız ve orijin / ustayı şu anda ayrılmış dalınızla değiştirmek istiyorsunuz - o zaman zorlayabilirsiniz ( -f). Önceki taahhütlere erişiminizi kaybetmeniz durumunda git reflog, tüm şubelerden geçmişi görmek için her zaman koşabilirsiniz .


Bir ana dalı geri almak için, değişiklikleri korurken aşağıdaki komutları deneyin:

git rebase HEAD master
git checkout master

Bakınız: Git: "Şu anda hiçbir şubede değil." Değişiklikleri korurken bir şubeye geri dönmenin kolay bir yolu var mı?


2
Bu gerçekten ayrılmış taahhütleri orijin / üstata gönderir. Kafayı yerel şubeye bağlamak için şunu yapın: stackoverflow.com/a/17667057/776345
Paschalis

Bunu yaptığımda, Bu depo Git LFS için yapılandırılmış, ancak yolunuzda 'git-lfs' bulunamadı. Artık Git LFS'yi kullanmak istemiyorsanız, .git / hooks / post-checkout'u silerek bu kancayı kaldırın.
user2568374

16

Bu soruyu ararken buldum You are in 'detached HEAD' state.

Buraya ulaşmak için ne yaptığımı analiz ettikten sonra, geçmişte yaptığımla karşılaştırıldığında, bir hata yaptığımı keşfettim.

Normal akışım:

git checkout master
git fetch
git checkout my-cool-branch
git pull

Bu sefer yaptım:

git checkout master
git fetch
git checkout origin/my-cool-branch
# You are in 'detached HEAD' state.

Sorun yanlışlıkla yaptım:

git checkout origin/my-cool-branch

Ziyade:

git checkout my-cool-branch

Düzeltme (benim durumumda) yukarıdaki komutu çalıştırmak ve sonra akışı devam ettirmekti:

git checkout my-cool-branch
git pull

11

Aşağıdaki benim için çalıştı (sadece şube ustası kullanarak):

git push origin HEAD:master
git checkout master        
git pull

Birincisi, ayrılan KAFAYI uzak menşeine iter.

İkincisi şube yöneticisine geçer.

Üçüncüsü, şube yöneticisine bağlı olan KAFA kurtarır.

İtme reddedilirse ilk komutta sorunlar oluşabilir. Ancak bu artık kopuk bir kafa sorunu olmayacaktı, fakat kopuk KAFA'nın bazı uzak değişikliklerin farkında olmadığı gerçeğiyle ilgili.


işe yaramadı, anladım: Bu depo Git LFS için yapılandırılmış, ancak yolunuzda 'git-lfs' bulunamadı. Artık Git LFS'yi kullanmak istemiyorsanız, .git / hooks / pre-push komutunu silerek bu kancayı çıkarın. VE Şu anda bir şubede değilsiniz. Lütfen hangi şubeyle birleştirmek istediğinizi belirtin.
user2568374 12:18

11

Bugün bu sorunla karşılaştım ve bunu yaparak çözdüğümden eminim:

git branch temp
git checkout master
git merge temp

Bunu nasıl yapacağımı anladığımda iş bilgisayarındaydım ve şimdi de kişisel bilgisayarımda aynı sorunla karşılaşıyorum. Bu yüzden tam olarak nasıl yaptığımı görmek için iş bilgisayarına döndüğümde Pazartesi'ye kadar beklemek zorunda kalacak.


@StarShine Kenorb düzeltti. Artık bağımsız taahhütlerinizi yeni bir şubeye kaydeder, temp, master'a geçer ve temp'i master ile birleştirir.
Cees Timmerman

Neden ppl bu downvoting bilmiyorum, benim sorun stat sabit ama temp temp şube komutunu silmek isteyebilirsiniz.
Mart'ta GlassGhost

8

HEAD'in iyi durumda olduğundan tamamen eminseniz:

git branch -f master HEAD
git checkout master

Büyük ihtimalle kökeninize itemezsiniz, çünkü ustanız kökeninden sapmıştır. Reponun başka kimseyi kullanmadığından eminseniz, zorlayabilirsiniz:

git push -f

Başka hiç kimsenin kullanmadığı bir özellik dalındaysanız en kullanışlıdır.


6

Tek yapmanız gereken 'git checkout [branch-name]'; burada [branch-name], ayrılmış bir kafa durumuna girdiğiniz orijinal dalın adıdır. (Asdfasdf'den ayrılmış) kaybolacaktır.

Yani, örneğin 'dev' dalında asdfasd14314 -

'git checkout asdfasd14314'

şimdi müstakil bir haldesin

'git branch' şöyle bir şey listeler ->

* (detached from asdfasdf)
  dev
  prod
  stage

ama kopuk kafa durumundan çıkmak ve dev'e geri dönmek için ->

'git checkout dev'

ve sonra 'git branch' listelenecek ->

* dev
  prod
  stage

ama elbette, bağımsız kafa durumundan herhangi bir değişiklik yapmaya niyetlenmiyorsanız, ancak kendimi bunu çok fazla değişiklik yapma niyetinde değil, sadece önceki bir taahhüde bakmak için yapıyorum.


6

Chris'in işaret ettiği gibi, aşağıdaki durumlarım vardı

git symbolic-ref HEAD ile başarısız fatal: ref HEAD is not a symbolic ref

ancak git rev-parse refs/heads/master , iyileşebileceğim yerden iyi bir taahhüdü işaret ediyordu (Benim durumumda son taahhüt ve bu taahhüdü kullanarak görebilirsinizgit show [SHA]

Bundan sonra çok dağınık şeyler yaptım, ama düzeltilmiş görünen şey sadece,

git symbolic-ref HEAD refs/heads/master

Ve kafa yeniden takıldı!


1
Teşekkürler! Kafam kopmuştu. Onu ustalaşmak için yakalayabilirdim ama onlar sadece taahhüdü işaret eden ustaya işaret etmek yerine aynı taahhüdü işaret ediyorlardı. İyi
tahmin

4

Yapmak yerine git checkout origin/master

sadece yap git checkout master

sonra git branchşubenizi onaylar.


4

Bugün bir alt modülü güncellediğim, ancak herhangi bir dalda olmadığım bu sorunu yaşadım. Zaten taahhüt etmiştim, bu yüzden saklamak, ödeme yapmak, görevden almak işe yaramazdı. Ben koparılmış kafasının taahhüt kiraz toplama aldı. Bu yüzden taahhüt ettikten hemen sonra (itme başarısız olduğunda):

git checkout master
git cherry-pick 99fe23ab

Düşüncem gitti: Ben müstakil bir kafadayım, ama usta olmak istiyorum. Ayrılmış durumumun efendiden çok farklı olmadığını varsayarsak, taahhüdümü efendime uygulayabilirsem ayarlanırdım. Kiraz toplamanın yaptığı tam olarak budur.


3

Eğer ustanın tepesinde bazı taahhütler yaptıysanız ve orada "geriye doğru birleştirmek" masteristiyorsanız (yani masterişaret etmek istiyorsanız HEAD), tek astar şöyle olacaktır:

git checkout -B master HEAD
  1. Bu masterzaten var olsa bile adlı yeni bir dal yaratır (ki bu hareket etmek gibidir masterve istediğimiz budur).
  2. Yeni oluşturulan dal HEAD, bulunduğunuz yer olan noktayı işaret edecek şekilde ayarlanmıştır .
  3. Yeni şube kullanıma alındı, böylece masterdaha sonra çalışacaksınız.

Bunu özellikle sık sık müstakil bir durumda olan alt depolar için yararlı buldum.


3

Aynı sorunu yaşadım ve aşağıdaki adımları izleyerek çözdüm.

Değişikliklerinizi saklamanız gerekiyorsa

  1. Önce koşman gerek git checkout master ana şubeye geri döndürmek için komut .
  2. Yaptığınız değişiklikleri tutmak gerekiyorsa, sadece koşmak git checkout -b changesve git checkout -B master changes

Değişikliklerinize ihtiyacınız yoksa

  1. İzlenmemiş tüm dosyaları şube çalışmanızdan kaldırır git clean -df.

  2. Ardından deponuzdaki tüm etiketsiz değişiklikleri temizlemeniz gerekir. Bunu yapmak için koşmalısıngit checkout --

  3. Son olarak git checkout masterkomutunu kullanarak şubenizi ana şubeye geri koymanız gerekir .


3

Benim için, yerel şubeyi tekrar silmek kadar kolaydı, çünkü itmek istediğim yerel taahhütlerim yoktu:

Ben de yaptım:

git branch -d branchname

Ve sonra şubeyi tekrar kontrol et:

git checkout branchname

1

Şahsen ben değilken bazı değişiklikler yaptığım ortaya çıktığında kendimi bulduğumda master(yani HEADhemen üstünde ayrılır masterve arasında hiçbir taahhüt yoktur) saklamak yardımcı olabilir:

git stash # HEAD has same content as master, but we are still not in master
git checkout master  # switch to master, okay because no changes and master
git stash apply  # apply changes we had between HEAD and master in the first place

1

Basit bir deyişle, ayrılmış HEAD durumu , herhangi bir şubenin HEAD'ına (veya ucuna) kontrol edilmediğiniz anlamına gelir .

Bir Örnekle Anlama

Çoğu durumda bir dal, aşağıdaki gibi birden fazla taahhüt dizisidir:

1.Bölüm : Master -> Branch_HEAD (123be6a76168aca712aea16076e971c23835f8ca)

Taahhüt 2: Master -> 123be6a76168aca712aea16076e971c23835f8ca -> branch_HEAD (100644a76168aca712aea16076e971c23835f8ca)

Taahhüt sırası durumunda yukarıda görebileceğiniz gibi, şubeniz en son taahhüdünüzü gösterir. Bu durumda, 123be6a76168aca712aea16076e971c23835f8ca taahhüt etmek için ödeme yaparsanız, şubenizin HEAD'ı 100644a76168aca712aea16076e971c23835f8ca'yı gösterdiğinden , teknik olarak hiçbir şubenizin HEAD'ına baktığınızdan emin olursunuz. Böylece, müstakil HEAD durumundasınız.

Teorik Açıklama

Bu Blog'da açıkça bir Git havuzunun bir taahhütler ağacı olduğunu belirtiyor, her bir taahhüt her taahhüt işaretçisiyle atalarını işaret ediyor ve her bir şubeye yönelik bu göstergeler .git / refs alt dizinlerinde saklanıyor. Etiketler .git / refs / etiketlerinde ve dallar .git / refs / kafalarında depolanır. Dosyalardan herhangi birine bakarsanız, her etiketin 40 karakterlik bir sağlama karmasıyla tek bir dosyaya karşılık geldiğini ve yukarıda @Chris Johnsen ve @Yaroslav Nikitenko tarafından açıklandığı gibi bu referanslara göz atabileceğinizi göreceksiniz.


0

Gerçekten aptalca bir duruma girdim, başka birinin bunu yararlı bulacağından şüpheliyim .... ama her ihtimale karşı

git ls-remote origin
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        HEAD
6f96ad0f97ee832ee16007d865aac9af847c1ef6        refs/heads/HEAD
0d2ab882d0dd5a6db93d7ed77a5a0d7b258a5e1b        refs/heads/master

sonunda sabitledim

git push origin :HEAD

0

Bu benim için mükemmel çalıştı:

1. git stashyerel değişikliklerinizi kaydetmek için

Değişiklikleri atmak istiyorsanız
git clean -df
git checkout -- .
git clean izlenmeyen tüm dosyaları kaldırır (uyarı: doğrudan .gitignore'da belirtilen yok sayılan dosyaları silmezken, klasörlerde bulunan yok sayılan dosyaları silebilir) ve git kasası tüm dengesiz değişiklikleri temizler.

2. git checkout masterana dalı geçmek için (master kullanmak istediğiniz varsayalım)
3. git pullana dalı son taahhüt çekmek için
4. git statusher şeyi kontrol etmek için harika görünüyor

On branch master
Your branch is up-to-date with 'origin/master'.

0

Benim durumumda koştum git statusve çalışma dizinimde birkaç izlenmemiş dosyam olduğunu gördüm.

Rebase'in çalışması için onları temizlemem gerekti (çünkü onlara ihtiyacım yoktu).


0

Eclipse'de EGit kullanıyorsanız: ustanızın ana geliştirme kolunuz olduğunu varsayalım

  • bir dalda, normalde yeni bir dalda değişiklik yapmayı taahhüt ederim
  • sonra uzaktan kumandadan çekin
  • sonra proje düğümüne sağ tıklayın, ekibi seçin ve gösteri geçmişini seçin
  • sonra ustayı sağ tıklayın, check-out'ı seçin
  • Eclipse size söylerse, bir yerel uzaktan kumanda olan iki usta var, uzaktan kumandayı seçin

Bundan sonra başlangıç-ustasına yeniden bağlanabilmelisiniz.


-1

Ben de aynı problemi yaşadım. Değişikliklerimi saklıyorum git stashve yerel olarak önceki bir taahhüde şubeyi sıfırladım (buna neden olduğunu düşündüm) sonra bir yaptım git pullve şimdi o kafayı sökmüyorum. git stash applyDeğişikliklerinizi tekrar yapmayı unutmayın .


-2
git checkout checksum  # You could use this to peek previous checkpoints
git status # You will see HEAD detached at checksum
git checkout master # This moves HEAD to master branch
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.