対話性を避けたい場合 (「各プロンプトにノーと言う」)、 を使用しますgit diff
。質問に対する正確な回答が必要な場合は、 を使用してくださいgit diff -R
。ファイル名だけが必要な場合は、git diff --name-only
.
-R
フラグを指定しないgit diff
と、作業ツリーとインデックスのすべての違いがパッチ形式 (つまり、 を発行したときに表示される形式) で報告されますgit show <commit>
。は-R
出力を反転し、変更が削除された場合に何が起こるかを示し、削除自体がパッチであるかのように表示します。例を考えてみましょう:
git init /tmp/test && cd /tmp/test
echo "old line">file
git add .
git commit -m "Initial commit"
echo "new line">file
git diff
フラグなしで発行します。あなたは得るべきです:
$ git diff
diff --git a/file b/file
index 0906fba..86ba82a 100644
--- a/file
+++ b/file
@@ -1 +1 @@
-old line
+new line
率直に言って、私は出力を解析するのに十分簡単だと思います-R
。フラグを使用したことはありません。コマンドを定期的に発行する場合git diff
(私が使用する最も一般的なコマンドの 1 つだと思います)、反転出力はおそらく必要ありません。それでも、この回答の目的のために、次を試してください。
$ git diff -R
git diff -R
diff --git b/file a/file
index 86ba82a..0906fba 100644
--- b/file
+++ a/file
@@ -1 +1 @@
-new line
+old line
その出力は、あなたが求めていることを正確に説明しています。「変更を上書きしないでください。何が起こるか教えてください」
デフォルトでは、そのコマンドは作業ディレクトリ全体をインデックスと比較します。変更されたすべてのファイルの差分が表示されます。1 つのファイルに対する効果だけを見たいとします。簡単だ。すでに使用しているのと同じ二重ダッシュの命名法を使用してください。
git diff -- <file>
git diff
git で最も便利で拡張可能なコマンドの 1 つであることがわかり、あらゆる種類の便利なことを行うために使用できます。これを使用して、2 つのコミット、2 つのブランチ、または 2 つのファイルを比較できます。私の最近の「お気に入りの狂気の git 操作」は、へのパイプgit diff
ですgit apply
。前者はわかりやすいパッチを生成します。後者はそれらを適用します。履歴を組み合わせたときに履歴を書き換える能力はほぼ無限です。もちろんローカルでは、共有履歴を書き換えることはありません。別の例を考えてみましょう。この時点ではトピックから外れていますが、真剣に面白いです (この種のことに興味がある場合)。上記のテストリポジトリから:
git add .
git commit -m "Second commit"
echo "even newer line">file
git add .
git commit -m "Third commit"
あのね?私はその2番目のコミットがあまり好きではありませんでした。その実装はバグがありました。それはテストを破っています。共有したくありません。それにもかかわらず、「2 番目のコミット」コミット メッセージは入力するのが非常に難しいため、残しておきたいと思います。でリベースすることもできgit rebase -i HEAD~2
ますが、それには、エディターを開き、コミットを削除し、別のものを編集し、(うーん) コピー/貼り付けする必要があります。開発者は何をすべきか? これはどう:
git checkout ":/Initial" ;# get back to the first commit
git diff HEAD ":/Third" | git apply ;# apply the diff between the first and third commit
git add . ;# add the result
git commit -C ":/Second" ;# with second commit's message
git checkout -B master HEAD ;# and replace old 'master'
結果は、 の場合と同じgit rebase
です。インタラクティブなセッションを回避することができただけで、エディターを使用する必要はありませんでした。やり過ぎですか?多分だけど確かに楽しい。git diff
さらに、特に、git apply
、およびを組み合わせると、はるかに複雑なユースケースを簡単に構築できますgit add -p
。