Git Suçlama - Önceki taahhütler?


391

Belirli bir satır için taahhütlerin geçmişi gibi, rapor edilen taahhütten önce kimin belirli bir satırı düzenlediğini görmek mümkün müdür git blame?

Örneğin, aşağıdakileri çalıştırıyorum (mükemmel uncrustifyprojede):

$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"

Nasıl bu çizgiyi düzenlenmiş öğrenebilirsiniz önce taahhüt fe25b6d? Ve bu taahhütten önce kim düzenledi ?


7
önceki taahhütleri aramanın sebebi boşluk boşlukları -wseçeneğiyse. Ayrıca -Mtaşınan / kopyalanan kod için
brita_

Belirli bir kelimeyi içeren tüm taahhütleri aramak için aşağıdaki senaryomu inceleyin
VonC


3
Emin değilim @AaronHoffman yayınlanmıştır zaman benziyordu GitHub'dan ama ne o suçlu mucho kolaydır - ve olsun önceki sürümleri için suçluyor - github artık .
ruffin

Yanıtlar:


389
git blame -L 10,+1 fe25b6d^ -- src/options.cpp

Git blame için (varsayılan yerine HEAD); fe25b6d^adlı kişinin ebeveyni fe25b6d.


107
Komutu farklı karmalarıyla birkaç kez tekrar girmek zorunda kalmadan eksiksiz bir geçmiş elde edebilir misiniz?
Anders Zommarin

13
Git'in bir satır numarasına dokunan her suçu elde etmenin yerleşik bir yolu olduğuna inanmıyorum (ki bu mantıklıdır, çünkü belirli bir satırın ekleme ve silme nedeniyle dosya geçmişi boyunca tutarlı bir satır numarası olmayabilir. satır).
Amber

17
@Amber: Özelliğin var olmadığından emin olduğunuzdan emin olabilirsiniz, ancak basitçe bir insanın yapacağı şeyi yaparak naif olarak uygulanabileceği gibi görünüyor: bir kez suçlayın, bildirilen bilgileri alın, suçlayın , ve bunun gibi.
Cascabel

15
git gui, sürümler tıklanabilir olduğundan satırın geçmişini kontrol etmeyi oldukça kolaylaştırır.
Zitrax

5
@shadyabhi --genellikle komut satırı argümanlarında ayırıcı olarak kullanılır - Git durumunda genellikle, karma karmaları gibi şeyleri bir dosya adları listesinden ayırmak için kullanılır.
Amber

191

Bir dizi satırın evrimini görüntülemek için git log -L komutunu kullanabilirsiniz .

Örneğin :

git log -L 15,23:filename.txt

"dosyaadı.txt adlı dosyada 15 ila 23 satırlarının evrimini izleyin" anlamına gelir.


12
Bu sağlam bir cevap ve Anders Zommarin'in yukarıdaki zaman içinde belirli hatlardaki değişikliklerin nasıl görülebileceği konusundaki sorusunu ele alıyor.
bigtex777

4
Bilginize: git log -L <start>, <end>: <file> Git 1.8.4+ gerektirir gerektirir: git-scm.com/docs/git-log#git-log--Lltstartgtltendgtltfilegt sözdizimi seçenekleri için
Neon

30

Amber'ın cevabı doğru ama net değilim; Sözdizimi:

git blame {commit_id} -- {path/to/file}

Not: the --, tree-ish sha1 öğesini göreli dosya yollarından ayırmak için kullanılır. 1

Örneğin:

git blame master -- index.html

Tam kredi Amber her şeyi bilerek için! :)


1
Duygularınıza katılıyorum. Ancak yorum sistemi tüm bilgileri açık bir şekilde sunmak için çok kısıtlıdır. Bu cevabın içeriğini bir yorumda ekledim; Yine de, bu cevabı kolay erişim için bir yer bırakmak konusunda ısrar ediyorum.
ThorSummoner

1
Ayrı bir gönderi veya düzenleme olmalıdır. Bunu ayrı bir cevap olarak seviyorum.
Flimm

27

Kontrol etmek isteyebilirsiniz:

git gui blame <filename>

"Git suçlama" gibi değişikliklerin güzel bir grafik görüntüsünü verir, ancak satır başına tıklanabilir bağlantılarla, önceki taahhütlere geçmek için. Tamamlama ayrıntılarını içeren bir pop-up almak için bağlantıların üzerine gelin. Kredilerim değil ... burada buldum:

http://zsoltfabok.com/blog/2012/02/git-blame-line-history/

git guigit için grafiksel bir Tcl / Tc arayüzüdür. Başka herhangi bir parametre olmadan, dosyaları, iri parçaları, hatta tek satırları ve değişiklik, geri döndürme, itme gibi diğer benzer komutları işlemek için oldukça basit ama kullanışlı bir grafik uygulaması başlar. Git stok paketinin bir parçasıdır. Pencerelerde yükleyiciye dahil edilir. Debian - Diğer * nix sistemleri hakkında bilmiyorum - ayrı olarak yüklenmesi gerekir:

apt-get install git-gui

Dokümanlardan:

https://git-scm.com/docs/git-gui

AÇIKLAMA

Git için bir Tcl / Tk tabanlı grafik kullanıcı arayüzü. git gui, kullanıcıların yeni taahhütler yaparak, mevcut olanları değiştirerek, dallar oluşturarak, yerel birleştirmeler gerçekleştirerek ve uzak depoları alıp göndererek depolarında değişiklik yapmalarına odaklanır.

Gitk'ten farklı olarak git gui, kesinleştirme oluşturma ve tek dosya ek açıklamalarına odaklanır ve proje geçmişini göstermez. Ancak git gui içinden bir gitk oturumu başlatmak için menü eylemleri sağlar.

git gui'nin tüm popüler UNIX sistemleri, Mac OS X ve Windows (Cygwin ve MSYS altında) üzerinde çalıştığı bilinmektedir. OS'ye özgü kullanıcı arabirimi yönergelerine uyularak git gui'yi kullanıcılar için oldukça yerel bir arabirim haline getirir.

KOMUTLARI

suçlama

Belirli bir sürümde belirtilen dosyada (veya belirtilmemişse çalışma dizininde) bir suçlama görüntüleyici başlatın.

tarayıcı

Belirtilen işlemdeki tüm dosyaları gösteren bir ağaç tarayıcısı başlatın. Tarayıcı üzerinden seçilen dosyalar suç görüntüleyicide açılır.

citool

Git gui'yi başlatın ve kabuktan çıkıp geri dönmeden önce tam olarak bir taahhütte bulunun. Arabirim yalnızca işlem yapma ile sınırlıdır, uygulamanın başlangıç ​​süresini hafifçe azaltır ve menü çubuğunu basitleştirir.

versiyon

Git gui'nin şu anda çalışan sürümünü görüntüleyin.


Benim için işe yaramıyor. Verilen satırdaki değişikliği tıklayabilirim, ancak bu sadece bu taahhüt için görünümü değiştirir ve mevcut satır şimdi şu şekilde gösterilir this: ancak satırın önceki sürümünü ve ne zaman eklendiğini nasıl görebilirim?
BeeOnRope

Bu git gui en iyi çözüm nerede biliyorum tek kullanımlık durumdur
cambunctious

17

Önceki cevaba dayanarak, bu bash tek katlı size aradığınızı vermelidir. Son 5 düzeltme ile belirli bir dosyanın belirli bir satırı için git suçlama geçmişini görüntüler:

LINE=10 FILE=src/options.cpp REVS=5; for commit in $(git rev-list -n $REVS HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done

Bu komutun çıktısında, satır değişikliğinin içeriğini görebilir ya da görüntülenen satır numarası belirli bir işlem için değişebilir.

Bu genellikle satırın söz konusu işlemden sonra ilk kez eklendiğini gösterir. Ayrıca satırın dosyanın başka bir kısmından taşındığını da gösterebilir.


5
Bunun, $ LINE öğesinin değiştiği son $ REVS düzeltmelerinden ziyade, $ FILE dosyasının değiştiği son $ REVS düzeltmeleri olduğunu unutmayın.
Max Nanasy

Hangi cevaba atıfta bulunuyorsunuz?
Flimm

Artık hatırlamıyorum. Muhtemelen cevabımı daha iyi kanıtlayabilirdim.
Will Sheppard


11

Bu sorun için çok benzersiz bir çözüm git log kullanmaktır:

git log -p -M --follow --stat - / yol / dosya / yolu

Andre tarafından burada açıklandığı gibi


1
Bunu kullanmak için bir takma ad oluşturdum: git config --global alias.changes 'log -p -M --follow --stat --'ve sonra yazabilirimgit changes path/to/your/file
Tizio Fittizio

Bu en iyi cevap ve tam olarak aradığım şeydi. Basit ve zarif.
maesk

10

JetBrains Idea IDE (ve türevleri) kullanıyorsanız, birkaç satır seçebilirsiniz, bağlam menüsü için sağ tıklayın, ardından Git -> Seçim için geçmişi göster. Seçilen satırları etkileyen taahhütlerin listesini göreceksiniz:

resim açıklamasını buraya girin


Bu benim için diğer yanıtlardan daha iyi sonuç verdi (IntelliJ kullanarak). Tüm düzeltmeleri yüklemek için biraz zaman aldı ama beklemeye değer.
Steve Chambers


1

Will Shepard'ın cevabına dayanarak, çıktısında değişiklik olmayan taahhütler için yinelenen satırlar olacak, böylece bunları aşağıdaki gibi filtreleyebilirsiniz (bu cevabı kullanarak )

LINE=1 FILE=a; for commit in $(git rev-list HEAD $FILE); do git blame -n -L$LINE,+1 $commit -- $FILE; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

REVS bağımsız değişkenini kaldırdığımı ve bunun kök işlemine geri döndüğünü unutmayın. Bunun nedeni Max Nanasy'nin yukarıdaki gözlemidir.


1

DavidN'nin cevabına dayanarak yeniden adlandırılan dosyayı takip etmek istiyorum:

LINE=8 FILE=Info.plist; for commit in $(git log --format='%h%%' --name-only --follow -- $FILE | xargs echo | perl -pe 's/\%\s/,/g'); do hash=$(echo $commit | cut -f1 -d ','); fileMayRenamed=$(echo $commit | cut -f2 -d ','); git blame -n -L$LINE,+1 $hash -- $fileMayRenamed; done | sed '$!N; /^\(.*\)\n\1$/!P; D'

ref: git log'da dosya yeniden adlandırma geçmişini güzel göster


0

Suçlama geçmişine bakmak için bu küçük bash betiğini kullanıyorum.

İlk parametre: bakılacak dosya

Müteakip parametreler: git brim'e geçti

#!/bin/bash
f=$1
shift
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    echo "--- $hash"
    git blame $@ $hash -- "$f" | sed 's/^/  /'
  done
}

-L 70, + 10 gibi suçlama parametreleri sağlayabilirsiniz , ancak git suçlamasının normal ifade aramasını kullanmak daha iyidir çünkü satır numaraları tipik olarak zaman içinde "değişir".


0

Üzerine inşa stangls 'ın cevabı , Ben git-bh olarak (hatta Windows üzerinde) benim PATH Bu komut dosyasını:

Bu, bir kelimenin dahil olduğu tüm taahhütleri aramama izin verir:

git bh path/to/myfile myWord

Senaryo:

#!/bin/bash
f=$1
shift
csha=""
{ git log --pretty=format:%H -- "$f"; echo; } | {
  while read hash; do
    res=$(git blame -L"/$1/",+1 $hash -- "$f" 2>/dev/null | sed 's/^/  /')
    sha=${res%% (*}
    if [[ "${res}" != "" && "${csha}" != "${sha}" ]]; then
      echo "--- ${hash}"
      echo "${res}"
      csha="${sha}"
    fi
  done
}
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.