Gitのせい—以前のコミット?


391

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

たとえば、次のコマンドを実行します(優れたuncrustifyプロジェクトで)。

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

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


7
以前のコミットを探している理由が空白の変更である場合は、-wオプションを使用します。-M移動/コピーされたコードもあります
brita_ 2014年

特定の単語を含むすべてのコミットを探すには、以下のスクリプトを
VonC


3
@AaronHoffmanが投稿したときのgithubの外観はわかりませんが、現在のgithubで非難するのは簡単で、以前のバージョンの非難を取得することもできます
ruffin

回答:


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

git blameのリビジョンを指定して、(デフォルトのの代わりにHEAD)から遡って調べることができます。fe25b6d^の親ですfe25b6d


107
異なるハッシュでコマンドを何度も再入力することなく、完全な履歴を取得できますか?
Anders Zommarin

13
私はGitが行番号に影響を与えたすべての非難を取得する組み込みの方法を持っているとは思いません(挿入と削除のためにファイルの履歴全体で特定の行が一貫した行番号を持たない可能性があるため、これは一種の理にかなっています)行の)。
アンバー

17
@アンバー:機能が存在しないことは間違いなく正しいことですが、人間が行うことを単純に実行するだけで、単純に実装できるように見えます:一度非難し、報告された情報を取得し、非難します、 等々。
Cascabel

15
git guiを使用すると、バージョンをクリックできるので、行の履歴を簡単に確認できます。
Zitrax、2011年

5
@shadyabhi --は、コマンドライン引数の区切り文字として一般的に使用されます。Git の場合、通常、ファイル名のリストからコミットハッシュなどを区切るために使用されます。
アンバー

192

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

例えば ​​:

git log -L 15,23:filename.txt

「filename.txtという名前のファイルの15行目から23行目までの変化を追跡する」という意味です。


12
これは確かな答えであり、時間の経過に伴う特定のラインの変化を確認する方法に関する上記のAnders Zommarinの質問に対処します。
bigtex777

4
FYI:gitのログは、-L <スタート>、<終了>:<ファイル>が必要ですGitリポジトリ1.8.4+参照:git-scm.com/docs/git-log#git-log--Lltstartgtltendgtltfilegtを構文オプションのために
ネオン

30

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

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

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

例えば:

git blame master -- index.html

すべてを知ることに対するアンバーへの完全な信用!:)


1
私はあなたの意見に同意します。ただし、コメントシステムは制限が厳しく、すべての情報を明確に提示できません。この回答の内容をコメントに追加しました。しかし、私はこの答えはアクセスを容易にするための場所であると主張します。
ThorSummoner 2014年

1
別の投稿か編集のいずれかである必要があります。これは別の答えとして気に入っています。
Flimm、2014

27

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

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 Viewerで開かれます。

シツール

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

バージョン

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


私にはうまくいきません。指定された行の変更をクリックできますが、それはビューをそのコミットのビューに変更するだけで、現在の行はthis次のように表示されます。
BeeOnRope

これは私がgitのGUIが最善の解決策であるところを知っている1つのユースケースである
cambunctious

17

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

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

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


5
これは、$ LINEが変更された最後の$ REVSリビジョンではなく、$ FILEが変更された最後の$ REVSリビジョンであることに注意してください。
Max Nanasy 2013年

あなたはどちらの回答を参照していますか?
Flimm

もう覚えていません。多分私は私の答えを将来的に保証することができたでしょう。
シェパードは2014


11

この問題の非常にユニークな解決策は、git logを使用することです。

git log -p -M --follow --stat-path / to / your / file

アンドレがここで説明したように


1
これを使用するためのエイリアスを作成しました。git config --global alias.changes 'log -p -M --follow --stat --'次のように入力するだけですgit changes path/to/your/file
Tizio Fittizio

これは断然最良の答えであり、まさに私が探していたものです。シンプルでエレガント。
maesk

10

JetBrains Idea IDE(および派生物)を使用している場合は、複数の行を選択し、右クリックしてコンテキストメニューを表示し、[Git]-> [履歴を選択して表示]をクリックします。選択した行に影響を与えていたコミットのリストが表示されます。

ここに画像の説明を入力してください


これは、(IntelliJを使用して)私にとって他の答えよりもうまくいきました。すべてのリビジョンをロードするのにしばらくかかりましたが、待つ価値はありました。
Steve Chambers

2

Git 2.23以降では、git blame --ignore-revを使用できます

質問の例では、これは次のようになります。

git blame -L10,+1 src/options.cpp --ignore-rev fe25b6d

(ただし、fe25b6dはファイルの最初のリビジョンなので、これは簡単な質問です!)


1

ウィルシェパードの回答に基づいて、彼の出力には変更がなかったコミットの重複行が含まれるため、次のようにそれらをフィルタリングできます(この回答を使用)

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の観察によるものです。


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でファイル名の変更履歴を適切に表示する


0

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


0

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

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

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.