web-dev-qa-db-ja.com

Gitの非難-以前のコミット?

特定の行を編集した人を確認することは可能ですか?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?

343
Sedate Alien
git blame -L10,+1 fe25b6d^ -- src/options.cpp

Git blameのリビジョンを指定して、(デフォルトのHEADの代わりに)最初から振り返ることができます。 fe25b6d^fe25b6dの親です。

340
Amber

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

例えば ​​:

git log -L 15,23:filename.txt

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

157
navneet35371

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

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

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

例えば:

git blame master -- index.html

アンバー にすべてのことを知ってくれたことに感謝します! :)

24
ThorSummoner

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

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のバージョンを表示します。

23
Holger Böhnke

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

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

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

17
Will Sheppard

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

npm install -g recursive-blame
12
Thomas W

この問題に対する非常にユニークなソリューションは、git logを使用することです:

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

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

7
Mannu

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

enter image description here

5
warvariuc

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

1
DavidN

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でファイル名の変更履歴をきちんと表示

1
Bill Chan

stanglsanswer に基づいて、このスクリプトを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
}
0
VonC

この小さな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の正規表現検索を使用することをお勧めします。

0
stangls