Git durumu şovu, akış yukarı değişiklikler olduğunda neden güncel?


226

İzlenen bir dalda akış yukarı değişiklikler var, ancak git statusyazdığımda yerel şubemin güncel olduğunu gösteriyor. Bu yeni bir davranış mı, bir yapılandırma ayarını değiştirdim mi yoksa bir sorun mu var?

Yardım için teşekkürler.

ubuntu@host:/my/repo# git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working directory clean


ubuntu@host:/my/repo# git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (11/11), done.
remote: Total 11 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (11/11), done.
From bitbucket.org:my/repo
   1234567..abcdefg  master     -> origin/master
Updating 1234567..abcdefg
Fast-forward
 file1        |  1 -
 file2        | 43 +++++++++++++++++++++++++++++++++++++++++++
 file3        | 21 ++++++++++++---------
 file4        | 21 ++++++++++++---------
 4 files changed, 67 insertions(+), 19 deletions(-)
 create mode 100644 file5

Yanıtlar:


274

Durum size söylediği şey, origin/master yerel repo yerel ref olan denilen ref arkasında olmasıdır . Bu durumda ref, denilen bazı uzaktaki bir dalın izlenmesine neden olur origin, ancak durum uzaktan kumandadaki dal hakkında hiçbir şey söylemez. Sadece yerel dosya sisteminizde depolanan bir taahhüt kimliği olan ref'den bahsediyor (bu durumda, genellikle .git/refs/remotes/origin/masteryerel repoda adı verilen bir dosyadadır).

git pulliki işlem yapar; ilk git fetcholarak, uzak repodaki taahhütlerle ( origin/masteryerel repodaki ref'yi güncelleyen) güncellemek için a yapar, daha sonra git mergebu taahhütleri mevcut şubeye birleştirmek için a yapar .

Bunu yapana kadar fetch(kendi başına veya üzeri ya adımını git pull) Yerel Repo ek onaylatabilirsiniz akıntıya ve olduğunu bilmek için bir yol vardır git statusyalnızca yerel bakar origin/masterref.

Ne zaman git statusdiyor yukarı güncel, bu "yukarı güncel şube ile o anki şube izleri", hangi Bu durumda araçlarında "yukarı güncel olarak adlandırılan yerel ref demektir origin/master". Bu, yalnızca "son akışta fetchen son canlı durumla güncel olmayan" ile aynı olmayan " son kez aldığımız yukarı akış durumu ile güncel" anlamına gelir .

Neden bu şekilde çalışıyor? İyi fetchaşama potansiyel olarak yavaş ve pahalı bir ağ işlemdir. Git'in (ve diğer dağıtılmış sürüm kontrol sistemlerinin ) tasarımı, gereksiz olduğunda ağ işlemlerinden kaçınmaktır ve birçok kişinin alışkın olduğu tipik istemci-sunucu sistemine tamamen farklı bir modeldir (aşağıdaki yorumlarda belirtildiği gibi, Git'in konsepti karışıklığa neden olan bir "uzaktan izleme dalı" ifadesi tüm DVCS'ler tarafından paylaşılmaz). Git'i çevrimdışı olarak, merkezi bir sunucuya bağlantı olmadan kullanmak tamamen mümkündür ve yansıma çıktısı git statusbunu yansıtır.

Git'te şube oluşturma ve değiştirme (ve durumlarını kontrol etme), merkezi bir sisteme yavaş bir ağ işlemi gerçekleştiren bir şey değil, hafif olmalıdır. Git'i ve git statusçıktıyı tasarlarken varsayım , kullanıcıların bunu anlamasıydı (çok fazla Git özelliği yalnızca Git'in nasıl çalıştığını zaten biliyorsanız anlamlıdır). Git'in DVCS'ye aşina olmayan çok sayıda kullanıcı tarafından benimsenmesiyle bu varsayım her zaman geçerli değildir.


79
Geç bir yorum ama ben de aynı durumla karşılaştım. Git'in getirilmeden önce neden değişiklikleri bilmesinin bir yolu olmadığını biliyorum Ama o zaman "güncel" dememeli ki bu sadece doğru değil. "Uzaktan ne olmuş olabileceğine dair hiçbir fikrim yok" demeli.
Droidum

31
Belki de kesinlikle mantıklıdır, ama hiç de insanca makul değildir. Neden bir getirme yapmak için tasarlamıyorsunuz ve SONRA güncel olup olmadığını bildiriyorsunuz? Veya mesajı gerçekte ne yaptığını söyleyecek şekilde değiştirin, örneğin "Şubeniz en son {timestamp} 'da kontrol edildiğinde" orijin / master "ile güncel miydi?" Ya da sadece "Şubenizin güncel olup olmadığını öğrenmek için bir bilgi getirin mi?"
Colin

25
neden "Şubeniz güncel" mesajını göstermekten rahatsız oluyorsunuz? Menşe / üstatın durumunu bilmek konusunda bir nokta görmüyorum ve eğer menşe uzaktan kumandadaki asıl üssü temsil etmesi gerekiyorsa, zaten hiçbir fikri yok.
whiterook6

2
@pastullo, bu yüzden bir takma ad oluşturun.
Jonathan Wakely

23
Bu, Git'in korkunç kullanılabilirliğinin mükemmel bir örneğidir. Gücünü ve esnekliğini seviyorum, ancak mesajı "Şubeniz / yerel / master" yerel sürümü ile güncel. " büyük bir gelişme olurdu. Buradaki karışıklık, uzak bir dalı izleyen yerel dalın kökeni / ustasının (kullandığınız uzaktan kumandalar / dallar ile desen eşleşmesi) olmasıdır.
17:31

35

Bunun nedeni, yerel repo'nuzun yukarı akış uzaktan kumandalarıyla check-in yapmamış olmasıdır. Bu çalışmayı beklediğiniz gibi elde etmek için kullanın ve git fetchsonra git statustekrar çalıştırın .


7

Bunların hepsi geçerli cevaplar olsa da, yerel repo'nun uzaktan alma, alma veya çekme olmadan olup olmadığını kontrol etme yolumu vermeye karar verdim. Şubelerimin nerede olduğunu görmek için:

git remote show origin

Yaptığı şey, mevcut tüm izlenen dalları ve en önemlisi - güncel, uzak veya uzak köklü olanların güncel olup olmadığı bilgisidir. Yukarıdaki komuttan sonra, bu döndürülenin bir örneğidir:

  * remote origin
  Fetch URL: https://github.com/xxxx/xxxx.git
  Push  URL: https://github.com/xxxx/xxxx.git
  HEAD branch: master
  Remote branches:
    master      tracked
    no-payments tracked
  Local branches configured for 'git pull':
    master      merges with remote master
    no-payments merges with remote no-payments
  Local refs configured for 'git push':
    master      pushes to master      (local out of date)
    no-payments pushes to no-payments (local out of date)

Umarım bu birine yardımcı olur.


0

"origin / master", şube "orijin / master" HEAD taahhüdüne yapılan referansı ifade eder. Başvuru, Git nesnesinin, genellikle bir taahhüt nesnesinin insan dostu bir takma adıdır. "origin / master" referansı yalnızca git pushuzaktan kumandanıza gittiğinizde güncellenir ( http://git-scm.com/book/en/v2/Git-Internals-Git-References#Remotes ).

Projenizin kökünden şunları çalıştırın:

cat .git/refs/remotes/origin/master

Görüntülenen tamamlama kimliğini aşağıdakilerle karşılaştırın:

cat .git/refs/heads/master

Aynı olmalılar ve bu yüzden Git'in mastergüncel olduğunu söylüyor origin/master.

Koştuğunda

git fetch origin master

Bu, yeni Git nesnelerini yerel olarak .git / objects klasörü altına alır. Ve Git .git / FETCH_HEAD'i güncelleyerek, artık getirilen dalın en son işlenmesine işaret ediyor.

Geçerli yerel dalınız ile yukarı akıştan alınan dal arasındaki farkları görmek için,

git diff HEAD FETCH_HEAD

1
.Git dizinindeki öğeleri kedi olmamalıdır, paketlenmiş refs ile çalışmaz. Ayrıca tarif ettiğiniz getirme git'in eski sürümleri içindir.
Andrew C

gelmez origin/masterayrıca güncelleyen olsun ref bir itme yanı sıra getirme?
Jonathan Wakely

Doğru. Git 1.8.3'ü şimdiye kadar kullanıyordum. Gerçekten 2.2.1 sürümü ile fark edebiliyorum, FETCH_HEAD getirme sırasında da güncelleniyor. Ayrıca, "Şubeniz ... ile güncel" veya "Şubeniz geride ... X tarafından yapılır" mesajı söz konusu olduğunda, yalnızca yerel şubeniz belirli bir uzak dalı izliyorsa görünür. Kaptanın başlangıcı / kaptanı izleyebilmesi için, dal kaptanından git dal -u başlangıca / kaptan çalıştırılması gerekir. Hiçbir izleme yoksa, git diff'i çalıştırmanız gerekir.
Marek Stanley

Peki o zaman '"orijin / master" referansının sadece uzaktan kumandanıza gittiğinizde güncelleneceğini
Jonathan Wakely

0

Örnek bir git repo içine bakmak doğrulamak için Let your branch (master)olduğu up to dateile origin/master.

Yerel yöneticinin kaynak / yöneticiyi izlediğini doğrulayın:

$ git branch -vv
* master a357df1eb [origin/master] This is a commit message

Yerel ana şube hakkında daha fazla bilgi:

$ git show --summary
commit a357df1eb941beb5cac3601153f063dae7faf5a8 (HEAD -> master, tag: 2.8.0, origin/master, origin/HEAD)
Author: ...
Date:   Tue Dec 11 14:25:52 2018 +0100

    Another commit message

Orijin / master'ın aynı taahhütte olup olmadığını doğrulayın:

$ cat .git/packed-refs | grep origin/master
a357df1eb941beb5cac3601153f063dae7faf5a8 refs/remotes/origin/master

Aynı hashı görebiliriz ve şubenin en azından mevcut git repo'sunda uzak olanla tutarlı olduğunu söylemek güvenlidir.



0

Önemsiz cevap henüz beni buraya getiren gibi bazı durumlarda doğru. Benim için yeni olan bir depoda çalışıyordum ve durum tarafından yeni görünmeyen bir dosya ekledim.

Dosya, .gitignore dosyasındaki bir desenle eşleşir.


0

bu durumda git add ve bütün bekleyen dosyaları entegre edin ve sonra git command ve sonra git push komutlarını kullanın

git add - tüm pedent dosyalarını entegre et

git taahhüdü - taahhüdü kaydet

git push - depoya kaydet

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.