Git'deki origin / master konumunu nasıl bulabilirim ve nasıl değiştirebilirim?


228

Ben bir Git acemi. Geçenlerde bir Rails projesini Subversion'dan Git'e taşıdım. Buradaki öğreticiyi takip ettim: http://www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

Ayrıca kodumu saklamak için unfuddle.com kullanıyorum. Trende Mac dizüstü bilgisayarımda iş için / işten değişiklikler yapıyorum ve aşağıdaki komutu kullanarak bir ağ bağlantım olduğunda bunları açılmaya itiyorum:

git push unfuddle master

Capistrano'yu konuşlandırmalar için kullanıyorum ve ana dalı kullanarak çözülme deposundan kod çekiyorum.

Son zamanlarda dizüstü bilgisayarımda "git status" komutunu çalıştırdığımda şu mesajı fark ettim:

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

Ve neden olduğu konusunda kafam karıştı. Dizüstü bilgisayarımın orijin olduğunu düşündüm ... ama aslında Subversion'dan çektiğim veya Unfuddle'a ittiğim gerçeğinin mesajın görünmesine neden olup olmadığını bilmiyorum. Nasıl yapabilirim:

  1. Git'in 'kökeni / ustası' nerede olduğunu düşünüyor musunuz?
  2. Başka bir yerdeyse, dizüstü bilgisayarımı nasıl 'orijin / master' haline getirebilirim?
  3. Gitmek için bu mesajı al. Git'in bir şeyden mutsuz olduğunu düşündürüyor.

Mac'im Git 1.6.0.1 sürümünü çalıştırıyor.


Ben git remote show origindbr tarafından önerildiği gibi çalıştırın , ben aşağıdakileri elde:

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

Ben çalıştırdığınızda git remote -vAristo Pagaltzis önerdiği gibi, ben aşağıdaki alıyorum:

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

Şimdi, ilginç bir şekilde, geekfordizindeki projem üzerinde çalışıyorum ama benim dizinin dizindeki yerel makinem olduğunu söylüyor gf. gfProjemi Subversion'dan Git'e dönüştürürken kullandığım geçici dizin olduğuna ve muhtemelen ayrılmaya ittiğim yere inanıyorum. Sonra açılmaktan geekfordizine yeni bir kopya teslim aldım inanıyorum .

Bu yüzden dbr'nin tavsiyelerine uymalı ve yapmalıyım:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git

Yanıtlar:


203

1. Git'in 'orijin / master' ın nerede kullandığını düşünün git-remote

git remote show origin

..ki gibi bir şey dönecek ..

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

Uzaktan kumanda temelde bir uzak depoya bağlantıdır. Yaptığınızda ..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

..git, eklediğiniz adrese değişiklikler gönderir. Uzak depolar için bir yer imi gibi.

Çalıştırdığınızda git status, uzaktan kumandanın eksik olup olmadığını (yerel deponuzla karşılaştırıldığında) ve varsa kaç tane taahhütte bulunduğunu kontrol eder. Tüm değişikliklerinizi "başlangıç ​​noktasına" iterseniz, her ikisi de senkronize olur, bu nedenle bu mesajı alamazsınız.

2. Başka bir yerdeyse, dizüstü bilgisayarımı nasıl 'orijin / master' haline getirebilirim?

Bunu yapmanın bir anlamı yok. "Orijinallik" adını "laptop" olarak değiştirdiğinizi söyleyin - asla git push laptopdizüstü bilgisayarınızdan yapmak istemezsiniz .

Menşei uzaktan kumandayı kaldırmak istiyorsanız, ..

git remote rm origin

Bu hiçbir şeyi silmez (dosya içeriği / revizyonlar-geçmiş açısından). Bu, artık deponuzu uzaktan kumandayla karşılaştırmayacağı için "dalınız ileride .." iletisini durduracaktır (çünkü gitti!)

Hatırlanması gereken bir şey, özel bir şey olmadığı, origingit'in kullandığı varsayılan bir ad olduğu.

Veya origingibi şeyler yaptığınızda Git varsayılan olarak kullanılır . Yani, bir uzaktan kumandanız varsa çok kullanıyorsunuz (Durumunuzda açılsın), "başlangıç ​​noktası" olarak açılmayı eklemenizi tavsiye ederim:git pushgit pull

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

veya set-url kullanarak bir komutta yukarıdakileri yapın:

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

Ardından, sadece yerine git pushveya git pullgüncellemek yerinegit push unfuddle master


1
Depoya ittiğini yazıyor origin(git terimlerinde nasıl çalıştığının farkında olmasa da) - uzaktan kumandayı çıkarmak onun için yapmak için pek yararlı bir şey olmaz.
Aristoteles Pagaltzis

10
İnsanların neden soruları yeniden okuduğunu anlamıyorum. Sorunun anlamını değiştirir, mevcut cevapların bir anlam ifade etmesini sağlamaz ve diğer insanların sorularının biraz 'yanlış' olabileceği gerçeğine dayanarak sorunun daha fazla bilgiye ihtiyaç duyduğunu bilmesine izin vermez.
stu

9
Uzak kökeni kaldırmak tam olarak ihtiyacım olan şeydi, çünkü çözülemeyen deposu değil, artık mevcut olmayan bir yerel depoyu işaret ediyordu.
Brian Kelly

3
stu: Yeniden yazma iyi bir şey! Eğer ilk etapta sözleri açık değilse, asıl problemi çözmeyen cevaplar almanın bir anlamı yoktur.
dbr

4
Ama kızmak ve acı olmak çok daha kolay. :-) Ama ne demek istediğini anlıyorum.
stu

286

Bu soruya, git genel şemasında "şubeniz öndedir ..." mesajının ne anlama geldiğine dair bir açıklama aramaya geldim. Burada bir cevap yoktu, ancak şu anda Google'ın tepesinde "Şubeniz 'orijin / master'ın önünde" ifadesini aradığınızda şu anda göründüğünden ve mesajın gerçekten ne anlama geldiğini anladım , Bilgiyi buraya göndereceğimi düşündüm.

Yani, git bir acemi olarak, ihtiyacım olan cevabın belirgin bir acemi cevabı olduğunu görebiliyorum. Özellikle, "şubeniz öndedir ..." ifadesinin anlamı, yerel deponuza eklediğiniz ve taahhüt ettiğiniz, ancak hiçbir zaman kaynağa itilmemiş dosyalar olduğudır. Bu mesajın amacı, en azından benim için "git diff" in hiçbir fark göstermemesi gerçeğiyle daha da gizleniyor. Ben "git diff origin / master" ı çalıştırıncaya kadar, yerel depom ile uzak master arasında farklılıklar olduğu söylendi.

Açık olmak gerekirse:


"şubeniz öndedir ..." => Uzak ana sunucuya geçmeniz gerekiyor. Yerel deponuz ile uzak ana depo arasındaki farkların ne olduğunu görmek için "git diff origin / master" komutunu çalıştırın .


Umarım bu diğer yenilere yardımcı olur.

(Ayrıca, bu çözümü kısmen geçersiz kılabilecek konfigürasyon inceliklerinin olduğunu, örneğin ustanın aslında "uzak" olmayabileceğini ve "köken" kural tarafından kullanılan yeniden yapılandırılabilir bir isim olduğunu biliyorum. Ama yeni başlayanlar Bu tür şeyleri umursamıyorum. Basit, anlaşılır cevaplar istiyoruz. Basım sorununu çözdükten sonra incelikleri daha sonra okuyabiliriz.)

Kont


2
@Earl Bir git diff --cached origin/mastersonraki itmenin sonucunun ne olacağını belirttiği için burada daha iyi bir talimat olmaz mıydı? Yukarıda vurgulanan komut, ayrıca taahhüt edilmemiş ve gönderilmemiş dosyaları da gösterir (sanırım, ben de bir git acemi değilim)
Nisan'da

48
Ayrıca git fetcha'dan sonra bu hatayı alıyorsanız çalıştırmanız gerekebilir git pull remote branch. Referanslarınız güncel olmayabilir. git fetchbunu düzeltir.
bryan kennedy

does origin/masterparçası ortalama masterşube originrepo?
Rakib

1
Bu açıklamanın eksik olduğunu unutmayın. Şu anda yaşıyorum # On branch master # Your branch is ahead of 'origin/master' by 3 commits. Ama git diff origin / master hiçbir şey göstermiyor (ve --cached seçeneği bunu değiştirmez). Ve git getirme bunu değiştirmez, git çekme bunu değiştirmez, git reset --hard bunu değiştirmez. Bunu değiştirmek için şunlara ihtiyacım vardı: git reset --hard origin / master Ve bu yolu seçtim çünkü diğer insanlar benimle bu depoda çalışıyorlar ve testlerini geçersiz kılmak istemiyordum ve bunların ne işe yaradığını bulamadım vardır.
rdm

1
Bu mesajı, orijin / master'a göndermek yerine çekmem gerektiğinde de alırım . örneğin git checkout mastermesajı alırsam başka bir şubeden , yani git pull origin masterçalışmadan önce yapmam gerekir . ancak mesajın ifadesi tam tersini öne sürdüğü için çok kafa karıştırıcı buluyorum
Anentropic

38

Benim çalışma dizini olduğu ahead of origin by X commitsama git pullsonuçlanan benzer bir sorun vardı Everything up-to-date. Bu tavsiyeye uyarak düzeltmeyi başardım . Benzer bir sorunu olan başka birine yardımcı olması durumunda bunu yayınlıyorum.

Temel düzeltme aşağıdaki gibidir:

$ git push {remote} {localbranch}:{remotebranch}

Köşeli parantez içindeki sözcüklerin yerine uzak adınız, yerel dal adınız ve uzak dal adınız kullanılmalıdır. Örneğin

$ git push origin master:master

1
Teşekkürler, bu benim için yaptı. git diffhiçbir şey göstermedim ve tarif ettiklerinizi yaptıktan sonra artık bu kafa karıştırıcı ve can sıkıcı mesajı alamıyorum.
LaundroMat

1
Daha fazla oy gerekiyor :). Daha yüksek oy alan cevapların hepsi benim için "etki yok" idi (yani "git fetch" - hiçbir şey yapmadı ... "git uzaktan gösteri orijini" kontrol edin - yanlış bir şey yok, hiçbir şey değişmez)
Adam


10

Dizüstü bilgisayarımın başlangıç ​​noktası olduğunu düşündüm…

Bu bir tür saçma: originvarsayılan uzak depoya atıfta bulunur - genellikle diğer insanların değişikliklerini alır / çekersiniz.

Nasıl yapabilirim:

  1. git remote -vsize ne originolduğunu gösterecek ; origin/masterbilinen son durumuna için “imi” dir masterdalına origindepo ve kendi masterbir olan izleme dalı için origin/master. Tüm olması gerektiği gibi .

  2. Yapmazsın. En azından bir deponun kendisi için varsayılan uzak depo olması hiç mantıklı değil.

  3. Öyle değil. Sadece size uzak depoda olmayan (o deponun bilinen en son durumuna göre) yerel olarak bu kadar çok şey yaptığınızı söylüyor.


1
Dizüstü bilgisayarımın orijin olduğunu varsaydım, çünkü depoyu ilk oluşturduğum yer (nereden geldiğini).
Brian Kelly

1
Buna karşılık origin, çevrimdışı olma veya ağ değiştirme, dizüstü bilgisayarlar gibi taşınabilir cihazlar için çok yaygın bir durum olduğu için dizüstü bilgisayarı yerel olarak işaret etmem benim için çok mantıklı . Kullanmak Bu şekilde git pushve git pullherhangi bir zaman, şu anda doğru ağa bağlı olup olmadığını düşünmeye gerek yok. Bu yerel originağ, geçerli dolaşım durumuna bağlı olarak bir ağ bağlantısı olduğunda otomatik olarak gerçek uzaktan kumandalarla senkronize edilebilir. Sorunlu kısım, GIT kısmının oldukça kolay olmasına kıyasla, hangi senkronizasyonun ne zaman çalıştırılacağıdır.
Tino

2
İşaret originde başka dizüstü bilgisayarınızda depo emin, çok mantıklı. Bununla birlikte origin, deponun kendisine işaret edilmesi , çalıştırılmasa git pushda git pull, ya da bir havuz her zaman tam olarak kendisiyle tam olarak eşzamanlı olduğu için hiçbir fark yaratmaz . Hata, biraz totolojik.
Aristoteles Pagaltzis

3

[ Çözüm ]

$ git push origin

^ Bu benim için çözdü. Ne yaptı, benim ustası (dizüstü bilgisayarda) uzak sunucuda olan "kökeni" ile senkronize etti.


1

Bu sorunla mücadele ediyorum ve önceki cevapların hiçbiri soruyu gördüğüm gibi çözmüyor. Sorunumu netleştirip çözemediğimi görmek için sorunu temeline geri çektim.

Yeni bir depo (rep1) oluşturuyorum, içine bir dosya koyuyorum ve taahhüt ediyorum.

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

Ben rep1 bir klon oluşturmak ve rep2 diyorum. Rep2 içine bakmak ve dosyanın doğru olduğunu görüyorum.

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

Rep1'de dosyada tek bir değişiklik yapıp taahhüt ediyorum. Daha sonra rep1'de rep2'yi işaret edecek bir uzaktan kumanda oluşturup değişiklikleri itiyorum.

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

Şimdi rep2'ye gittiğimde ve 'git durumu' yaptığımda kökenimin önünde olduğumu söyledim.

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

Rep2'deki README, orijinal olarak ikinci işlemden önceki hali gibidir. Yaptığım tek değişiklik rep1 için ve tüm yapmak istediğim rep2 için onları itmek oldu. Ne anlamadım?


1
İki şey: rep2'nin "orijin / master" kontrolü aslında rep1'e bakmaz. Rep2'de bir 'git pull' yaparsanız, bunların aynı durumda olduğunu fark edecek ve şikayet etmeyi bırakacaktır. Çalışan bir kopyadaki bir basmadan değişiklikleri görmek için bir 'git checkout' yapmanız gerekir - itmeler hiçbir zaman dest deposunun çalışan kopyasına dokunmaz.
Walter Mundt

Böyle bir durum olabileceğini düşündüm ama "git checkout M README Şubeniz 1 taahhütte" orijin / master "ın önünde. Ama benim çalışma kopyam aslında 1 taahhütle geride, ileride değil.
Steve Hindmarch

1

Sizi "itmek" için bekliyor. Deneyin:

$ git push


1

Son zamanlarda bu sorun vardı ve ben artık ihtiyacım olmayan bazı dosyaları sildi çünkü olduğunu düşündüm. Sorun, git dosyaların silindiğini bilmiyor olması ve sunucunun hala sahip olduğunu görmesidir. (sunucu = başlangıç ​​noktası)

Bu yüzden koştum

git rm $(git ls-files --deleted)

Ve sonra bir taahhüt ve itme koştu.

Bu sorunu çözdü.


1
Bu yalnızca taahhüt mesajı sil - <dosya adı>
looneydoodle

1

Ben de bir git acemi. Aynı dalda 'şubeniz menşe / master N komisyonları önünde' mesajları ile yaşadım. Önerilen 'git diff origin / master' ı yapmak, umursamadığım bazı farkları gösterdi. Yani ...

Git klonum barındırma için olduğundan ve ana repo'nun tam bir kopyasını istedim ve yerel değişiklikleri korumaya aldırmadım, tüm repo'yu kurtarmaya ve yeni bir tane oluşturmaya karar verdim:

(barındırma makinesinde)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

Uygunluk için, barındırma makinemdeki klonda değişiklikler yapardım. Daha fazla yok. Ustada bu değişiklikleri yapacağım, git orada taahhüt edeceğim ve bir git çekme yapacağım. Umarım, bu benim senkronizasyon içinde barındırma makinede benim git klon tutmak gerekir.

/ Nara


0

Repo için de aynı şeyi merak ediyordum. Benim durumumda, artık itmediğim eski bir uzaktan kumanda vardı, bu yüzden onu kaldırmam gerekiyordu.

Uzaktan kumanda listesini alın:

git remote

İhtiyacınız olmayanı kaldırın

git remote rm {insert remote to remove}

0

Kendi taahhütleriniz gerçekleşmeden önce belirli bir taahhüdü sıfırlamak mümkündür.

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

git logYerel değişiklikler yapılmadan önceki taahhüdünüzü bulmak için kullanın .

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

Yerel taahhütleri not edin ve doğrudan önceki taahhüdüne sıfırlayın:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

"Şubeniz nn taahhütleri ile 'orijin / master' ın önünde" sorununu yaşadım. ile uzak bir depoya itti zaman:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

Uzak adresimin .git / FETCH_HEAD dosyasında olduğunu ve kullanıldığını bulduğumda:

git push

sorun ortadan kayboldu.

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.