Git'te HEAD ve ORIG_HEAD


253

Bu semboller ne anlama geliyor ve ne anlama geliyor?

(Resmi belgelerde herhangi bir açıklama bulamıyorum)


4
Not: HEADşimdi (yaklaşmakta olan git1.8.4) ' @'! Bkz aşağıda benim Düzenlenen cevabı
VonC

Not-bis: ' @' (for HEAD) hala geliyor, ancak 1.8.4 cevap için düzenlenmedi ve değiştirilmedi .
VonC

1
Not ter: ' @' for HEAD, git 1.8.5 / 1.9 için geri döndü. cevap tekrar düzenlendi .
VonC

21
HEADve ORIG_HEADGit'te gibidir $PWDve $OLDPWDBash. :)
musiphil

Yanıtlar:


324

HEADmevcut komiteye (doğrudan veya dolaylı, yani sembolik) atıftır. Bu, çalışma dizininde kontrol ettiğiniz bir taahhüttür (bazı değişiklikler veya eşdeğer bir değişiklik yapmadığınız sürece) ve bunun üzerine "git commit" in yeni bir tane oluşturacağı bir taahhüttür. Genellikle HEADdiğer bazı dallara sembolik referanstır; bu dal şu ​​anda kullanıma alınmış dal veya geçerli dal. HEADdoğrudan bir taahhüdü de gösterebilir; bu duruma "müstakil KAFA" denir ve isimsiz, anonim dalda olduğu anlaşılabilir.

Ve @yalnız için bir kısayol HEAD, Git 1.8.5 beri

ORIG_HEADönceki halidir HEADonları geri kolay olacak şekilde, muhtemelen tehlikeli davranışa sahip komutlarla seti. Bu Git reflog sahip olduğunu şimdi daha az yararlıdır: HEAD@{1}eşdeğerdir ORIG_HEAD( HEAD@{1}son değeri her zaman olduğu HEAD, ORIG_HEADson değer HEADtehlikeli operasyon öncesi).

Daha fazla bilgi için git (1) manpage , Git Kullanım Kılavuzu , Git Topluluk Kitabı ve Git Sözlüğü'nü okuyun


2
Merhaba Jakub. Açıklama için +1. {1} HEAD @ 'ın "kabaca eşdeğer" bölümünü ayrıntılandırabilir misiniz? Konuya cevabımı thread.gmane.org/gmane.comp.version-control.git/38379 (Şubat 2007'de geri döndün) konusuna atıfta bulundum ve etrafınızdaki tartışmayı tam olarak anlamadım. @ {...} sözdizimi.
VonC

19
ORIG_HEAD (bence) sadece HEAD'i birden fazla taahhütte bulunduran 'tehlikeli' komutlarla ayarlanır. Bu nedenle ORIG_HEAD her zaman ayarlı değilken HEAD @ {1} her zaman ayarlıdır. @ {1}, $ (git symbolic-ref HEAD) @ {1} 'dir, yani HEAD reflog yerine geçerli dal için reflog kullanır.
Jakub Narębski

Riiight ... Şimdi anladım :) Bu açıklama için teşekkürler. Ne için değer, ben de yorumunuzu iptal ettim!
VonC

1
"ve HEAD, üstüne" git commit "yeni bir tane yapacak bir taahhüttür." - hatırlamak güzel, teşekkürler! Ayrıca @VonC'den, 'Bu, "git commit" komutunun üzerine kurulmuş ve "git diff --cached" ve "git status" komutlarının karşılaştırmasıdır.
Minqi Pan

1
git yardım revizyonları git-scm.com/docs/gitrevisions 'ı getirir ve bu , taahhütlere ( HEADve dahil ORIG_HEAD) başvurmak için tüm yolları açıklar .
dahlbyk

104

Gönderen git reset

"çekme" veya "birleştirme" her zaman geçerli dalın orijinal ucunu bırakır ORIG_HEAD.

git reset --hard ORIG_HEAD

Sabit bir şekilde sıfırlamak, dizin dosyanızı ve çalışma ağacını bu duruma geri getirir ve dalın ucunu bu taahhüdüne sıfırlar.

git reset --merge ORIG_HEAD

Birleşmenin sonucunu inceledikten sonra, diğer daldaki değişikliğin tatmin edici olmadığını görebilirsiniz. " git reset --hard ORIG_HEAD" Çalıştırıldığında bulunduğunuz yere geri dönersiniz, ancak istemediğiniz yerel değişikliklerinizi atar. " git reset --merge" yerel değişikliklerinizi tutar.


Herhangi bir düzeltme eki uygulanmadan önce, ORIG_HEAD geçerli dalın ucuna ayarlanır.
Birden fazla işlemle ilgili sorun yaşıyorsanız, örneğin ` git am` yanlış dalda ' ' çalıştırmak veya işlemlerde posta kutusunu değiştirerek daha kolay düzeltilen bir hata varsa (örneğin, "Kimden:" satırlarında + hatalar).

Ek olarak, birleştirme her zaman ' .git/ORIG_HEAD' HEAD'in orijinal durumuna ayarlanır , böylece sorunlu bir birleştirme ' git reset ORIG_HEAD' kullanılarak kaldırılabilir .


Not: buradan

HEAD hareketli bir işaretçi. Bazen mevcut dal anlamına gelir, bazen değil.

Yani HEAD zaten her yerde "mevcut şube" ile eşanlamlı DEĞİLDİR .

HEAD git'in her yerinde "akım" anlamına gelir , ancak mutlaka "akım dalı" (yani bağımsız HEAD) anlamına gelmez.

Ama neredeyse her zaman "mevcut taahhüt" anlamına gelir.
O "taahhüt olduğunu git commit" üstüne oluşturur ve " git diff --cached" "ve git status" karşı karşılaştırın.
Bu, geçerli dalın yalnızca çok sınırlı bağlamlarda (tam olarak bir dal adının çalışmasını istediğimizde --- şubenin ipucunu taahhüt / rebase / vb. Yoluyla sıfırlamak ve büyütmek anlamına gelir) anlamına gelir.

Reflog, zaman ve geri gitmek için kullanılan bir araçtır ve makineler, "akım" kavramıyla ilginç etkileşime sahiptir.

HEAD@{5.minutes.ago}"ŞİMDİ SAĞLIKTA hangi branşta olduğumuzu öğrenmek için Dereference HEAD symref'i ve ardından bu dalın ucunun 5 dakika önce nerede olduğunu bulmak" anlamına gelebilir.
Alternatif olarak, "5 dakika önce HEAD olarak anılacağım taahhüt nedir?"


git1.8.4 (Temmuz 2013) tanıtır yeni bir gösterim tanıttı !
(aslında, 1.8.5 veya 1.9, 2013 4. Çeyrek için olacak: 9ba89f4 taahhüdü ile yeniden tanıtıldı )

Dört büyük harf " HEAD" yazmak yerine, " @" şimdi,
örneğin " git log @" diyebilirsiniz .

Bkz. Taahhüt cdfd948

' HEAD' Yazmak, özellikle ' @' kullanabildiğimizde ' ' sıkıcıdır .

` @` Seçmenin nedeni , ref@opsözdiziminden (örn. HEAD@{u}) Doğal olarak sözdiziminden kaynaklanmaması ve hiçbir operasyonumuz olmaması ve bunlara sahip olmadığımızda varsaymak mantıklıdır ' HEAD'.

Şimdi kullanabiliriz ' git show @~1' ve tüm bu güzel iyilikleri.

Şimdiye kadar ' @' geçerli bir addı, ancak bu fikirle çelişiyor, bu yüzden onu geçersiz hale getirelim. Muhtemelen çok az insan, eğer varsa, bu ismi kullandı.


1.8.4-rc3 döneminde (14 Ağustos 2013) bir blog yazısı bu özelliğin geri alındığını ve ertelendiğini duyurdu ( Head -up için teşekkürler Cupcake ).
Yine, 9ba89f4 taahhüdü ile tekrar tanıtıldı (Eylül 2013).

Bkz. Taahhüt 2c2b664 :

Döndür "Yeni ekle @için kısayol HEAD"

Bu geri dönüşler cdfd948'i uygular , çünkü sadece " @" (ve @{u}ona uygulandığı gibi değiştiricileri olan formlar ) için geçerli değildir, aynı zamanda " refs/heads/@/foo", etkilemesi gerekenleri de etkiler .

Kısa el verme ile ilgili temel fikir iyi olabilir ve konu daha sonra tekrar denenebilir, ancak önümüzdeki kullanım için şimdilik mevcut kullanım durumlarını etkilemekten kaçınalım.


Git çalıştırıldıktan sonra ORIG_HEAD'i sıfırlayın ve tamamlayın. ORIG_HEAD hala HEAD'in yanındaki Referanslar altında. Neden görünümden kaldırılmadı?
powder366

@ toz 366 ancak bir a git resetüretecektir ORIG_HEAD. Bu yüzden rmmanuel olarak ihtiyacınız var . Örneğin, stackoverflow.com/a/12418078/6309 adresine bakın .
VonC

1
@VonC @için takma HEADediliyor (geçici?) Döndürüldü Git 1.8.4 serbest bırakılması için ! Bugün duyuruldu!

"Head-up" yorum zevk!
Robino

2

Benim anlayış HEAD mevcut dalı işaret ederken ORIG_HEAD "tehlikeli" operasyonlar yapmadan önce önceki HEAD saklamak için kullanılır olduğunu.

Örneğin git-rebase ve git-am, herhangi bir değişiklik yapmadan önce dalın orijinal ucunu kaydeder.


4
HEAD her zaman mevcut dalı işaret etmez (sökülebilir)
VonC

1
Peki, HEAD “müstakil” olduğunda “mevcut şube” nedir?
cjs

@ CurtJ.Sampson Bu "şube yok". bu yüzden müstakil kafanızdayken, git branch foo -byetimler için bir şube oluşturmak için yaparsınız .
Royi Namir

1

Gönderen man 7 gitrevisions:

HEAD, çalışma ağacındaki değişiklikleri temel aldığınız taahhüdü adlandırır. FETCH_HEAD uzak git deposundan getirdiğiniz dalı son git getirme çağrınızla kaydeder. ORIG_HEAD, çalışmadan önce HEAD'in konumunu kaydetmek için HEAD'ınızı sert bir şekilde hareket ettiren komutlarla oluşturulur, böylece dalı çalıştırmadan önce dalın ucunu kolayca duruma geri döndürebilirsiniz. MERGE_HEAD git merge komutunu çalıştırdığınızda şubenize birleştirdiğiniz taahhütleri kaydeder. CHERRY_PICK_HEAD git cherry-pick komutunu çalıştırdığınızda kiraz toplama işini kaydeder.

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.