[解決済み】git diffの出力を読むには?
質問
のマニュアルページは
git-diff
はかなり長く、初心者には必要ないと思われるケースも多く説明されています。例えば
git diff origin/master
解決方法は?
git の履歴から高度な diff を取得する例を見てみましょう ( git.gitレポジトリのコミット1088261f ):
diff --git a/builtin-http-fetch.c b/http-fetch.c
similarity index 95%
rename from builtin-http-fetch.c
rename to http-fetch.c
index f3e63d7..e8f44ba 100644
--- a/builtin-http-fetch.c
+++ b/http-fetch.c
@@ -1,8 +1,9 @@
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, const char *prefix)
int get_verbosely = 0;
int get_recover = 0;
+ prefix = setup_git_directory();
+
git_config(git_default_config, NULL);
while (arg < argc && argv[arg][0] == '-') {
このパッチを一行ずつ解析してみましょう。
-
最初の行
diff --git a/builtin-http-fetch.c b/http-fetch.c
は "git diff" という形式のヘッダです。diff --git a/file1 b/file2
. そのa/
とb/
のファイル名は、(今回のように)リネームやコピーを伴わない限り、同じになります。 そのため--git
は、diffが"git"形式であることを意味します。 -
次に、1つまたは複数の拡張ヘッダー行です。 最初の3つの
類似性指数 95 builtin-http-fetch.c からリネーム。 http-fetch.cにリネーム
からファイル名が変更されたことを教えてくれます。builtin-http-fetch.c
からhttp-fetch.c
と、この2つのファイルが95%同一であること(このリネームを検出するために使用されました)。
拡張されたdiffのヘッダーの最後の行、それはインデックス f3e63d7..e8f44ba 100644
は、指定されたファイルのモードについて教えてくれます (100644
また、preimage (変更前のバージョン) と postimage (変更後のバージョン) の短縮されたハッシュ値も表示します。) この行はgit am --3way
は、パッチが適用できない場合に、3 者間マージを試みるためのものです。
-
次に2行のUnified diffヘッダーです。
--- a/builtin-http-fetch.c +++ b/http-fetch.c
と比較するとdiff -U
の結果では、ソース(前画像)とデスティネーション(後画像)ファイル名の後に、from-file-modification-time と to-file-modification-time がない。 ファイルが作成された場合、ソースは/dev/null
ファイルが削除された場合、ターゲットは/dev/null
.
を設定した場合diff.mnemonicPrefix
コンフィギュレーション変数を true に設定し、その代わりにa/
とb/
のプレフィックスを使用すると、この2行のヘッダーの代わりにc/
,i/
,w/
とo/
を接頭辞として、それぞれ比較するものに対して使用します。 git-config(1) -
次に、1つまたは複数の相違点の塊が来ます。各塊は、ファイルが異なる1つの領域を示しています。 統一されたフォーマットのハンクは、次のような行で始まります。
@@ -1,8 +1,9 @@
または@@ -18,6 +19,8 @@ int cmd_http_fetch(int argc, const char **argv, ...)
という形式になっています。@@ from-file-range to-file-range @@ [header]
. from-file-rangeは次のような形式です。-<start line>,<number of lines>
であり、to-file-rangeは+<start line>,<number of lines>
. start-line と number-of-lines は、それぞれ preimage と postimage における hunk の位置と長さを表しています。 number-of-lines が表示されない場合は、1であることを意味する。
オプションのヘッダーは、各変更が発生するC関数を示し、それがCファイルである場合(例えば
-p
オプション)、または他の種類のファイルについては、もしあれば同等のものを使用します。
-
次に、ファイルが異なる部分の説明です。 両ファイルに共通する行は、スペース文字で始まります。実際に2つのファイルで異なっている行は、左の印字欄に次のいずれかの指示文字があります。
-
'+' -- 最初のファイルのここに1行が追加されました。
-
'-' -- 最初のファイルから1行削除されました。
だから、例えば、最初のチャンク
#include "cache.h"
#include "walker.h"
-int cmd_http_fetch(int argc, const char **argv, const char *prefix)
+int main(int argc, const char **argv)
{
+ const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
というのは
cmd_http_fetch
に置き換えられました。
main
と、その
const char *prefix;
という行が追加されました。
つまり、変更前の 'builtin-http-fetch.c' ファイルの該当箇所は、以下のようなものでした。
#include "cache.h"
#include "walker.h"
int cmd_http_fetch(int argc, const char **argv, const char *prefix)
{
struct walker *walker;
int commits_on_stdin = 0;
int commits;
変更後の 'http-fetch.c' ファイルは、次のようになります。
#include "cache.h"
#include "walker.h"
int main(int argc, const char **argv)
{
const char *prefix;
struct walker *walker;
int commits_on_stdin = 0;
int commits;
-
があるかもしれません。
\ ファイル末尾に改行がない
の行が存在します(例diffにはありません)。
として ドナル・フェローズ氏のコメント diff を読む練習は、実際の例で、自分が何を変更したのかがわかっている状態で行うのが一番です。
参考文献
- git-diff(1) マニュアルページ pでパッチを生成する」セクションを参照してください。
- (diff.info)詳細 ユニファイド ノード、"Unified Formatの詳細な説明"。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] ステージングされた変更を表示するにはどうしたらいいですか?
-
[解決済み】"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のエラー。リモートリポジトリへの接続時に「Host Key Verification Failed」。
-
[解決済み】ローカルに変更があるにもかかわらず、git pushが「すべて最新」と言う
-
git commits with an error: 更新が拒否されました。現在のブランチの先端が、このブランチより後ろにあるためです。
-
[gitコミット失敗の解決] 現在のブランチの先端が後ろにあるため、更新が拒否されました。
-
[解決済み】gitの「not something we can merge」エラーの解決方法
-
[解決済み] 複数のgitコミットを元に戻すには?
-
[解決済み] "would clobber existing tag "を取り除くには?
-
[解決済み] git status に fatal: bad object HEAD と表示される。
-
[解決済み] git update-index --assume-unchanged <file> を元に戻す。
-
[解決済み] Gitのエラー「object file ... is empty」はどうすれば直せますか?