2016-05-26 16 views
1

私はそれが指定されたファイルにすべての変更(コミット)を表示すると思っていますが、それはしません。それはそれらのいくつかだけを示しています。私はそれが合併と関係があると思うが、ここで何がうまくいかないのか分からない。誰かがそれを説明できますか?`git log -p path/to/file`はすべての変更を表示しません

UPD私はテストレポで私の特定の問題を再現することができました:

#!/usr/bin/env bash 
set -eu 
rm -rf 1 
mkdir 1 && cd 1 
git init 

mkdir 1 
echo m1 > 1/m1 && git add 1/m1 && git commit -m m1 

git co -b b1 
echo m11 > 1/m1 && git add 1/m1 && git commit -m b11 
echo m1 > 1/m1 && git add 1/m1 && git commit -m b12 

git checkout master 
echo m2 > m2 && git add m2 && git commit -m m2 
git merge b1 -m 'merge b1' 
git --no-pager log --graph --oneline --decorate --all 
git --no-pager log --oneline 1 

b11コミットし、b12が最後のコマンドで表示されていません。

答えて

0

私は基本的に、テストレポで問題を再現しようと、私の質問に多かれ少なかれ答えました。私の場合、フィーチャーブランチがファイルを変更した後に元の状態に復元すると、それは起こります。つまり、マージすると全体としてファイルに変更が加えられません。しかし、なぜこれが起こるかはわかりません。しかし、それはhistory simplificationものと関係があるはずです。

1

--allフラグをスローしますか? git log --all filePathデフォルトでは、ログは現在のブランチからのみ戻されます。コマンドgit log branch1 branch2 -- filePathにすべてのブランチ名を表示するか、または可能なすべてのブランチを考慮して--allフラグを設定することができます。

+0

実際、このように動作しますが、私が話している変更は過去に長く続いていました。つまり、現在存在するブランチにあるコミットについては言及していません。このように '--all'スイッチを使うと、' git'がすべてのパスをたどるようになります。それがなければ、彼らはそれらのいくつかだけを選ぶ。 –

+0

あなたをフォローしていません。もう1つのオプションは、クローンがどのように行われたか、それがフェッチする履歴を制限するレポをクローンするときに--depth引数を指定することです。これを行うと、複製されたレポではなく、完全な履歴が表示されないことがあります。 – DavidN

+0

"つまり、私は現在存在するブランチにあるコミットについては言及していません。彼らは今存在しているブランチにいるのか、現在のブランチにいるのですか? '--all'は、現在のブランチのコミットだけでなく、現在存在するブランチを含みます。 (ブランチにコミットされていないコミットは、まったく表示されていません)。 –

2

git log -m -pを使用してください。名前の変更を追跡する場合は--followを追加することもできます(--followのコードはかなりハッキーで、特定のケースでのみ動作します)。マージで名前変更ポイントが発生した場合の動作はわかりません。

デフォルトでは、git log -pは、特定のパスを要求しても、マージコミットについて何も表示しません。 -mフラグは、git logに対して、各マージコミットを2つのバーチャルコミットに分割するよう効果的に指示します。次に、各親に対する変更が表示されます。その時点で、指定したパスへの変更が表示されます。

(注意:マージにgit showを使用すると、特定のパス(複数可)を見ているときなど、デフォルトのショー組み合わせ差分によって意志をコミットする複合差分は、両方の/すべての親に対して変更を持たないファイルを抑制するので、-mも有用である可能性があります。あなたはすべての参照(または全ての枝、すべてのタグなど)を見たい場合はこちら。)

DavidN's answerノートとして、)--all(または--branches--tags、および/または--remotesを追加します。

特に複雑な場合は、フィルタリングしてgit logコマンドに渡すことができるref-nameを生成できるgit for-each-refを参照してください。以上がある場合、親マージを仮定


は2つだけを持って、マージはN有効コミット、すなわち、N、仮想コミットに分割されます。コミットIDがもはや通常のSHA-1ハッシュではないという事実によって、各仮想コミットを識別することができます。代わりに、それはハッシュのペアです:マージのIDに続いて特定の親があります。

関連する問題