特定の行を編集した人を確認することは可能ですか?before特定の行のコミットの履歴のように、git blame
によって報告されたコミット。
たとえば、以下を実行します(優れたuncrustify
プロジェクトで):
$ git blame -L10,+1 src/options.cpp
^fe25b6d (Ben Gardner 2009-10-17 13:13:55 -0500 10) #include "prototypes.h"
その行を編集した人を見つけるにはどうすればいいですかbefore commit fe25b6d
?そして、誰がそれを編集する前にthat commit?
git blame -L10,+1 fe25b6d^ -- src/options.cpp
Git blameのリビジョンを指定して、(デフォルトのHEAD
の代わりに)最初から振り返ることができます。 fe25b6d^
はfe25b6d
の親です。
git log -Lを使用して、一連の行の変化を表示できます。
例えば :
git log -L 15,23:filename.txt
は、「filename.txtという名前のファイルの15行目から23行目の進化を追跡する」という意味です。
あなたはチェックアウトしたいかもしれません:
git gui blame <filename>
「git blame」のような変更の素敵なグラフィカル表示を提供しますが、行ごとにクリック可能なリンクを使用して、以前のコミットに移動します。リンクにカーソルを合わせると、コミットの詳細を示すポップアップが表示されます。私のクレジットではありません...ここで見つけました:
http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
git gui
は、gitへのグラフィカルなTcl/Tcインターフェイスです。他のパラメータなしで、ファイル、ハンク、または単一行、および修正、復帰、プッシュなどの他の同様のコマンドをコミットするための非常にシンプルで便利なグラフィカルアプリを起動します。これはgitストックスイートの一部です。 Windowsでは、インストーラーに含まれています。 debianでは-他の* nixシステムについては知りません-個別にインストールする必要があります:
apt-get install git-gui
ドキュメントから:
https://git-scm.com/docs/git-gui
説明
GitへのTcl/Tkベースのグラフィカルユーザーインターフェイス。 git guiは、新しいコミットの作成、既存のコミットの修正、ブランチの作成、ローカルマージの実行、およびリモートリポジトリへのフェッチ/プッシュにより、ユーザーがリポジトリを変更できるようにすることに重点を置いています。
Gitkとは異なり、git guiはコミットの生成と単一ファイルの注釈に焦点を当てており、プロジェクトの履歴は表示しません。ただし、git gui内からgitkセッションを開始するメニューアクションは提供します。
git guiは、すべての一般的なUNIXシステム、Mac OS X、およびWindows(CygwinとMSYSの両方で)で動作することが知られています。可能な限りOS固有のユーザーインターフェースガイドラインに従い、git guiをユーザーにとってかなりネイティブなインターフェースにします。
コマンド
blame
指定されたバージョン(または指定されていない場合は作業ディレクトリ)の指定されたファイルで非難ビューアを起動します。
ブラウザ
指定されたコミット内のすべてのファイルを表示するツリーブラウザーを起動します。ブラウザーで選択されたファイルは、非難ビューアーで開かれます。
citool
Git guiを起動し、シェルを終了して戻る前に、1回だけコミットするように手配します。インターフェイスはコミットアクションのみに制限されており、アプリケーションの起動時間をわずかに短縮し、メニューバーを簡素化します。
バージョン
現在実行中のgit guiのバージョンを表示します。
前の答えに基づいて、このbashワンライナーは、あなたが探しているものを提供するはずです。最後の5つのリビジョンまで、特定のファイルの特定の行のgit blame履歴を表示します。
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
このコマンドの出力では、特定のコミットに対して、行の内容が変更されたり、表示される行番号が変更されたりする場合があります。
これは多くの場合、その特定のコミット後に初めて行が追加されたことを示しています。また、ファイルの別の部分から行が移動されたことを示す場合もあります。
recursive-blame
もあります。でインストールできます
npm install -g recursive-blame
この問題に対する非常にユニークなソリューションは、git logを使用することです:
git log -p -M --follow --stat-path/to/your/file
アンドレが説明したように ここ
JetBrains Idea IDE(および派生物)を使用している場合は、複数の行を選択し、右クリックしてコンテキストメニューを選択し、Git->選択の履歴を表示します。選択した行に影響を与えていたコミットのリストが表示されます。
Will Shepardの回答に基づいて、彼の出力には変更がなかったコミットの重複行が含まれるため、次のようにそれらをフィルタリングできます(これを使用して answer )
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引数を削除し、これがルートコミットに戻ることに注意してください。これは、上のMax Nanasyの観察によるものです。
DavidNの答えに基づいて、名前を変更したファイルをフォローしたい:
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'
stangls の answer に基づいて、このスクリプトをgit-bhとしてPATHに(Windowsでも)配置します。
これにより、Wordが関係していたすべてのコミットを検索できます。
git bh path/to/myfile myWord
スクリプト:
#!/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
}
この小さなbashスクリプトを使用して、非難の履歴を調べます。
最初のパラメーター:見るファイル
後続のパラメーター:git blameに渡されます
#!/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、+ 1のようなblame-parametersを指定できますが、行番号は通常時間とともに「変化する」ため、git blameの正規表現検索を使用することをお勧めします。