441

特定の行のコミットの履歴のように、コミットのに特定の行を誰が編集したかを確認することはできますか?git blame

たとえば、次を実行します(素晴らしいuncrustifyプロジェクトで):

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

commit する前に誰がその行を編集したかを知るにはどうすればよいfe25b6dですか? そして、そのコミットの前にそれを編集したのは誰ですか?

4

14 に答える 14

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

(デフォルトの の代わりに) から始まるように git Blame のリビジョンを指定できますHEADfe25b6d^の親ですfe25b6d


編集: Git 2.23の新機能で、次の--ignore-revオプションが追加されましたgit blame

git blame --ignore-rev fe25b6d

これは、コミットのスタックを提供するというOPの質問には答えませんが(git log他の回答に従って、そのために使用します)、他の行を誤って非難する可能性がないため、このソリューションのより良い方法です。

于 2011-02-23T22:55:18.223 に答える
226

git log -Lを使用して、一連の行の進化を表示できます。

例えば ​​:

git log -L 15,23:filename.txt

「filename.txt という名前のファイルの 15 行目から 23 行目までの展開をたどる」という意味です。

于 2015-09-04T11:12:01.487 に答える
38

アンバーの答えは正しいですが、不明確であることがわかりました。構文は次のとおりです。

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

注: は--、ツリー風の sha1 を相対ファイル パスから分離するために使用されます。1

例えば:

git blame master -- index.html

すべてを知っているアンバーの功績です!:)

于 2014-05-19T23:31:20.680 に答える
29

あなたはチェックアウトしたいかもしれません:

git gui blame <filename>

「git Blame」のような変更をグラフィカルに表示しますが、行ごとにクリック可能なリンクがあり、以前のコミットに移動できます。リンクにカーソルを合わせると、コミットの詳細がポップアップ表示されます。私のクレジットではありません...ここで見つけました:

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

git guigit へのグラフィカルな 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 ビューアーを開始します。

ブラウザ

指定されたコミット内のすべてのファイルを表示するツリー ブラウザーを開始します。ブラウザで選択したファイルは、Blame Viewer で開きます。

シツール

git gui を開始し、終了してシェルに戻る前に、正確に 1 つのコミットを行うように手配します。インターフェイスはコミット アクションのみに制限され、アプリケーションの起動時間がわずかに短縮され、メニューバーが簡素化されます。

バージョン

現在実行中の git gui のバージョンを表示します。

于 2016-09-20T10:59:47.263 に答える
18

前の回答に基づいて、この 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

このコマンドの出力では、特定のコミットについて、行の内容が変更されたり、表示される行番号が変更されたりする場合があります。

これは、多くの場合、その特定のコミットの後、その行が初めて追加されたことを示しています。また、行がファイルの別の部分から移動されたことを示している可能性もあります。

于 2012-09-27T13:25:04.787 に答える
14

git logアンドレがここで説明しているように、この問題の非常にユニークな解決策は、を使用することです:

git log -p -M --follow --stat -- path/to/your/file
于 2016-05-29T07:21:19.020 に答える
12

もありrecursive-blameます。でインストールできます

npm install -g recursive-blame
于 2015-09-04T10:46:15.610 に答える
1

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'

ref:ファイルの名前変更履歴を git log にうまく表示する

于 2016-05-29T21:40:20.777 に答える
0

この小さな bash スクリプトを使用して、非難の履歴を確認します。

第 1 パラメータ: 参照するファイル

後続のパラメーター: 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,+10のような Blame-parameters を指定することもできますが、通常、行番号は時間の経過とともに「変化」するため、git Blame の正規表現検索を使用することをお勧めします。

于 2014-02-16T16:28:39.647 に答える
0

stangls回答に基づいて構築し、このスクリプトを git-bh として PATH (Windows でも) に配置します。

これにより、単語が含まれるすべてのコミットを探すことができます。

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
}
于 2014-07-11T12:52:46.623 に答える