Git dallanma: master ile orijin / master vs uzaktan kumandalar / orijin / master


201

Git'in temel kavramlarını anlamak için doğru yolda olduğumu düşünüyorum.

Daha önce bir uzak depo kurup klonladım. Ayrıca bir sunucu tarafı boş depo oluşturdum ve yerel veri havuzumu ona bağladım.

Benim sorunum arasındaki farkı anlamıyorum:

  • başlangıç ​​/ ana / uzaktan kumandalar / başlangıç ​​/ ana

Anladığım kadarıyla, usta yerel bir dal ve uzaktan kumanda / orijin / usta uzak bir dal .

Peki kökeni / üstadı tam olarak nedir?


1
@ChristopherWallace: Yaptığınız düzenleme ile meta konusunda iki soru uyandırdınız: " Gerçekten [orijin] etiketine ihtiyacımız var mı? " Ve " Gerçek [Üstat] nedir? ".
Deduplicator

@Deduplicator Bu bir sorun mu?
nbro

@ChristopherWallace: Pek çok kişi, her iki etiketin de (oluşturduğunuz ve eklediğiniz etiket) kötü olduğunu düşünüyor. Katılıyorum, ama belki de tartışılmayan tartışmaya ekleyebileceğiniz bir şey var. Değilse, öyle görünüyor.
Deduplicator


Takip eden soru: Neden .git/refs/origin/masterhiç akmaya başladınız .git/refs/remotes/origin/master? Bu bana şimdi oluyor ve atıyorum.
Paul

Yanıtlar:


219

Uzak bir deponun klonunu alın ve çalıştırın git branch -a(git'in bildiği tüm dalları göstermek için). Muhtemelen şöyle görünecektir:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

Burada, masteryerel depodaki bir şube var. remotes/origin/masteradlı masteruzaktan kumandada adlandırılmış bir dal origin. Buna şu şekilde de başvurabilirsiniz origin/master:

git diff origin/master..master

Ayrıca şu şekilde de başvurabilirsiniz remotes/origin/master:

git diff remotes/origin/master..master

Bunlar aynı şeyi ifade etmenin sadece iki farklı yoludur (bu arada, bu komutların her ikisi de "bana uzak masterdal ile dalım arasındaki değişiklikleri göster) anlamına gelir master.

remotes/origin/HEADolduğu default branchuzak adlandırılmış için origin. Bu sadece originyerine söylemenizi sağlar origin/master.


5
İyi cevap. Ben git branch -auzak şube remotes/origin/masterkısmen altında ref (saklanmış .git/refs/remotes/origindeğilse) içinde saklandığı için olduğunu düşünüyorum düşünüyorum . Benim düşünceme göre, git branch -abelki de uzaktan kumandanın adını dalın adından bir eğik çizgiden başka bir şeyle ayırarak çok daha net olabilir.
Matt Hurne

14
Ayrıca git branch -r, yalnızca uzak dalları gösterecek olan dalı origin/master, remotes/önek gerekli olmadığı için gösterecektir .
Matt Hurne

3
@misterbiscuit: bu doğru. Çıktı netleştirmekten daha kafa karıştırıcı. Çok teşekkürler, soruya doğru ipuçlarını veren harika bir cevap
John Rumpel

Azından ben bakarsak git loggördüğüm commit fa9sd8jasdf98 (HEAD -> master), demek ne? Bu durumda HEAD nedir? Şu anda "usta" olduğumu ve bunu taahhüt ettiğimi düşündüm origin/master. Sanırım karışık bir şey aldım, birisi sakinleşmeye yardımcı olabilir mi? GÜNCELLEME DÜZENLEME: Sanırım anladım, HEAD'in şu anda ana şubeye işaret ettiğini varsaymak doğru mu, yani şu anda master yapmaya devam etmekte olduğum anlamına mı geliyor?
Sebastian Nielsen

@SebastianNielsen evet haklısınız, HEAD -> master bölümü şu anda master şubesinde olduğunuz anlamına gelir.
iRestMyCaseYourHonor

108

Benim gibi mankenlere kısa cevap (Torek'ten çalındı):

  • origin / master "son kontrol ettiğimde master oradaydı"
  • üstat "üstadın burada yaptığım şeye dayanarak burada olduğu"

9
origin / master = uzak makinenin yedeği, master'ı en son kontrol ettiğinizde güncellendi = orijin / master kopyanız
sakurashinken

40

Teknik olarak Git deponuzda aslında 1 "uzak" şey yok, sadece başka bir farklı repodaki isimlere karşılık gelmesi gereken yerel isimler var . Adı verilenler origin/whateverbaşlangıçta klonladığınız repodakilerle eşleşecektir:

git clone ssh://some.where.out.there/some/path/to/repo # or git://some.where...

diğer repoyu yerel olarak kopyalar. Yol boyunca orada bulunan tüm şubeleri not eder ve bu atıfları taahhüt eder ve bunları isimler altında yerel repolarınıza yapıştırır refs/remotes/origin/.

Sizden ne kadar süre geçtiğinize git fetchveya eşdeğeri olan "some.where.out.there" dosyasının kopyasını güncellemeye bağlı olarak , dallarını değiştirebilir, yenilerini oluşturabilir ve bazılarını silebilirler. Yaptığınız zaman git fetch(ya git pullda gerçekten getir artı birleştirme), repo yeni çalışmalarının kopyalarını yapacak ve tüm refs/remotes/origin/<name>girişleri gerektiği gibi değiştirecektir . Her fetchşeyin eşleşmesini sağlayan o anı (iyi, bu ve ilk klon ve bazı pushing vakaları - temelde Git kontrol etme şansı elde ettiğinde - ancak aşağıdaki uyarıya bakın).

Git normalde kendi başvurmak vardır refs/heads/<name>tıpkı <name>, ve gibi uzak olanları origin/<name>ve bunlardan biri olan bariz çünkü hepsi sadece çalışır. Bazen açık olmayan kendi şube adlarınızı oluşturmak mümkündür, ancak bu gerçekleşene kadar endişelenmeyin. :-) Git'e bunu açıkça ortaya koyan en kısa adı verin ve oradan gidecek: origin/master"son kontrol ettiğimde usta oradaydı" ve master"yaptığım şeye göre usta burada bitti" . git fetchGit'i gerektiği şekilde "master'ın orada olduğu yerde" güncellemek için çalıştırın .


Uyarı: Git'in 1.8.4'ten daha eski sürümlerinde, "kaptanın git fetchorada olduğu yerde" güncellenmeyen bazı modları vardır (daha kesin olarak, herhangi bir uzaktan izleme dalını güncellemeyen modlar). Koşu git fetch originveya git fetch --allhatta sadece git fetch, yok güncelleştirmeyi. Koşu git fetch origin master yapmaz . Ne yazık ki, bu "güncellenmez" modu sıradan bir tetikleyicidir git pull. (Bu sadece küçük bir sıkıntı ve Git 1.8.4 ve sonrasında düzeltildi.)


1 "Uzak" adı verilen bir şey var . Ama bu da yerel! Adı originGit'in "uzak" dediği şeydir. Temelde, klonlama yaparken kullandığınız URL için kısa bir addır. Aynı zamanda originin origin/masternereden geliyor. Adı , özellikle eski veya daha gayri resmi belgelerde bazen "uzak dal" a kısaltılan origin/masterbir uzaktan izleme dalı olarak adlandırılır .


2
Benim gibi bir acemi için mükemmel bir açıklama, teşekkür ederim! origin/masterEtiketi neden localrepo grafiğine koyduğuna ve remotebir kereye değil de açıkladı (Jessica Kerr'un "Git Happens" sunumunu gönülden tavsiye ediyorum git: vimeo.com/46010208 . 30:00 - 30 saatleri arasında başımı kaşıyordum: 19.)
büyük ihtiyar

11

Yeni başlayanlar için @ ErichBSchulz'un cevabını basitleştirmeye çalışacağım:

  • origin / master uzak depodaki ana dalın durumudur
  • master , yerel depodaki master şubenin durumudur

1
iyi deneyin ama IMHO w / out last time I've checkedönemli noktasını
kaybediyor

6
  1. origin - Bu, uzaktan kumandayı gösterecek özel ve en yaygın addır.

$ git remote add origin https://github.com/git/git.git--- github projenizi başlangıç ​​noktasına bağlamak için bu komutu çalıştıracaksınız. Burada kökeni kullanıcı tanımlıdır. Tarafından yeniden adlandırabilirsiniz$ git remote rename old-name new-name


  1. master - Git'teki varsayılan şube adı master'dır. Hem uzak hem de yerel bilgisayar için.

  1. origin / master - Bu, uzak repodaki ana dalı ifade etmek için yalnızca bir işaretçi. Kökeni uzaktan işaret ettiğini söylediğimi hatırla.

$ git fetch origin- Uzak depodan yerel bilgisayarınıza [kaynak / master] nesneleri ve referansları indirir. Bu, kullanarak birleştirmediğiniz sürece yerel ana dalınızı etkilemeyeceği anlamına gelir $ git merge origin/master. Bu komutu çalıştırmadan önce birleştirmeniz gereken doğru şubeyi kontrol etmeyi unutmayın.

Not: Alınan içerik uzak dal olarak gösterilir. Getirme, değişiklikleri proje kopyanıza entegre etmeden önce gözden geçirme şansı verir. Sizinki ile uzaktan kumandanız arasındaki değişiklikleri göstermek için$git diff master..origin/master


5

Bir açıklama (ve beni şaşırtan bir nokta):

"uzaktan kumandalar / origin / HEAD varsayılan dal" gerçekten doğru değil.

uzaktan kumandalar / origin / master uzak depodaki varsayılan daldı (son kontrol ettiğinizde). HEAD bir şube değil, sadece bir şubeye işaret ediyor.

HEAD'ı çalışma alanınız olarak düşünün. Bu şekilde düşündüğünüzde, 'git checkout branchname' çalışma alanı dosyalarınızı belirli bir dalın dosyası olarak değiştirmek açısından mantıklıdır. Şube dosyalarını çalışma alanınıza "çıkış" yaparsınız. Tüm pratik amaçlar için KAFA çalışma alanınızda görebileceğiniz şeydir.


Daha doğrusu, HEADbir dalın göstergesidir (yerel deponuzdaki gerçek dosya genellikle dizeyi içerir, ref: refs/heads/masterörneğin ... "tamamen ayrılmadığı sürece, tamamen başka bir şeydir). Bununla birlikte, clone"uzak HEAD" i yorumlama biçiminde bir hata vardır : aktarım protokolleri dolaylı bir şube gönderemez, sadece ham bir SHA-1'dir, bu yüzden git bunu "çoğunlukla işe yarar" yapan bir çamura sahiptir. Arada sırada garip bir durumla karşılaşan biri var. Keşke git git hiç yaratmadı remotes/origin/HEAD, özellikle yanlış çıktığında ...
Torek

2

Bence bu git eğik çizgi yazısı muhtemelen en iyi .gitklasörünüze bakarak anlaşılır .


Örneğin, burada LibreOffice kaynak tabanı için .gitimin kısaltılmış ağacı var.

Gelen Linux sudo apt-get install tree bu görüntülemek için yararlıdır.
In Windows'un bence treekomut çalışmaları hala bırakabilirim.

Sayfayı aşağı kaydırın ve en alttaki referanslara ('referanslar') bakın:

$ tree  
.  
├── branches  
├── config  
├── description  
├── FETCH_HEAD  
├── gitk.cache  
├── HEAD  
├── hooks  
│   ├── applypatch-msg.sample  
    ...
├── index  
├── info  
│   └── exclude  
├── logs  
│   ├── HEAD  
│   └── refs  
│       ├── heads  
│       │   ├── master  
│       │   └── remotes  
│       │       └── origin  
│       └── remotes  
│           └── origin  
│               ├── distro  
│               │   ├── cib  
│               │   │   └── libreoffice-6-0  
│               │   ├── collabora  
│               │   │   └── cp-6.0  
│               │   └── lhm  
│               │       └── libreoffice-5-2+backports  
│               ├── HEAD  
│               ├── libreoffice-6-2  
│               ├── master  
│               └── private  
│                   └── mst  
│                       └── sw_redlinehide_4a  
├── objects  
│   ├── info  
│   └── pack  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.idx  
│       ├── pack-b80087dc57e2b3315f449ca0f1aaa91987bf0c5e.pack  
│       ├── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.idx  
│       └── pack-eb4e6808029e712d8d9c2671accbbd98aaeb9a04.pack  
├── ORIG_HEAD  
├── packed-refs  
└── refs  
    ├── heads  
    │   ├── master  
    │   └── remotes  
    │       └── origin  
    ├── remotes  
    │   └── origin  
    │       ├── distro  
    │       │   ├── cib  
    │       │   │   └── libreoffice-6-0  
    │       │   ├── collabora  
    │       │   │   └── cp-6.0  
    │       │   └── lhm  
    │       │       └── libreoffice-5-2+backports  
    │       ├── HEAD  
    │       ├── libreoffice-6-2  
    │       ├── master  
    │       └── private  
    │           └── mst  
    │               └── sw_redlinehide_4a  
    └── tags  
        └── libreoffice-6-2-branch-point  

32 directories, 45 files

Bu şekilde düzenlenmişse daha az kafa karıştırıcı olabilirdi, ama değildi:

repositories (i.e. independent trees)
├──local
│  └──master
│
└──origin1
│  └──master
└──origin2
   └──master

Üç temel referans türümüz vardır : kafalar , uzaktan kumandalar ve etiketler .

  • .git / refs / heads yerel yöneticimizi elinde tutar .

  • .git / ref / uzaktan kumanda anda sadece olmasına rağmen, uzaktan kumanda bir sayıda tutabilir kökeni onun içinde.

  • .git / refs / tags (başka yerlerde tartışılır).

köken dolayısıyla sadece uzaktan bizim bir ve olduğunu. Bu tutar köken / ustası .


Bir tane yerel ve bir uzaktan kumanda olmak üzere 2 KAFA (mevcut dallara işaretçiler) olduğunu görüyoruz :

$ cat .git/HEAD                        #         local:  HEAD -> master
ref: refs/heads/master

$ cat .git/refs/remotes/origin/HEAD    # remote origin:  HEAD -> master
ref: refs/remotes/origin/master

Şubelerinizi listelerseniz :

$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/aoo/aw080
  remotes/origin/aoo/trunk
  remotes/origin/distro/capgemini/cg-4.1
  remotes/origin/distro/cib/libreoffice-5-0
  remotes/origin/distro/cib/libreoffice-5-1
  remotes/origin/distro/cib/libreoffice-5-2
  ...
  • Listelenen ilk dal ( ana ), uzak olmayan tek daldır . Yani bu durumda bir yerel şubemiz var. Burası, kendi yeni şubelerimiz ve müteakip taahhütler için kendi çalışmalarımızdan başlayacağımız yerdir.

Sonra, birçok uzaktan izleme şubeniz olabilir ve burada yapıyoruz. Bunların uzaktan izleme dalları olduğunu biliyorsunuz çünkü ' uzaktan kumandalar ' ön ekine sahipler . Burada gösterilenler orijinli uzaktan kumanda içindir.

  • İkinci satır, başlangıç ​​noktasının geçerli dal işaretçisidir. Uzaktan kumandalar / kökeni: HEAD - - master'a işaret eder. Bu, uzak depoda, geçerli dalın master adlı kendi dalı olduğunu gösterir ( master adlı yerel şubemizle karıştırılmamalıdır ).

  • Kalan dallar .git / refs / ağacınızda bulunmaz, aksine onları bulabilirsiniz .git/packed-refs.

Biz ne zaman getir Git bizim uzaktan izleme depoya, uzaktan deposundan değişiklikleri indirmek.

Biz ne zaman birleştirme git'e bizim master dalında bu durumda, bizim çalışma yerel şube veya şubeler içine bu yerel, uzak izleme deposundaki değişiklikleri birleştirmek.

( Git tuşuna bastığımızda , bu iki adımı da tek bir işlemde yaparız.)


Master için bu yerel ve uzak UUID'lerin şu anda aynı düğüme işaret ettiğini de belirtmek ilginçtir :

$ cat refs/heads/master                   # local         master
1ca409292272632f443733450313de5a82c54a9c

$ cat refs/remotes/origin/master          # remote origin master
1ca409292272632f443733450313de5a82c54a9c

Böylece yerel yöneticimiz uzaktan kumandanın başlangıç ​​ustasıyla aynı yere işaret ediyor:

[local] master = [remote] origin master

Son olarak, bence de .git/packed-refs

$ cat packed-refs 
# pack-refs with: peeled fully-peeled 
3c1d4742e649fe9c8aed8c2817fe3e1f3364f298 refs/remotes/origin/aoo/aw080
e87c8b7922e9a73e0abb7f9a7a47c9ac3374a826 refs/remotes/origin/aoo/trunk
b70fdffb041c12f124dcc0822b61bf3450e53137 refs/remotes/origin/distro/capgemini/cg-4.1
5dbc3f1754809b9489faaf380b1a4bdbcfbb6205 refs/remotes/origin/distro/cib/libreoffice-5-0
cfdbc96ca47d68d6785fd21829a8d61f49d6e591 refs/remotes/origin/distro/cib/libreoffice-5-1
5189c8c47461ef09739086e55512fc6a10245273 refs/remotes/origin/distro/cib/libreoffice-5-2
3bee5917569ca8e6ee3b086458f5b1a917b88ca1 refs/remotes/origin/distro/cib/libreoffice-5-3
92fbe703f9ca480d3a2b8610d87e991c729edf77 refs/remotes/origin/distro/cib/libreoffice-5-4
05c0a5df66cc69d75280f05b804cf82f3387d42b refs/remotes/origin/distro/cib/libreoffice-6-0
7fe193e759b24b90852e6e327115b77114d7b119 refs/remotes/origin/distro/cib/libreoffice-6-1
8187f7aa413e7ef7b377eea2b057d336bf256867 refs/remotes/origin/distro/collabora/cd-5.3
7a6b608591e21ef61dc05cff9fc58da531035755 refs/remotes/origin/distro/collabora/cd-5.3-3.1
....

Kuşkusuz bu cevaplardan daha fazla soru bırakıyor, ancak bence ne olduğu hakkında kendi sorularınızı cevaplamanıza yardımcı olabilir.

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.