git: Şubeniz X taahhütlerinde önde


379

Bu aslında nasıl ortaya çıkıyor?

Şu anda tek başıma bir repoda çalışıyorum, bu yüzden bu benim iş akışım:

  1. Dosyaları değiştirme
  2. işlemek
  3. Memnun olana kadar 1-2 tekrarlayın
  4. Master'a aktar

Sonra bunu yaptığımda git statusbana şubemin X taahhütlerinin önünde olduğunu söylüyor (muhtemelen aynı sayıda taahhütte bulunduğumu). Kodu ittiğinizde, yerel olarak önbelleğe alınmış dosyalarınızı (.git klasörlerinde) güncellemediği için mi? git pullBu garip mesajı 'düzeltiyor' gibi görünüyor, ama hala neden olduğunu merak ediyorum, belki git yanlış kullanıyorum?


mesaja hangi dalın basılacağını dahil

Yerel şubem ustanın önünde

mevcut dalı nereye itiyorsun / çekiyorsun

GitHub'a doğru ilerliyorum ve o anda hangi bilgisayar üzerinde çalışıyorsam onu ​​çekiyorum, üzerinde çalıştığım tek kişi olarak yerel kopyam her zaman tamamen güncel.

aslında uzaktan repoyu kontrol etmiyor

Ben de öyle düşünmüştüm, doğru anladığımdan emin olacağımı düşündüm.

buna fazladan argümanlar mı veriyorsunuz?

Görebildiğim gibi değil, belki de sonda bazı komik yapılandırmalar var?

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

pushUzaktan ve şube yapılandırma ayarlarınızı nasıl yapıyorsunuz ve neler yapıyorsunuz ?
CB Bailey

2
aslında uzaktan repo'yu kontrol etmez, itme işlemini gerçekleştirdikten sonra uzak repodaki en son bilgileri getirme için bir git getirmeniz gerekir, bu, izlemek için kullandığı yerel "uzak" dalını güncelleyecektir.
Mart'ta Sekhat

2
@Sekhat: git statusUzak depoyu kontrol git pulletmese de. İçe aktardığınız bir havuz için git pushizleme şubeniz varsa, push işleminiz başarılı olursa yerel izleme şubenizi uzak şubenin yeni durumunu yansıtacak şekilde güncelleyecektir. Bu yüzden sorucunun yapılandırmasını sordum çünkü doğru bir şekilde gerçekleşmiyorsa muhtemelen bir yapılandırma hatası vardır.
CB Bailey

git status? Gerçekten mi? bana git statusasla şubemin ne kadar ilerisinde olduğunu söylemiyor .. ona fazladan argümanlar mı iletiyorsun?
hasen

4
@hasen j: git statusuzak dalın güncellenip güncellenmediğini kontrol etmek için uzak depoya gitmez. Yerel şubenizin, yerel olarak depolanan uzaktan izleme şubenizle ne kadar önde olduğunu gösterir . Sorun, normal bir git pushizleme (getirme ve çekme gibi) uzaktan izleme dalını güncellemelidir ve asker için bu işe yaramıyor gibi görünüyor. Hem bunun tam git pusholarak nasıl kullanıldığını hem de yerel deponun yapılandırmasını görmemiz gerektiğini görmek için , ancak asker zaten bir cevabı kabul ettiğinden, bunun olduğunu şimdi göremiyorum.
CB Bailey

Yanıtlar:


508

Bu mesajı a yaptıktan sonra alırsanız git pull remote branch, a ile takip etmeyi deneyin git fetch. (İsteğe bağlı olarak, git fetch -pdepodan silinen dalları budamak için çalıştırın )

Getirme, uzak dalın yerel temsilini güncelliyor gibi görünüyor git pull remote branch.


1
Bravo. Sorun gerçekten buydu. Google kodunda bir havuz oluşturarak başladım. Sonra bu havuzu dizüstü bilgisayarımda klonladım ve orada çalışıyorum ve değişiklikleri değiştiriyorum, laptop => code.google. Bu iletiyi, code.google kod deposunun bir kopyasını oluşturduğum sunucumda alırdım ve değişiklikleri alırdım. Yerel veritabanını güncellemek için getirme gerektiğini düşünüyorum.
rjha94

2
Burada da aynı sorunu yaşadık çünkü başka bir dal (A) da aynı efendiye işaret etti. A'yı ve ardından master'ı çekmek aynı durumla sonuçlandı. Git A'yı çektiğinde, taahhüt sonuncusu olarak güncellendi, bu yüzden master'ı çekmek aslında çekecek hiçbir şeyi yok, bu yüzden git master son taahhüdünü güncellemedi ve "masterın önünde" olma uyarısı veriyordu.
Uberto

8
Teşekkür ederim, ama garip bir şey fark ettim. "git fetch origin master" yardımcı olmaz, ancak "git fetch origin" yardımcı olur. Ben ana dalındayım, bu yüzden "git fetch origin" bağlamında farklı bir şey nasıl yapacağından emin değilim.
Parag

2
@Parag , bu iki komut arasındaki farkların bir açıklaması ve git fetch uzak dalı da uzaktan izleme-şube ref'sini güncelleyecek şekilde yapılandırma dosyasını nasıl değiştireceğinizi açıklamak için stackoverflow.com/questions/26350876/… adresine bakın. git_status 'önde' bildirmez.
Anatortoise House

2
@Parag, ayrıca stackoverflow.com/questions/7365415/… yanıtı, ORIG_HEAD ve FETCH_HEAD'in senkronizasyondan çıkarak durum uyarısına ve olası yapılandırma dosyası düzeltmelerine neden olan ayrıntıları tartışır.
Anatortoise House

138

kullanım

git pull --rebase

--Rebase seçeneği git'in yerel taahhüdünüzü bir kenara taşıyacağı, uzaktan kumanda ile senkronize edeceği ve daha sonra taahhütlerinizi yeni eyaletten uygulamaya çalışacağı anlamına gelir.


3
Yararsız birleşmeleri önlemek ve daha temiz bir ağaca sahip olmak için gerçekten iyi bir yol!
Hatef

1
Bu komutu denedim, ama yine de aynı sorunum var ...$ git pull --rebase Current branch xyz is up to date. $ git status On branch xyz Your branch is ahead of 'origin/xyz' by 6 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean
bbh

4
Bu cevap yanlış: Durumu anlamadan kullanırsanız, ilerideki zamanlarda potansiyel olarak sorun çıkartabilirsiniz (yeniden yazılmış tarih!). Durumu anlarsanız, bunun çözümü olmayacaktır . Lütfen kullanırken yazmadan önce düşünün gitve geçmişi dikkatsizce yeniden yazmayın!
cmaster - eski haline monica

80

Bu 3 basit komutu kullanın

Adım 1 :git checkout <branch_name>

2. Adım :git pull -s recursive -X theirs

3. Adım :git reset --hard origin/<branch_name>

Daha fazla detay: https://stackoverflow.com/a/39698570/2439715

Zevk almak.


3
Sorunu benim için gerçekten düzelten tek cevap bu. Yukarıdaki komutlar garip bir şekilde 12'den 7'ye düşürdü ve bu nihayet bunları kaldırdı
Ieuan

1
Bunun benim için işe yarayan tek şey olduğu konusunda hemfikirim. GIT'in bazen birden fazla kişilik bozukluğuna sahip olduğuna inanıyorum.
17'de ksed

11
@Leuan gibi benim için hiçbir şey git reset --hard origin/mastertemizlemedi.
Dave Land

Burada da aynı, bu benim için işe
yarayan

51

Ben mesajı yanlış okuma düşünüyorum - şube öncesinde değil master, bu ise master . Bu ilerisinde bulunuyor origin/masterbir olan uzaktan izleme şube son uzak depo durumunu kaydeder push, pullya da fetch. Size tam olarak ne yaptığınızı söylüyor; uzaktan kumandanın önüne geçtiniz ve itmenizi hatırlatıyor.


22
Bu aslında ben ittikten sonra. Bu mesajı almamak için çekmek zorunda kaldım (veya muhtemelen getirmeliydim?).
SeanJA

26

Birisi mesajınızı yanlış okuduğunuzu söyledi, değil. Bu sorun aslında <project>/.git/configdosyanızla ilgilidir. İçinde buna benzer bir bölüm olacak:

[remote "origin"]
    url = <url>
    fetch = +refs/heads/*:refs/remotes/origin/*

Getirme satırını projenizin .git / config dosyasından kaldırırsanız, "Şubeniz taahhütlerle 'orijin / master'ın önünde" durur N. meydana gelen rahatsızlık.

Ya da umarım. :)


ahead by x commitsMesajı bir daha gördüğümde kontrol edeceğim . Mesajı bir süredir görmedim.
SeanJA

Mesajı bir süredir görmedim. Bence yerel olarak git
repo'yu

Bunu denedim, ama tutmaya çalıştığımda Eclipse eGit "iç hata" ile haşhaş başladı. Git'in kendisi iyi çalışıyor gibi görünüyordu.
user4815162342

18
Bu çizgi ne yapıyor? ve kaldırarak neyi kaçırıyorum? (sıkıntı dışında)
John Mee

1
Bu işe yaradı, ama daha çok hatayı bastırmak gibi. Satırı geri ekleyin, tekrar uyarı almaya başlayacaksınız.
Krishna Pandey

15

Ben sadece çeker nerede sahne sunucumda bu sorunu vardı. Sert sıfırlama, HEAD'i uzaktan kumanda ile aynı şekilde temizlememe yardımcı oldu.

git reset --hard origin/master

Şimdi tekrar var:

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

İlk olarak --hard bayrağı olmadan denedim ve işe yaradı!
kroiz

12

Bu benim için çalıştı

git reset --hard origin/master

Çıktı şöyle görünmelidir

On branch dev HEAD is now at ae1xc41z Last commit message


11

Benim durumumda bunun nedeni,

 git checkout -B master

Bunun yerine yeni sürümünü çekmek için

 git checkout master

İlk komut , master başkanını en son taahhütlerime sıfırlar

kullandım

git reset --hard origin/master

Bunu düzeltmek için


9

Bu sayfadaki her çözümden geçtim ve neyse ki @ anatolii-pazhyn, çözümü işe yarayan çözüm olduğu için yorum yaptı. Ne yazık ki onu onaylamak için yeterli üne sahip değilim, ama önce çözümünü denemenizi tavsiye ederim:

git reset --hard origin/master

Hangi bana verdi:

HEAD is now at 900000b Comment from my last git commit here

Ayrıca tavsiye ederim:

git rev-list origin..HEAD
# to see if the local repository is ahead, push needed

git rev-list HEAD..origin
# to see if the local repository is behind, pull needed

Ayrıca kullanabilirsiniz:

git rev-list --count --left-right origin/master...HEAD
# if you have numbers for both, then the two repositories have diverged

İyi şanslar


4

Aynı sorunu bir Windows makinesinde de yaşadım. Bir git pull origin masterkomut çalıştırdığımda , "X tarafından yapılan 'origin / master' önden" uyarısı alırdım. Bunun yerine koştum git pull originve dalı belirtmediysem, artık uyarı almayacağımı fark ettim.


Bunun git fetchperde arkasında etkili bir şekilde çalıştığına inanıyorum .
Brian Peterson

"git fetch" sorunumu çözmedi, bu yaptı. Yeni eklenen dalların listesini aldım ve bu iletiyi "Uzaktaki 'yukarı akıştan' çekmeyi istediniz, ancak bir dal belirtmediniz. Bu, geçerli dalınız için varsayılan yapılandırılmış uzaktan kumanda olmadığından, komutta bir dal belirtmelisiniz hat." ve sonraki "git status" komutu uyarıyı göstermedi.
Krishna Pandey

2

Sadece mevcut dal ile geçerli parçayı yapan dal arasındaki farkları hatırlatır. Lütfen mesajda hangi dalın yazdırıldığı ve geçerli dalı nereye ittiğiniz / çektiğiniz de dahil olmak üzere daha fazla bilgi verin.


2

Bu soru biraz eski olmasına rağmen ... Benzer bir durumdaydım ve buradaki cevabım, benzer bir sorunu çözmeme yardımcı oldu

Önce denemek push -fveya zorlamak seçeneği

Bu işe yaramadıysa (benim durumumda olduğu gibi) uzak depoların (ya da daha ziyade ortaya çıkan uzak depolara yapılan referansların git remote -v) güncellenmemiş olması mümkündür.

Yukarıdaki itme gücünüzün sonucu, yerel / şubenizi uzak / şubenizle senkronize etti, ancak yerel repodaki önbellek hala HEAD olarak önceki taahhüdü (yerel / şube ... sadece tek bir taahhüt itildi) gösterir.

Yukarıdaki klonu onaylamak için farklı bir konumdaki repoyu ve yerel / şube KAFA ve uzak / şube KAFA karşılaştırmaya çalışın. Eğer ikisi de aynı ise muhtemelen benim yaptığım sorunla karşı karşıyasınız.

Çözüm:

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
$ git remote add origin git://github.com/pjhyett/hw.git
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/pjhyett/hw.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
$ git remote rm origin
$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)

Şimdi push -faşağıdaki gibi yapın

git push -f github master ### Komutunuzun artık olmadığını unutmayın origin!

Bir Do git pullşimdi git pull github master

üzerine git statusalmak

# On branch master

nothing to commit (working directory clean)

Görüntüleme sayısı o kadar yüksek olduğundan, bu hatayı aramak neredeyse her zaman üstte bu konuyu listeliyor

Ayrıca ayrıntılar için gitref'e bakın


2

Aslında ben TortiseGIT ile bir anahtar / ödeme yaparken bu oldu.

Benim sorunum, şubeyi başka bir yerel şubeye dayanarak oluşturmuş olmamdı. Böyle bir /.git/configşeye benzeyen bir "birleştirme" girişi yarattı :

[branch "web"]
    merge = refs/heads/develop
    remote = gitserver

Ne zaman "web" şubesine geçsem, bana 100'den fazla ilerleme kaydettiğimi söylüyordu. Artık gelişmeyi taahhüt etmiyordum, bu yüzden doğruydu. Ben sadece bu girişi kaldırmak başardı ve beklendiği gibi çalışıyor gibi görünüyor. Geliştirme şubesinin arkasında olmaktan şikayet etmek yerine uzaktan ref ile düzgün bir şekilde izliyor.

Vikram'ın dediği gibi, bu Stack Overflow parçacığı bu sorunu ararken Google'da en iyi sonuçtur, bu yüzden durumumu ve çözümümü paylaşacağımı düşündüm.


2

Yukarıdaki @Marian Zburlia'nın belirttiği ile aynı şeyi tekrarlamak istiyorum. Benim için çalıştı ve aynı şeyi başkalarına da önerirdi.

git pull origin develop

tarafından takip edilmelidir $ git pull --rebase.

Bu $ git status, son çekmeden sonra gelen yorumları kaldıracaktır .


2

git fetch bunu sizin için çözecek

Anlayışım doğruysa, yerel (önbelleğe alınmış) origin/mastergüncel değil. Bu komut, sunucu durumunu sunucudan güncelleştirir.


1
Lütfen biraz açıklama ekleyin
Mathews Sunny

2

Daha sonra bir git durumu yaptığımda, şubemin X taahhütlerinden öndüğünü söylüyor (muhtemelen aynı sayıda taahhütte bulundum ).

Deneyimim birçok şubesi olan bir ekip ortamında. Kendi özellik dallarımızda (yerel klonlarda) çalışıyoruz ve git status11 taahhütte olduğumu gösterenlerden biriydi . Sorunun yazarı gibi çalışma varsayımım +11'in kendi taahhütlerimden olmasıydı .

Birkaç develophafta önce ortak branştan özellik branşımdaki değişiklikleri çektiğim ortaya çıktı - ama unuttum! Bugün yerel özellik şubemi tekrar ziyaret ettiğimde ve +41'e git pull origin developatlayan bir sayı yaptığımda taahhütte bulundum . Çok fazla çalışma yapılmıştı developve bu nedenle yerel özellik şubem, origindepodaki özellik dalının daha da ilerisindeydi .

Bu nedenle, bu mesajı alırsanız, erişiminiz olan diğer dallardan (kendi veya başkalarından) yapmış olabileceğiniz çekimleri / birleştirmeleri tekrar düşünün. Mesaj , işlerin senkronize edilmesi için yerel repodan repoda ('izleme dalı') yapılan git pushbu pulldeğişikliklerde yapmanız gereken sinyalleri gösterir origin.


1

Öneren git pullveya git fetchdoğru cevaplar .
Mesaj ve git statusarasında bir fark gördüğünde oluşturulur (ör..git/FETCH_HEAD.git/refs/remotes/<repository>/<branch>.git/refs/remotes/origin/master ) .

İkinci dosya, son getirmeden (depo / şube için) KAFA'yı kaydeder. Bunu yapmak git fetchher iki dosyayı da şubenin geçerli KAFASINA günceller.
Elbette getirilecek bir şey yoksa (yerel depo zaten güncel olduğundan) .git/FETCH_HEADdeğişmez.


Bu benim için böyle görünmüyor: .git/FETCH_HEADiçerir 9f7336c873ccffc772168bf49807e23ff74014d3 branch 'master' of URLve .git/refs/remotes/origin/masteriçerir 9f7336c873ccffc772168bf49807e23ff74014d3, ancak yine de mesajı alıyorum ve ne git pullde ne git fetchçözüyor
Davide

0

Bu iletiyi, şubedeki dosyayı kaldırmak için bir taahhütte bulunduktan sonra alırsanız, herhangi bir dosyada bir değişiklik yapmayı ve kesinleştirme gerçekleştirmeyi deneyin. Görünüşe göre sadece önceden izlenen dosyaların izlenmesini içeren tek bir taahhütte bulunamazsınız. Sonunda bu yazı tüm sorunu çözmeme yardımcı oldu https://help.github.com/articles/removing-files-from-a-repository-s-history/ . Sadece depo geçmişinden dosya kaldırmak zorunda kaldım.

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.