Bir dosyayı değiştiren en son git komutunu nasıl bulabilirim?


180

Bir kaynak dosyayı değiştiren en son taahhüdü bulmak istiyorum.

git blameHer satırdaki taahhütlerin tüm tarihlerini görmek için kullanabilirim , ancak dosyaya en son hangi taahhüdün olduğunu tam olarak görmek zor.

Git depomda belirli bir dosyaya dokunan son işlemi nasıl bulabilirim?

Yanıtlar:


230

git log belirli dosyaların (ve dizinlerin) geçmişine bakmayı destekler, böylece şöyle diyebilirsiniz:

git log my/file.c

Eğer gerçekten sadece listelemek isterseniz tek En son işlemek bir komut kullanmak, örneğin kullanmak -n 1seçeneği:

git log -n 1 --pretty=format:%H -- my/file.c

--pretty=format:%hgit logsadece taahhüt karmasını göstermeyi söyler . --Separater Belirsiz ihtimale karşı, bir isim taahhüt olarak yorumlanır görmesini dosya adını durur.


12
Şube ne olursa olsun bir dosyanın en son ne zaman değiştirildiğini bilmek istiyorsanız, --allseçeneği ekleyerek tüm dalları düşünebilirsiniz .
KC

44

Eğer sadece en son kaydetmeyi bulmakgit-log istiyorsanız git-rev-list, o dosyayı değiştiren tamamlama nesnelerini listeleyen, en son olandan başlayarak (kronolojik olarak) istemezsiniz . Basit ifadeyle:

git rev-list -1 <commit> <filename>

İçin git-rev-listsizin durumda, tedarik sadece:

  • Dahil edilecek taahhütlerin sayısı veya yalnızca en sonuncusu için -1
  • Dal (veya id işlemek), gelen geri aramaya başlamak için HEAD Zaten Gösterge, ya eğer --all bilinen tüm kaydedilmesini istiyorsanız ve
  • Dosyanızın göreli yolu.

Bu, söz konusu dosyayı değiştirmek için geçerli daldaki en son taahhüt kimliğini döndürür. 215095e2e338525be0baeeebdf66bfbb304e7270

Daha karmaşık bir örnek için, etiket adlarını ve hatta uzak referansları kullanabilir ve örneğin: joker karakterli göreli yol adları ekleyebilirsiniz:

git rev-list origin/user/bob/testbranch -1 src/bfiles/*.txt

... Bu da o dalın tarihindeki joker karakter maçındaki en son değişikliğin ne olduğunu söylerdi. Rev-list seçenekleri aşırıdır, en önemli sıhhi tesisat komutlarından biridir, bu yüzden hayal edebileceğiniz herhangi bir kriteri dahil edebilir veya hariç tutabilirsiniz.

Elbette git-rev-list (1) Kılavuz Sayfasına bakınız .


Gerçekten neden git-logdaha düşük olduğunu açıklamamıştınız .
Piotr Dobrogost

7
Düşük olarak söylemezdim, sadece varsayılan olarak yabancı bilgiler sağlar. git-rev-list, yanıtı bir komut dosyasına veya başka bir otomasyon sürecine besleyecekseniz, taahhüt kimliğini döndürür. git-log seçilen komutlar hakkındaki bilgileri döndürür, önce git-rev-listini kullanarak komut kimlikleri toplanır, ardından her bir komut hakkında bilgi toplanır. Tamamlama bilgilerine filtre uygulayacak ve kimlikleri kullanacaksanız, ilk etapta git-rev-listini kullanabilirsiniz. Günlük rev-listesine dayandığından, aynı filtre parametrelerinin çoğunu alır.
Michael Erickson

3
git-logporselen, git-rev-listsıhhi tesisattır.
blitzen9872

27

Belirli bir dosya kümesini değiştirmek için en son taahhüdün karmasını almak istiyorsanız (ve kaçınmak istiyorsanız awk) şunları kullanabilirsiniz:

git log -n 1 --pretty=format:%h -- <path>

Bu, daha sonra birlikte kullanmak üzere taahhüt karmasını elde etmek için yararlı olabilir git describe.

Örneğin (herkes için yararlı olması durumunda)…

Herhangi bir kaynak dosyayı değiştirmek için son taahhüdünü göz önünde bulundurarak geçerli bir sürüm kimliği oluşturuyorum (sürümleri etiketlerle işaretlediğinizi varsayarsak mycode-1.2.1):

COMMIT=$(git log -n 1 --pretty=format:%h -- *.c *.h)
if VN=$(git describe --always --abbrev=5 --match "mycode-*" $COMMIT 2>/dev/null) &&
case "$VN" in
mycode-*)
    git update-index -q --refresh
    test -z "$(git diff-index --name-only HEAD *.c *.h)" ||
    VN="$VN-mod" ;;
*) VN="mycode-unknown-g$VN" ;;
esac
then
    continue
else
VN="mycode-unknown"
fi

Bu, aşağıdaki gibi kimlikler üretir:

  • mycode-1.2.1 - kaynak dosyaların geçerli durumu etiketli bir sürüme karşılık geldiğinde
  • mycode-1.2.1-g3k7s2 - kaynak dosyaların geçerli durumu etiketli bir sürümü izlemeyi taahhüt ettiğinde
  • mycode-1.2.1-g3k7s2-mod - etiketli bir sürümü izleyen son işlemden bu yana kaynak dosyalarının mevcut durumu değiştirildiğinde
  • mycode-unknown - henüz bir sürüm etiketi oluşturulmadığında

5
$VNbir tür kabus ölümsüz SVN gibi görünüyor
ThorSummoner

10

İstediğiniz bu olup olmadığından emin değilim ama yaparsanız git log <thefile>o dosyayı değiştiren taahhütleri almak için. En üstteki olanı seçebilirsiniz. Aradığın kişi bu olmalı.


4
kullanırsanız git log -n1 -- <thefile>(veya head -1kaynakları boşa harcamak istiyorsanız
çıkışa bağlarsanız

4
İyi bir nokta. Ben de atlayabilir -nve -1doğrudan kullanabilirsiniz .
Noufal Ibrahim

3

Bir satırda yalnızca referansı almak için şunu deneyin:

git log -n1 --oneline <path> | awk '{print $1;}'

2

Kullanmak istediğiniz taahhüdün SHA kimliğine sahip olduktan sonra , söz konusu taahhüt için ne yaptığınızı görebilmeniz git log FILENAMEgerekir git show SHA_ID_HERE. Kimliğin tamamını girmenize bile gerek yoktur; ilk 6 karakter yeterli olmalıdır.


4
Bu OP'nin istediğinden biraz daha fazla, ama FYI bunu tek bir git show $(git log -1 --pretty="%H" -- FILENAME)
astarda
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.