git-checkout dosyanın yeni bir adla eski düzeltmesi


264

main.cppDüzenleyicimde " " dosyası var .

main.cppEditörde de önceki " " düzeltmesini görmek istiyorum .

Şimdi bunu yapma şeklim böyle.

close "main.cpp" in the editor

prompt> mv main.cpp tmp
prompt> git checkout HEAD^ main.cpp
prompt> mv main.cpp old_main.cpp
prompt> mv tmp main.cpp
prompt>

open "main.cpp" and "old_main.cpp" in the editor

Basitleştirilebilir, bu yüzden editördeki "main.cpp" dosyasını kapatmam gerekmez mi?

Umduğum git-checkoutşey, bunu yapabilen bir varyantı .


GÜNCELLEME: mac osx 10.5.7 üzerinde git kullanıyorum

prompt> git --version
git version 1.6.0.4
prompt> 

GÜNCELLEME2: Jakub Narębski'nin cevabı:

prompt> git show HEAD^:dir1/dir2/dir3/main.cpp > old_main.cpp
prompt>

GÜNCELLEME3: Karmi'nin cevabı, belirli bir revizyon için:

prompt> git show 4c274dd91dc:higgs/Higgs.xcodeproj/project.pbxproj > old_project.pbxproj
prompt> 

Hangi editörü kullanıyorsunuz? Belki Git için eklenti / addon / modül ekleme desteği var?
Jakub Narębski

Metin arkadaşı kullanıyorum. Bazı git desteği var, bunu yapıp yapamayacağını kontrol etmedim.
neoneye

Textmate'in git paketi var: github.com/timcharper/git-tmbundle (git wiki: git.or.cz/gitwiki )
Jakub Narębski

Bu arada, Emacs'daki (Git'in vc-git.el biçiminde de desteği olduğu) VC arayüzü 'Diğer Sürümü Göster' komutuna sahiptir. TexMate Git Bundle'da (git-tmbundle) yoksa, belki de eklemeye değer.
Jakub Narębski

TextMate'deki projemi daha iyi takip etmek için sembolik bağlantıları kullanıyorum. 25 dirs, 300 dosya. Bu, yapı dizinlerini ve diğer alakasız direkleri gizlemeye yardımcı olur. Ancak git / TextMate bu
sembollerden

Yanıtlar:


312

Bunun için "git show" kullanabilirsiniz:

prompt> git show HEAD^:main.cpp > old_main.cpp

(Kolon [Not olduğu :arasındaki] karakter HEAD^ve main.cpp.) <revision>:<path>Sözdizimini anlatılan git REV-ayrıştırma aşağıdaki "düzeltmeleri Belirlenmesi" bölümünde son noktaya, man:

  • <rev>: <path>, örneğin HEAD: README,: README, master: ./ README

    Bir sonek ve :ardından bir yol, iki nokta üst üste gelen bölüm tarafından adlandırılan tree-ish nesnesindeki belirli bir yoldaki blob veya ağacı adlandırır. :path(iki nokta üst üste işaretinin önünde boş bir kısmı olan), bir sonraki adımda sözdiziminin özel bir halidir: verilen yolda dizine kaydedilen içerik.

    Geçerli çalışma diziniyle ./veya ile başlayan yol ../. Belirtilen yol, çalışan ağacın kök dizinine göreli olarak dönüştürülecektir. Bu, çalışma ağacı ile aynı ağaç yapısına sahip bir ağaç veya ağaçtan bir blob veya ağacı ele almak için en kullanışlıdır.

<path>Burada, projenizin üst dizinine , yani dizini içeren dizine göre TAM yol olduğunu unutmayın . (Veya " <revision> " a (daha genel olarak herhangi bir <treeish , yani ağacı temsil eden bir şey olabilir) daha açık olmak gerekirse ).git/

Geçerli dizine göre yol kullanmak istiyorsanız, ./<path>sözdizimi kullanmanız (veya ../pathgeçerli dizinden yukarı çıkmanız) gerekir .

Düzenleme 2015-01-15: göreli yol sözdizimi hakkında bilgi eklendi


Çoğu durumda aynı çıktıyı düşük düzeyli (sıhhi tesisat) git cat-filekomutunu kullanarak alabilirsiniz:

prompt> git cat-file blob HEAD^:main.cpp > old_main.cpp

3
Ben tam bir kopya ilgileniyorum, ama git-show bana sadece farklılıkları gösterir .. --pretty seçeneği ile uğraşmayı denedim .. istemi> git show --pretty = dolgun HEAD ^ main.cpp ama olmadı Çözmeyin.
neoneye

7
"git show HEAD ^ main.cpp" (HEAD ^ ile main.cpp arasındaki boşlukta) "git show HEAD ^: main.cpp" den ( HEAD ^ ve main.cpp arasında ':' iki nokta üst üste işaretiyle) farklıdır.
Jakub Narębski

Hmm, iki nokta üst üste ile bu hatayı görüyorum, bu yüzden iki nokta üst üste bir hata olduğunu düşündüm. Evet, kolonun gidilecek yol olduğu anlaşılıyor, ama bunu nasıl çözebilirim? istemi> git show HEAD ^: main.cpp ölümcül: belirsiz argüman 'HEAD ^: main.cpp': bilinmeyen düzeltme veya çalışma ağacında yol yok. Yolları revizyon isteminden ayırmak için '-' kullanın>
neoneye

2
Bu muhtemelen yanlış PATHNAME verdiğiniz anlamına gelir (ne yazık ki "git show" nedeniyle sihirli git daha iyi hata mesajı veremez). Projenizin en üst dizinine göre TAM yol adı olmalıdır: $ (git ls-tree -r - sadece isim HEAD ^ | grep main.cpp)
Jakub Narębski

3
Tam yol yerine dokümanlardan: "./ veya ../ ile başlayan bir yol geçerli çalışma dizinine göredir." 1.8.5 sürümümde çalışıyor.
LVB

24

Sadece Jakub'un cevabına eklemek için: >sadece terminaldeki dosya içeriğini gözden geçirmek istiyorsanız, çıktıyı bir dosyaya yönlendirmeniz bile gerekmez . Sadece koşabilirsin $ git show 58a3db6:path/to/your/file.txt.

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.