Gitバージョン管理を使用してファイルの変更履歴を表示する


3090

Gitで個々のファイルの変更履歴を表示するにはどうすればよいですか?

私は限り:

git log -- [filename]

これはファイルのコミット履歴を示していますが、各ファイルの変更内容を取得するにはどうすればよいですか?

私はMS SourceSafeからの移行を試みていますが、それは以前は単純でしたright-clickshow history


41
上記のリンクは有効ではありません。このリンクは今日機能しています:Gitコミュニティブック
chris

1
上記のリンク(Chrisによる投稿)は無効になりました。このリンクは今日機能しています:git-scm.com/book/en/v2
Cog

回答:


2370

このために私は使用します:

gitk [filename]

または過去の名前変更後にファイル名を追跡する

gitk --follow [filename]

28
しかし、私は上記を 'git blame'と組み合わせて、時間の経過とともにファイルのソースを参照できるツールさえ持っています...
Egon Willighagen

26
残念ながら、これは過去の名前変更のファイルの履歴には従いません。
Dan Molding '30年

146
以前に名前が変更され、このスレッドが最初に見つかったファイルの履歴も探していました。Philがここで指摘しように、解決策は "git log --follow <filename>"を使用することです
Florian Gutmann、2011

115
著者はコマンドラインツールを探していました。gitkにはGITが付属していますが、コマンドラインアプリでも、特に優れたGUIでもありません。
mikemaccana

72
彼はコマンドラインツールを探していましたか?「右クリック->履歴を表示」は、それを意味するものではありません。
hdgarrood 2013年

2235

使用できます

git log -p filename

gitに各ログエントリのパッチを生成させます。

見る

git help log

より多くのオプションのために-それは実際に多くの素晴らしいことをすることができます:)特定のコミットの差分だけを取得するには

git show HEAD 

または識別子によるその他のリビジョン。または使用

gitk

視覚的に変更を閲覧します。


8
git show HEADはすべてのファイルを表示しますが、(リチャードが求めていたように)個々のファイルを追跡する方法を知っていますか?
JonasByström

5
使用:git show <revision>-ファイル名。リビジョンが存在する場合、そのリビジョンの差分を表示します。
Marcos Oliveira

4
--statも役立ちます。-pと一緒に使用できます。
Raffi Khatchadourian、2012年

5
これは素晴らしい。gitkは、存在しないパスを指定すると正常に動作しません。私はgit log -p --pathを使用しました。
Paulo Casaretto 2013

6
さらに、gitkはブギーモンスターによって作成されたように見えます。これはすばらしい答えであり、元の質問に合わせて調整するのが最適です。
ghayes 2013

1498

git log --follow -p -- path-to-file

これにより、ファイルの履歴全体が表示されます(名前の変更を超えた履歴と、各変更の差分を含む)。

言い換えると、名前barが付けられたファイルがかつて名前が付けられていたfoo場合、git log -p bar--followオプションなしで)名前が変更された時点までのファイルの履歴のみが表示されます-として知られてfooいる場合、ファイルの履歴は表示されません。を使用git log --follow -p barすると、ファイルの履歴がすべて表示されますfoo。この-pオプションにより、変更ごとに差分が含まれるようになります。


18
--statも役立ちます。-pと一緒に使用できます。
Raffi Khatchadourian、2012年

23
これが本当の答えであることに同意します。(1.)--followファイルの名前変更を確認します(2.)-pファイルがどのように変更されるかを確認します(3.)コマンドラインのみです。
Trevor Boyd Smith

3
@NHDaly私はこれ--が追加されたことに気づきましたが、これがそれを最高にする理由がわかりませんか?それは何をしているのですか?
ベンジョン、2015年

40
@Benjohn --オプションは、Gitにオプションの最後に達したこと、およびその後に続くもの--はすべて引数として扱う必要があることを伝えます。このためgit logダッシュで始まるパス名がある場合にのみ、違いが生じます。:あなたは「--follow」不幸な名前があるファイルの歴史を知りたいと思ったと言うgit log --follow -p -- --follow
ダン成形

10
@Benjohn:通常、これは、入力したファイル名と一致する--すべてのrevision名前から保護できるので便利です。たとえば:あなたはブランチと名前のファイルの両方を持っていた場合foogit log -p fooアップにgitのログ履歴を示すだろうfooための歴史、ないファイル foo。しかし、@ DanMouldingは正しいです。--followコマンドは引数として単一のファイル名のみを取るので、にすることはできないため、これはそれほど必要ではありませんrevision。私はちょうどそれを学びました。たぶん、あなたはそれをあなたの答えから除外するのが正しかったでしょう。よく分かりません。
NHDaly

172

テキストベースのままにする場合は、tigを使用することをお勧めします。

クイックインストール:

  • apt-get# apt-get install tig
  • Homebrew(OS X)$ brew install tig

これを使用して、単一のファイルの履歴を表示します。tig [filename]
または、詳細なリポジトリの履歴を参照します。tig

似てgitkいますが、テキストベースです。端末の色に対応!


23
優れたテキストベースのツール、素晴らしい答え。ヘッドレスサーバーにgitkをインストールするための依存関係を見たとき、私はびっくりしました。再びA +++に賛成票を投じます
Tom McKenzie

tig -- path/to/specific/file
ティグで

110

git whatchanged -p filenamegit log -p filenameこの場合もと同等です。

また、ファイル内の特定のコード行がで変更された時期も確認できますgit blame filename。これにより、ファイル内のすべての行の短いコミットID、作成者、タイムスタンプ、および完全なコード行が出力されます。これは、バグを発見し、それがいつ導入されたのか(または誰が原因であるのか)を知りたい場合に非常に役立ちます。


4
+1。ただしfilename、コマンドではオプションではありませんgit blame filename
rockXrock 2013年

7
「新しいユーザーは代わりにgit-logを使用することをお勧めします。(...)コマンドは主に歴史的な理由で保持されます。」
ciastek 2014年

105

SourceTreeユーザー

SourceTreeを使用してリポジトリを視覚化する場合(無料で非常に優れています)、ファイルを右クリックして[選択したログ]を選択できます。

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

表示(下)はgitkやリストされている他のほとんどのオプションよりもずっと使いやすいです。残念ながら(現時点では)コマンドラインからこのビューを起動する簡単な方法はありません。SourceTreeのCLIは現在リポジトリを開いているだけです。

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


1
特に、ファイルの名前が変更されたか移動されたかを確認できるオプション「名前を変更したファイルを追跡する」が気に入っています。
Chris

しかし、私が間違っていない限り(お知らせください!)、GUIで一度に比較できるのは2つのバージョンだけですか?一度にいくつかの異なるバージョンを比較するためのエレガントなインターフェースを持つクライアントはありますか?おそらく、Sublime Textのようなズームアウトビューを使用しますか?それは本当に役立つと思います。
Sam Lewallen 2015年

@SamLewallen私が正しく理解している場合、3つの異なるコミットを比較したいですか?これは3者間マージ(mine、yours、base)に似ています。通常、この戦略は、必ずしも3つの任意のコミットを比較するのではなく、マージの競合を解決するために使用されます。そのサポート三方マージ多くのツールがありますstackoverflow.com/questions/10998728/...が、トリックは、これらのツールに特定のリビジョンを供給しているgitready.com/intermediate/2009/02/27/...を
マーク・フォックス

Mark Foxさん、ありがとうございます。それを行うアプリケーションを知っていますか?
Sam Lewallen

1
@ MarnenLaibow-Koserなぜその時点でSHAが必要なのか思い出せません。あはは。
AechoLiu

63

ファイルの各行を最後に変更したリビジョンと作成者を表示するには:

git blame filename

または、強力な非難GUIを使用する場合:

git gui blame filename

49

それらを読んで少し遊んだ後の他の答えの要約:

通常のコマンドラインコマンドは

git log --follow --all -p dir/file.c

しかし、gitk(gui)またはtig(text-ui)のいずれかを使用して、人間がより読みやすい方法で表示することもできます。

gitk --follow --all -p dir/file.c

tig --follow --all -p dir/file.c

debian / ubuntuの下では、これらの素敵なツールのインストールコマンドは期待どおりです。

sudo apt-get install gitk tig

そして私は現在使用しています:

alias gdf='gitk --follow --all -p'

入力gdf dirするだけで、サブディレクトリ内のすべてのフォーカスされた履歴を取得できdirます。


2
これは素晴らしい答えだと思います。gitに加えてgitkとtigを介して変更を確認するために他の方法(IMHOの方が良い)に回答したため、投票されていない可能性があります。
PopcornKing 2013

答えに追加するだけです。パスを見つけます(gitスペースで、リポジトリ内にまだ存在します)。次に、上記のコマンド「git log --follow --all -p <folder_path / file_path>」を使用します。履歴からフィルド/フォルダーが削除された可能性があるため、まだ存在している最大パスを特定し、その履歴をフェッチしてみてください。動作します!
Parasrish

2
--allすべてのブランチ用で、残りは
@Dan

1
名前:名前を変更するだけでなく、ファイルを追跡するための良い解決策を探して久しぶりに、ようやくここで見つかりました。魅力的な作品!ありがとう!
xZero

25

このエイリアスを.gitconfigに追加します。

[alias]
    lg = log --all --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'\n--abbrev-commit --date=relative

次のようなコマンドを使用します。

> git lg
> git lg -- filename

出力は、gitkの出力とほとんど同じです。楽しい。


そのlgショートカットを実行した後、「Beautiful!」と言いました(そして引用します)。ただし、「-graph」の後の「\ n」はエラーです。
jmbeck 2013

3
また、使用することもできますgit lg -p filename-検索されたファイルの美しい差分を返します。
Egel、2015年

22

最近、私はtigそれを発見し、非常に便利だと思いました。AまたはBを実行したい場合もありますが、ほとんどの場合、それはかなり適切です。

あなたのケースでtig <filename>は、あなたが探しているものかもしれません。

http://jonas.nitro.dk/tig/


centosでyum install
tig

18

vscodeはGitLensで使用できます。これは非常に強力なツールです。GitLensをインストールしたら、[GitLens]タブに移動して選択するFILE HISTORYと、それを参照できます。

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


15

私はまさにこの目的のためにgit-playbackを書きました

pip install git-playback
git playback [filename]

これには、コマンドライン(などgit log -p)に結果を表示すると同時に、矢印キー(などgitk)を使用して各コミットをステップ実行できるという利点があります。



10

ファイルの特定の部分を変更したコミットをリストするこれを試すこともできます(Git 1.8.4で実装)。

返される結果は、この特定の部分を変更したコミットのリストになります。コマンド:

git log --pretty=short -u -L <upperLimit>,<lowerLimit>:<path_to_filename>

ここで、upperLimitはファイルのstart_line_number、lowerLimitはending_line_numberです。

https://www.techpurohit.com/list-some-useful-git-commandsで詳細をご覧ください


9

あなたは、ファイルの全履歴を確認したい場合など、上の他のすべての枝を使用します。

gitk --all <filename>

7

優れたGit拡張機能を使用すると、ファイルがまだ存在していた履歴のポイントに移動し(削除されている場合は、それ以外の場合は単にHEADに移動しFile treeます)、タブに切り替え、ファイルを右クリックしてを選択しますFile history

デフォルトでは、ファイル名を変更して名前が変更され、Blameタブでは特定のリビジョンの名前を確認できます。

削除リビジョンをクリックしたときfatal: Not a valid object nameViewタブに表示されるように、いくつかのマイナーな落とし穴がありますが、それでも問題ありません。:-)


これはWindowsのみであることに注意してください。
エヴァンハーン

3
@EvanHahnは正確ではありません。モノを使用すると、LinuxでもGitExtensionを使用できます。ubuntuで使用すると、とても満足しています。git-extensions-documentation.readthedocs.org/en/latest/…を
Shmil The Cat

7

リポジトリメニューでgit GUI(Windows)を使用している場合は、「マスターの履歴を視覚化」を使用できます。上部ペインのコミットと右下のファイルを強調表示すると、左下にそのコミットの差分が表示されます。


これはどのように質問に答えますか?
jmbeck 2013

3
まあ、OPはコマンドラインを指定しておらず、SourceSafe(GUI)から移行すると、WindowsのGit GUIでVSSで実行できるのとほぼ同じことを実行できることを指摘するのは適切だと思われました。
cori 2013

6

SmartGit

  1. メニューで、変更されていないファイルを表示できるようにします:変更されていないファイルの表示/表示
  2. ファイルを右クリックして「ログ」を選択するか、「Ctrl-L」を押します

4

私が探していた答えはこのスレッドにはありませんでした。コミットのためにステージングしたファイルの変更を確認することです。すなわち

git diff --cached

1
ローカル(unstaged)の変更を含めたい場合は、私は頻繁に実行git diff origin/master(を経由してリモートから更新することができ、あなたのローカルブランチとマスターブランチ間の完全な違いを示すためにgit fetch
ghayes

4

TortoiseGitを使用している場合は、ファイルを右クリックして実行できますTortoiseGit --> Show Log。ポップアップするウィンドウで、次のことを確認します。

  • ' Show Whole Project'オプションはチェックされていません。

  • ' All Branches'オプションがチェックされています。


TortoiseGit(およびEclipse Git)は、どういうわけか、選択したファイルのリビジョンを見逃します。それを当てにしないでください!
Noam Manos 2015年

@NoamManos、私はその問題に遭遇していないので、あなたの発言が正しいかどうか確認できません。
user3885927 2015年

私の間違い、それはEclipseでのみ発生しますが、TortoiseGitでは、「すべてのプロジェクトを表示」をオフにして「すべてのブランチ」をオンにすると、ファイルのすべてのリビジョンを確認できます(ファイルがメインにマージされる前に別のブランチでコミットされた場合)ブランチ)。回答を更新します。
Noam Manos


2

gitプラグインでEclipseを使用している場合、履歴との優れた比較ビューがあります。ファイルを右クリックして、「compare with」=>「history」を選択します


ただし、削除されたファイルを見つけることはできません。
avgvstvs 2013

ファイルの2つのバージョンを比較することは、ファイルの変更履歴を表示することとは異なります
golimar

0

私はおそらく、これが始まったときのOPの場所について、vimdiffでgit difftoolを使用して、特定のコミットから始まるリポジトリ内のファイルへの変更を確認できる簡単なものを探しています。私が見つけた答えにあまり満足していなかったので、このgit inc remental rep orter(gitincrep)スクリプトを一緒に投げて、それは私にとって便利でした:

#!/usr/bin/env bash

STARTWITH="${1:-}"
shift 1

DFILES=( "$@" )

RunDiff()
{
        GIT1=$1
        GIT2=$2
        shift 2

        if [ "$(git diff $GIT1 $GIT2 "$@")" ]
        then
                git log ${GIT1}..${GIT2}
                git difftool --tool=vimdiff $GIT1 $GIT2 "$@"
        fi
}

OLDVERS=""
RUNDIFF=""

for NEWVERS in $(git log --format=format:%h  --reverse)
do
        if [ "$RUNDIFF" ]
        then
                RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
        elif [ "$OLDVERS" ]
        then
                if [ "$NEWVERS" = "${STARTWITH:=${NEWVERS}}" ]
                then
                        RUNDIFF=true
                        RunDiff $OLDVERS $NEWVERS "${DFILES[@]}"
                fi
        fi
        OLDVERS=$NEWVERS
done

引数なしで呼び出されると、これはリポジトリ履歴の最初から開始されます。それ以外の場合は、提供された任意の短縮されたコミットハッシュで開始され、現在に進みます。いつでもctrl-Cで終了できます。最初の引数より後の引数は、それらの引数の中でリストされたファイルのみを含むように差分レポートを制限します(これはOPが望んだものであり、小さなプロジェクトを除くすべてに推奨します)。あなたが特定のファイルへの変更をチェックしている場合、最初から開始したい、あなたはARG1に空の文字列を提供する必要があります。vimユーザーでない場合は、vimdiffをお好みのdiffツールに置き換えることができます。

動作は、関連する変更が見つかったときにコミットコメントを出力し、変更されたファイルごとにvimdiff実行の提供を開始することです(これはgit difftoolの動作ですが、ここで機能します)。

このアプローチはおそらく素朴なものですが、ここおよび関連する投稿で多くのソリューションを検討すると、多くの場合、独自の学習曲線を持つインターフェイスを使用して、管理者アクセス権がないシステムに新しいツールをインストールする必要がありました。上記のスクリプトは、何も処理せずに、私が望んでいたことを実行しました。より洗練されたものが必要な場合は、ここで多くの優れた提案を検討しますが、これはOPに直接応答すると思います。


0

ファイルの履歴をすばやく見つけるための非常に簡単な解決策を見つけました。

  1. ファイルをランダムに変更します
  2. ソースツリーでコミットされていない変更として表示されます
  3. ファイルを右クリックして「選択したログ」を選択します

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

すべてのコミットの履歴が表示されます。


このGUIはどこから来たのですか?
コリディア

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