Soru Git sürümlerini kullanarak bir dosyanın değişiklik geçmişini görüntüleme


Bireysel dosyanın Git geçmişini nasıl görüntüleyebilirim, değiştirilenlerle ilgili ayrıntıları tamamla?

Şimdiye kadar var:

git log -- [filename]

Bu bana dosyanın taahhüt geçmişini gösterir, ancak dosya değişikliklerinin her birinin içeriğine nasıl ulaşabilirim?

MS SourceSafe'den geçiş yapmaya çalışıyorum ve bu basit bir şeydi. right-click → show history.


2510
2017-11-10 15:42


Menşei


Yukarıdaki bağlantı artık geçerli değil. Bu bağlantı bugün çalışıyor: Git Topluluk Kitabı - chris


Cevaplar:


Bunun için kullanacağım:

gitk [filename]

veya dosya adlarını geçmiş adlarını takip etmek

gitk --follow [filename]

1951
2017-08-24 12:05



Ama daha önce yukarıdaki gibi 'git suçlama' ile birleştiren bir araçtan daha çok bir dosya kaynağım var. - Egon Willighagen
Ne yazık ki, bu geçmişe ait dosyaların geçmişini takip etmiyor. - Dan Moulding
Ayrıca daha önce yeniden adlandırılmış dosyaların geçmişini aradım ve önce bu ipliği buldum. Çözüm Phil'in işaret ettiği gibi "git log --follow <dosyaadı>" kullanmaktır. İşte. - Florian Gutmann
Yazar bir komut satırı aracı arıyordu. Gitk GIT ile birlikte gelirken, ne komut satırı uygulaması ne de özellikle iyi bir GUI. - mikemaccana
Bir komut satırı aracı mıydı? "sağ tıklama -> geçmişi göster" kesinlikle bunu ima etmez. - hdgarrood


Kullanabilirsiniz

git log -p filename

Git her günlük girişi için düzeltme ekleri oluştursun.

Görmek

git help log

Daha fazla seçenek için - gerçekten çok güzel şeyler yapabiliriz :) Sadece belirli bir işlem için fark almak için

git show HEAD 

veya tanımlayıcı tarafından herhangi bir revizyon. Veya kullan

gitk

değişiklikleri görsel olarak taramak için


1836
2017-11-10 15:56



Git HEAD tüm dosyaları gösterir, bireysel bir dosyayı nasıl izleyeceğinizi biliyorsunuz (Richard'ın sorduğu gibi)? - Jonas Byström
Kullanıyorsanız: git show <revision> - dosya adı, eğer varsa, bu düzeltme için farklılıkları gösterecektir. - Marcos Oliveira
--stat da yararlıdır. -P ile birlikte kullanabilirsiniz. - Raffi Khatchadourian
Bu harika. gitk artık mevcut olmayan yolları belirlerken iyi davranmıyor. Git log -p - yolunu kullandım. - Paulo Casaretto
Artı gitk boogie canavarı tarafından yapılmış gibi görünüyor. Bu harika bir cevaptır ve orijinal soruya en iyi şekilde uyarlanır. - ghayes


git log --follow -p -- file

Bu gösterecektir tüm Dosyanın tarihçesi (yeniden adlandırmanın ötesindeki tarih ve her değişiklik için farklılıklar).

Diğer bir deyişle, dosya isminde bar bir zamanlar adı verildi foo, sonra git log -p bar (olmadan --follow seçenek), dosyanın geçmişini yalnızca yeniden adlandırıldığı noktaya kadar gösterir - dosyanın geçmişini, foo. kullanma git log --follow -p bar Dosyanın tüm tarihini, dosya olarak bilinen tüm değişiklikler de dahil olmak üzere gösterir. foo. -p Bu seçenek, her değişiklik için farkların dahil edilmesini sağlar.


1187
2018-03-30 23:25



--stat da yararlıdır. -P ile birlikte kullanabilirsiniz. - Raffi Khatchadourian
Dan'in cevabı tek gerçek olan! git log --follow -p file - zzeroo
Bu gerçek cevap kabul ediyorum. (1) --follow dosya adlarını görmenizi sağlar (2.) -p Dosyanın nasıl değiştiğini görmenizi sağlar (3.) sadece komut satırıdır. - Trevor Boyd Smith
@Benjohn -- seçeneği, Git seçeneklerinin sonuna ulaştığını ve takip eden herşeyi anlatır. -- argüman olarak ele alınmalıdır. İçin git log Bu sadece bir ile başlayan bir yol adınız varsa, herhangi bir fark yaratır. tire. "--Follow" un talihsiz ismine sahip bir dosyanın tarihini öğrenmek istediğini söyle: git log --follow -p -- --follow - Dan Moulding
@Benjohn: Normalde, -- yararlıdır çünkü herhangi bir revision Girdiğiniz dosya adıyla eşleşen adlar, bu gerçekten korkutucu olabilir. Örneğin: Hem bir şube hem de adında bir dosya varsa foo, git log -p foo git günlüğü geçmişini gösterir foodeğil, tarihin dosya  foo. Ama @DanMoulding bu yana --follow komut sadece argüman olarak tek bir dosya adı alır, bu daha az gereklidir çünkü revision. Bunu yeni öğrendim. Belki de cevabınızdan onu çıkarmaya haklıydınız; Emin değilim. - NHDaly


Metin tabanlı kalmayı tercih ederseniz, kullanmak isteyebilirsiniz tıg.

Hızlı kurulum:

  • apt-get: # apt-get install tig 
  • Homebrew (OS X): $ brew install tig

Geçmişi tek bir dosyada görüntülemek için kullanın: tig [filename]
Veya ayrıntılı repo geçmişine göz atın: tig

Benzer gitk ancak metin tabanlı. Terminalde renkleri destekler!


147
2018-06-07 10:23



Mükemmel metin tabanlı bir araç, harika bir cevap. Başsız sunucuma kurmanın bağımlılıklarını görünce çıldırdım. Tekrar A +++ - Tom McKenzie
Belirli dosyaları tig ile de görebilirsiniz, yani. tig -- path/to/specific/file - gloriphobia


git whatchanged -p filename aynı zamanda git log -p filename bu durumda.

Bir dosyanın içindeki belirli bir kod satırının ne zaman değiştirildiğini de görebilirsiniz. git blame filename. Bu, dosyadaki her satır için kısa bir taahhüt id, yazar, zaman damgası ve kod satırını yazdıracaktır. Bu, bir hata bulduktan sonra ve ne zaman kullanıma sunulduğunu (veya kimin suçu olduğunu) bilmek istediğinizde çok kullanışlıdır.


102
2017-11-11 06:12



+1, ama filenamekomutta isteğe bağlı değil git blame filename. - rockXrock
"Yeni kullanıcılar, git-log yerine kullanmaları için teşvik ediliyor. (...) Komut, öncelikle tarihsel nedenlerden dolayı saklanıyor" - ciastek


SourceTree kullanıcıları

Veri havuzunuzu görselleştirmek için SourceTree kullanırsanız (ücretsiz ve oldukça iyi) bir dosyaya sağ tıklayıp Seçilen Sele

enter image description here

Ekran (aşağıda) gitk ve listelenen diğer seçeneklerden çok daha dostça. Ne yazık ki (şu anda) bu görünümü komut satırından başlatmanın kolay bir yolu yok - SourceTree'nin CLI'si şu anda sadece repos'u açar.

enter image description here


92
2017-07-30 18:55



Özellikle bir dosyanın yeniden adlandırılıp değiştirilmediğini görmenizi sağlayan "Yeniden adlandırılmış dosyaları takip et" seçeneğini beğeniyorum. - Chris
ama yanılmadıkça (lütfen bana bildirin!), sadece gui'de bir kerede iki versiyonu karşılaştırabilir misiniz? Aynı anda birkaç farklı sürümü ayırt etmek için zarif bir arayüze sahip herhangi bir müşteri var mı? Muhtemelen Sublime Text gibi bir yakınlaştırma görünümünde? Bu gerçekten yararlı olurdu. - Sam Lewallen
@SamLewallen Doğru anlıyorsam üç farklı işi karşılaştırmak ister misiniz? Bu, üç yollu birleştirme (benimki, sizinki, üssü) ile benzerdir - genellikle bu strateji, üç rastgele işi karşılaştırmak zorunda olmayan birleştirme çakışmalarını çözmek için kullanılır. Üç yollu birleştirmeyi destekleyen birçok araç var stackoverflow.com/questions/10998728/... ama hile bu araçları belirli revizyonlarla besliyor gitready.com/intermediate/2009/02/27/... - Mark Fox
Teşekkürler Mark Fox, demek istediğim bu. Bunu yapacak herhangi bir uygulamayı biliyor musunuz? - Sam Lewallen
Hayatımı kurtardın. Kullanabilirsiniz gitk bulmak için SHA1 karma, sonra aç SourceTree girmek Log Selected.. bulunan dayalı SHA1. - AechoLiu


Bir revizyon ve yazarın her bir dosyanın son satırını değiştirdiğini göstermek için:

git blame filename

veya güçlü suç GUI kullanmak istiyorsanız:

git gui blame filename

57
2017-08-11 13:01





Onları okuduktan ve biraz oynadıktan sonra diğer cevapların özeti:

Her zamanki komut satırı komutu

git log --follow --all -p dir/file.c

Ancak, daha fazla insan tarafından okunabilir bir şekilde bakma yolları sunmak için ya gitk (gui) ya da tig (text-ui) kullanabilirsiniz.

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

Debian / ubuntu altında, bu güzel araçlar için yükleme komutu beklendiği gibi:

sudo apt-get install gitk tig

Ve şu an kullanıyorum:

alias gdf='gitk --follow --all -p'

böylece sadece yazabilirim gdf dir alt dizindeki her şeyin odaklanmış bir tarihini almak için dir.


40
2017-12-05 18:38



Bence bu harika bir cevap. Belki de oylamada bulunmuyorsunuz çünkü değişik yollarla (IMHO daha iyi) cevapları görebiliyorsunuz, örneğin gitk ve tig ile git'e ek olarak. - PopcornKing
Sadece cevap eklemek için. Yolu bulun (depoda bulunana kadar git boşluğunda). Sonra yukarıda belirtilen komutu kullanın "git log --follow --all -p <folder_path / file_path>". Bu durumda, filde / klasörün tarih boyunca kaldırılacağı, dolayısıyla hala var olan azami yolu bulacağı ve tarihini almaya çalıştığı durumlar olabilir. Eserleri ! - parasrish
--all tüm dallar içindir, geri kalanı da Dan'in cevabında açıklanmıştır. - cregox


Bu diğer adı .gitconfig dosyanıza ekleyin:

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

Ve şu komutu kullanın:

> git lg
> git lg -- filename

Çıkış, gitk çıkışı ile hemen hemen aynı görünecektir. Keyfini çıkarın.


22
2018-06-26 20:12



O kısayolu kestikten sonra dedim ki, "Güzel!". Ancak, "-" işaretinden sonra "\ n" ifadesinin bir hata olduğunu unutmayın. - jmbeck
Ayrıca kullanılabilir git lg -p filename - aranan dosyanın güzel bir farkını döndürür. - Egel