簡潔な答え:
git log --full-history -- your_file
に触れたマージコミットを含む、リポジトリの履歴内のすべてのコミットが表示されますyour_file
。最後の(上)は、ファイルを削除したものです。
いくつかの説明:
--full-history
ここの旗は重要です。これがないと、Gitはファイルのログを要求するときに「履歴の単純化」を実行します。ドキュメントはこれが正確にどのように機能するかについての詳細については軽く、私はソースコードからそれを理解しようとするために必要なグリットと勇気に欠けていますが、git-logドキュメントにはこれだけのことを言っています:
デフォルトモード
履歴を単純化して、ツリーの最終状態を説明する最も単純な履歴にします。最終結果が同じである場合(つまり、同じ内容のブランチをマージする場合)は、いくつかのサイドブランチを枝刈りするため、最も単純です。
これは、その歴史を私たちが望むファイルがされている場合については明らかで削除された削除されたファイルの最終状態を説明する最も簡単な歴史がないので、何の歴史。ファイルが作成されたことがgit log
ない--full-history
と単純に主張するリスクはありますか?残念ながらそうです。ここにデモンストレーションがあります:
mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
1 file changed, 0 insertions(+), 0 deletions(-)
delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery
Date: Tue Jan 12 22:51:36 2016 +0000
Merge branch 'newbranch'
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery
Date: Tue Jan 12 22:50:50 2016 +0000
Deleted foo
commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery
Date: Tue Jan 12 22:50:19 2016 +0000
Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery
Date: Tue Jan 12 22:51:29 2016 +0000
Deleted bar
commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery
Date: Tue Jan 12 22:50:38 2016 +0000
Added bar
git log -- bar
上記のターミナルダンプでは、文字どおり出力されないことに注意してください。Gitは、歴史を、bar
存在しなかったフィクションに「簡略化」しています。git log --full-history -- bar
一方、作成bar
したコミットと削除したコミットが表示されます。
明確にするために:この問題は単なる理論的なものではありません。削除されたファイルを追跡しようとした実際のリポジトリで失敗していた--full-history
ため、ドキュメントを調べただけでフラグを発見git log -- some_file
しました。履歴の簡略化は、現在存在するファイルがどのようにして現在の状態になったかを理解しようとするときに役立つ場合がありますが、ファイルの削除を追跡しようとすると、関心のあるコミットを非表示にすることで失敗する可能性が高くなります。--full-history
この使用例では常にフラグを使用してください。