2017-01-13 17 views
0

コードの変更を検討しているとします。あるファイルから別のファイルに関数を移動しました。コミットには、ブロックが削除され、ブロックが追加された2つのファイルが表示されます。Git:移動ブロック中に加えられた変更を検出する(削除したブロックと追加したブロック)

私は、Gitを使って両方のブロックを比較して、そのブロック内の変更を確認する方法はありますか?

簡体字、最小限のdiff例:

+++ a/modules/foo.js 
--- b/modules/foo.js 
@@ -314,15 +314,12 


-function foo() { 
- returns 42; 
-} 


+++ a/modules/bar.js 
--- b/modules/bar.js 
@@ -271,82 +271,85 


+function foo() { 
+ returns 43; 
+} 

若干の変更があります。私はこれを見て、互いに対して両方のブロックを比較したいと思います:私はそれがを移動するかどうかを検出したくない

function foo() { 
- returns 42; 
+ returns 43; 
} 

が、私は移動ブロックで違いを見てみたい(あなたのことすでに移動として認識されている)。

現在、古いファイルと新しいファイルのうち興味深いブロックをスライスし、一時ファイルに保存して手動で比較していますが、代わりにツールを使用したいと思います。

これまで私は独自のプログラムやスクリプトを作成してこれを自動的に行いましたが、Gitでこれが可能かどうかは疑問です。

答えて

0

この回答は、期待される出力/ワークフローには完全に対応していませんが、動きに伴う変更を追跡するという要件に対処します。

git blameのコピー検出(-C)を利用しています。 -Mとは対照的に、このスイッチはわずかな変更でコピーを検出します。に変更return true;ため

$ git blame -C 9f3c95c3 -- bar.js 
cff47ee4 bar.js (John Doe 2017-01-13 20:28:51 +0100 36)   }, 
cff47ee4 bar.js (John Doe 2017-01-13 20:28:51 +0100 37) 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 38)   isApplicable: function(){ 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 39)     if (!this._depends) { 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 40)       // no depends expression defined, default to "yes, it's applicable" 
9f3c95c3 bar.js (John Doe 2017-01-13 20:26:47 +0100 41)       return false; 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 42)     } 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 43) 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 44)     // pass the survey model and the expression 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 45)     return Evaluator.evaluate(this.model.toJSON(), this._depends); 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 46)   }, 
e0efec3b foo.js (John Doe 2017-01-13 20:18:51 +0100 47) 
cff47ee4 bar.js (John Doe 2017-01-13 20:28:51 +0100 48)   render: function(){ 

移動のみライン41に示されているコミット:それはこの非難(図示のみ関連する行)を生成し、

9f3c95c Moved isApplicable() from Foo => Bar 
cff47ee Added bar.js 
e0efec3 Added foo.js 

isApplicable()が移動:

この履歴を取りますreturn false;と一緒に移動します。 isApplicable()に関連する他の行には、コミットe0efec3bというラベルが付けられています。これは、最初にそれらを導入した行です(ファイル名の列も元のファイル名を指定します)。

純粋blameが、一方、(唯一の関連する行が示されている)、このようになります。

$ git blame 9f3c95c3 -- bar.js 
cff47ee4 (John Doe 2017-01-13 20:28:51 +0100 36)   }, 
cff47ee4 (John Doe 2017-01-13 20:28:51 +0100 37) 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 38)   isApplicable: function(){ 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 39)     if (!this._depends) { 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 40)       // no depends expression defined, default to "yes, it's applicable" 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 41)       return false; 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 42)     } 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 43) 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 44)     // pass the survey model and the expression 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 45)     return Evaluator.evaluate(this.model.toJSON(), this._depends); 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 46)   }, 
9f3c95c3 (John Doe 2017-01-13 20:26:47 +0100 47) 
cff47ee4 (John Doe 2017-01-13 20:28:51 +0100 48)   render: function(){ 

移動コミットGitが9f3c95c3で行わ加算としてそれを見ているので、1つのブロックとして示されています。

git blame -C <REV> -- <FILE>は、1つのファイル内での動作にも使用できます。

-Cスイッチを複数回指定すると、そのコミット内のすべてのファイルまたは見つかったすべてのコミットにトレースを展開できます。manページは言う:-Mに加えて

-C|<num>|
を、ラインを検出する移動または同じコミットで変更された他のファイルからコピー。これは、プログラムを再編成してコードをファイル間で移動する場合に便利です。 このオプションを2回指定すると、コマンドはさらに、ファイルを作成するコミット内の他のファイルからコピーを探します。このオプションが3回指定されると、コマンドは任意のコミットで他のファイルからコピーを探します。

(強調鉱山。)

関連する問題