Git は、あるファイルから別のファイルへの関数の移動を本当に追跡できるのでしょうか?もしそうなら、どうやって?
質問
ある一つの関数をあるファイルから別のファイルに移動させると、Git はそれを追跡できるという記述に何度か出くわしました。例えば このエントリ には、"Linusが、ある関数をあるファイルから別のファイルに移動すると、Gitはその移動に伴う関数の履歴を教えてくれると言っています。
しかし、私はGitのアンダーザフッド設計のいくつかを少し意識していますが、これがどのように可能なのかわかりません。そこで疑問なのですが、これは正しい記述なのでしょうか?そしてもしそうなら、これはどのように可能なのでしょうか?
私の理解では、Git は各ファイルのコンテンツを Blob として保存し、各 Blob はそのコンテンツとサイズの SHA ハッシュから生じるグローバルにユニークな ID を持っています。そして、Git はフォルダーをツリーとして表します。ファイル名の情報はすべてツリーに属し、Blobには属しません。したがって、例えばファイルのリネームは、Blobではなくツリーへの変更として表示されます。
20個の関数が入った "foo" というファイルと、5個の関数が入った "bar" というファイルがあり、foo から bar に関数を移動させたとします(結果はそれぞれ19と6になります)。
私の理解では、これは2つの新しいブロブ(1つは変更されたfooのため、もう1つは変更されたbarのため)の存在を引き起こすでしょう。私は、関数が 1 つのファイルから別のファイルに移動されたことを示すために diff を計算することができることを理解しています。しかし、関数に関する履歴がどのように foo ではなく bar に関連付けられるかはわかりません (とにかく、自動的ではありません)。
もしGitが実際に の内部を を計算し ブロブを計算します。 (を計算する(これは、あらゆる言語を解析する方法を知っていなければならないため、クレイジーで実行不可能です)ことができれば、これがどのように可能であるかを理解できます。
では......この文は正しいのでしょうか、そうでないのでしょうか?そして、もし正しいのであれば、私の理解で何が欠けているのでしょうか?
どのように解決するのですか?
この機能は
git blame -C <file>
.
は
-C
オプションは、レビュー中のファイルのテキストの追加や削除と、同じチェンジセットで変更されたファイルとの間のマッチングを探そうとするように git を動かします。追加
-C -C
または
-C -C -C
は検索を拡張する。
を使って、テストレポで試してみてください。
git blame -C
で試してみると、移動したコードのブロックが元のファイルに由来していることがわかるでしょう。
から
git help blame
のマニュアルページをご覧ください。
行の起点は、ファイル全体のリネームにわたって自動的に追跡されます (現在のところ、リネームへの追跡をオフにするオプションはありません)。あるファイルから別のファイルへ移動した行や、別のファイルからコピー&ペーストされた行などを追いかけるには
-C
と-M
のオプションがあります。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] Git リポジトリを特定のフォルダにクローンする方法は?
-
[解決済み] 2つのリビジョン間でどのファイルが変更されたかを表示する
-
[解決済み] 特定のファイルを git stash するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】Gitバージョン管理でファイルの変更履歴を見る
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Git はファイル名の大文字と小文字を無視し、修正する
-
Git エラー: ヒント: リモートにあなたが持っていない作業が含まれているため、更新が拒否されました ヒント: あなたが持っていない作業です。
-
giteaを使ったGitサービスの構築
-
[解決済み】GitとMercurial - 比較と対比
-
[解決済み] なぜGitでコミットする前にステージが必要なのですか?
-
[解決済み] フォルダからサブモジュールのリポジトリを作成し、そのgitコミット履歴を保持する
-
[解決済み] 新サーバーへのGitプッシュ/クローン
-
[解決済み] Gitブランチの名前をローカルとリモートで変更できますか?重複
-
[解決済み] gitは "サイレントモード "で動作しますか?
-
[解決済み] gitで、stashを適用せずに、追跡されていないstashedファイルを表示する方法はありますか?