Belirli bir dosyayı değiştiren tüm taahhütleri nasıl listeleyebilirim?


801

Belirli bir dosyayı değiştiren tüm taahhütleri listelemenin bir yolu var mı?


1
Tek bir dalda bir dosyada değişiklik mi arıyorsunuz? tüm yerel şubelerde; tek bir uzaktan kumandanın tüm dallarında; ya da her şeyin karşısında mı? Bence her şey bir senaryo gerektirecek.
benhorgen

Yanıtlar:


1082

--followBelirli bir dosya için çalışmalar

git log --follow -- filename

Verilen diğer çözümlere göre farklılık

Diğer çözümlerin git log path(içermeyen --follow) olduğunu unutmayın. Bu yaklaşım, örneğin bir dizindeki değişiklikleri izlemek istiyorsanız , ancak dosyalar yeniden adlandırıldığında tökezliyorsa (bu nedenle kullanın --follow filename) kullanışlı olur .


32
--followgit log -- path
Yeniden

42
Bir dosya değil aynı zamanda bir dizin olabilen --followbir yolu kabul ettiğini unutmayın . İkincisi durumunda, özyinelemeli olarak çalışacak ve değişiklikleri bu noktanın altındaki tüm dosyalara bildirecektir. (Bu davranış kılavuzda belgelenmemiştir ve kalıcı olmayabilir.)
StvnW

5
Bu ve sadece arasındaki fark nedirgit log filename?
VaTo

8
@SaulOrtega, git log filenamedosya yeniden adlandırma izleyin o ilgili tüm kaydedilmesini gösterecektir yani gelmez dosya (gerçek değil dosyası). Dosyaları oluşturursanız Xve Yher iki değişti, sonra silinir Yve yeniden adlandırılmış Xiçin Yve sonra da bunu değişti ve çalıştırmak git log Yher ikisi için mesajlar alacak, eski Y ve yeni biri. Ve ile zıt, --followsize o seçildi zaman bu dosyayı ilgili kaydedilmesini alacak X ve o seçildi zaman Y.
MarSoft

7
tüm şubelerdeki tüm işlemleri görmek için "git log --all dosyaadı"
nı kullan

122

git log pathne istersen yapmalısın. Gönderen git logadam :

[--] <path>…

Show only commits that affect any of the specified paths. To prevent confusion with 
options and branch names, paths may need to be prefixed with "-- " to separate them
from options or refnames.

11
Dosyanın yolu değiştiyse çalışmaz. jackrabbit'in cevabı bu dava için işe yarıyor.
kwahn

1
Günlüğü belirli bir dalla kısıtlamanız gerekiyorsa çalışır
ams

63

Buna yakından bakıyorum ve tüm bu cevaplar bana tüm şubelerdeki tüm taahhütleri göstermiyor gibi görünüyor.

İşte gitk düzenleme görünümü seçenekleri ile uğraşarak ne ile geldi. Bu bana şube, yerel, reflog ve uzaktan bakılmaksızın tüm dosya taahhütlerini gösterir .

gitk --all --first-parent --remotes --reflog --author-date-order -- filename

Ayrıca aşağıdakilerle çalışır git log:

git log --all --first-parent --remotes --reflog --author-date-order -- filename

11
Bu, birisi değişiklik yaptığında mükemmeldir, ancak değişiklikleri nerede gerçekleştirdiğini unutur.
earthmeLon

2
Çok kullanışlı. Ayrıca saklı taahhütleri içerir
Juan Antonio Tubío

Bu tercih edilen cevap olmalıdır. Soru, tüm taahhütleri bulmaktı, bu da.
carl verbiest

Bildirim --reflog/ rebased tadil veya başka atıldı kaydedilmesini içerir. Belki bu açık olmalı, ama bunu ile kullanmayı denedim git logve neden yinelenen taahhütleri gördüğümü anlamaya çalışıyordum!
Soren Bjornstad

43

Belirli bir dosya için taahhüt almak için aşağıdaki komutu kullanın:

git log -p filename

8
Anlaşılanların bir listesini istediğinden bunun soruyu tam olarak cevaplamadığını anlıyorum, ancak bu altın ve dosyama gidiyor.
zkent

3
Dosya şu anda kullanıma alınmış dalda yoksa bu hiçbir şekilde çalışmaz. Şube gibi ekleyebilirsiniz git log -p mybranch -- filenameveya sadece git log --all -- filenametüm şubelere bakmak için kullanın .
Soren Bjornstad

37

Bu kadar basit olmalı git log <somepath>; sayfayı kontrol edin ( git-log(1)).

Şahsen kullanmaktan hoşlanıyorum, git log --stat <path>böylece her taahhüdün dosya üzerindeki etkisini görebiliyorum.


9
Ya da -ptam farkı görmek isteseniz bile , sadece birkaç satır değiştirildiğinden değil.
Cascabel

Doğru, ama çoğu dosya hayatları boyunca birçok kez değiştirildi göz önüne alındığında bu oldukça gürültülü. Bir dosyaya dokunan her bir taahhüdün tam farklarını görmek istemiyorum. Genellikle belirli bir şey arıyorum, bu yüzden sadece etkileri olan ve daha sonra git showönemli gibi görünen belirli taahhütlerde bir günlük alabilirsiniz .
rfunduk

git log --stat --follow - * .html => her taahhütte tam olarak bir dosya içeren taahhütlerin çıktı listesi. Çok hoş!
Sergio Belevskij

18

Alternatif olarak (Git 1.8.4'ten beri), bir dosyanın belirli bir bölümünü değiştiren tüm taahhütleri almak da mümkündür . Bunu başlangıç ​​çizgisini ve bitiş çizgisi numarasını ileterek alabilirsiniz.

Döndürülen sonuç, bu bölümü değiştiren taahhütlerin listesi olacaktır. Komut şöyle gider:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

nerede upperLimitolduğunu start_line_numberve lowerLimitbirending_line_number

Daha Fazla Bilgi - https://www.techpurohit.com/list-some-useful-git-commands


17

Jackrabb1t'ın işaret ettiği gibi --follow, geçmişi yeniden adlandırma / hamlelerin ötesinde listelemeye devam ettiği için daha sağlamdır. Dolayısıyla, şu anda aynı yolda olmayan bir dosyayı veya çeşitli işlemlerde yeniden adlandırılmış bir dosyayı arıyorsanız, --follow dosyayı izler.

Ad / yol değişikliklerini görselleştirmek istiyorsanız bu daha iyi bir seçenek olabilir:

git log --follow --name-status -- <path>

Ancak, yalnızca önemli olan daha kompakt bir liste istiyorsanız:

git log --follow --name-status --format='%H' -- <path>

ya da

git log --follow --name-only --format='%H' -- <path>

Dezavantajı, --followsadece tek bir dosya için çalışıyor olmasıdır.


4
--followbir dizin olabilen tek bir yol için çalışır . Bir dizini geçtiyse, özyinelemeli olarak çalışır ve değişiklikleri bu noktanın altındaki tüm dosyalara bildirir.
StvnW

10

Önceki bir kullanımda silinen bir dosyayı takip etmeye çalışıyorsanız

git log --follow -- filename

3
Yeni gitbaşlayanlar için: git log -p --follow -- filenameDeğişiklikleri de görüntülemek için kullanın . Ayrıca not: "dosyaadı" bir dosya, bir dizin veya bir alt modül olabilir.
Tino

8

Bir dosyayı değiştiren tüm taahhütleri görüntülemek istiyorsanız, tüm şubelerde şunu kullanın:

git log --follow --all <filepath>

8

Eğer bütün kaydedilmesini bakmak istiyorsanız filenameve vermeyerek filepath , kullanım:

git log --all -- '*.wmv'

6

Belirli bir dosyayı değiştiren işlemlerde yapılan tüm değişiklikleri görmek istiyorsanız (yalnızca dosyanın kendisindeki değişiklikler yerine) şunları iletebilirsiniz --full-diff:

git log -p --full-diff [branch] -- <path>

veya olmadan[branch]
Anentropik

1
@Anentropik Köşeli parantezlerin argümanın isteğe bağlı olduğunu göstermesi gerekiyordu.
Kübik

İhtiyacım olan her şey, Tam değişim gösteriyor, birleşmeden bazı değişiklikler içeriyor.
ThanhLD

5

Tüm şubelerde git log --all <filename>etkili olan taahhütleri görüntülemek için kullanın <filename>.


4
gitk <path_to_filename>

"Gitk" paketinin kurulu olduğu varsayılarak.

Yüklü değilse, şunları yapın:

sudo apt-get install gitk

Ve sonra yukarıdaki komutu deneyin. Linux içindir ... Bir GUI istiyorsa Linux kullanıcılarına yardımcı olabilir.


Windows kullanıcıları gitkiçin, Windows için Git ile birlikte geldiğini unutmayın .
Soren Bjornstad

2

Sadece sağlama karmalarının bir listesini almak için git rev-list

 git rev-list HEAD <filename>

Çıktı:

b7c4f0d7ebc3e4c61155c76b5ebc940e697600b1
e3920ac6c08a4502d1c27cea157750bd978b6443
ea62422870ea51ef21d1629420c6441927b0d3ea
4b1eb462b74c309053909ab83451e42a7239c0db
4df2b0b581e55f3d41381f035c0c2c9bd31ee98d

yani 5 dosya bu dosyaya dokundu. Ters kronolojik sıra, bu yüzden listedeki ilk taahhüt b7c4f0d7en son olanı.


1

Linux'ta bunun için gitk kullanabilirsiniz.

"Sudo apt-get install git-gui gitk" kullanılarak kurulabilir. Belirli bir dosyanın işleyişini "gitk <Filename>" ile görmek için kullanılabilir.


1
# Shows commit history with patch
git log -p -<no_of_commits> --follow <file_name>

# Shows brief details like "1 file changed, 6 insertions(+), 1 deletion(-)"
git log --stat --follow <file_name>

Referans

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.