あなたが対話を避けたい場合はア・ラ"各プロンプトにnoと答えてください")、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の中で最も有用な、拡張可能なコマンドのいずれかであることをgit diff
を見つけることができます、そしてあなたが役に立つのすべてのソートを行うには、それを使用することができますもの。これを使用して、2つのコミット、2つのブランチ、または2つのファイルを比較できます。私の最近の「お気に入りのクレイジーギタリスト操作」はgit diff
からgit apply
への配管です。前者はわかりやすいパッチを生成します。後者はそれらを適用します。それらが結合されたときに履歴を書き換えるあなたの能力は非常に無限です。ローカルではもちろん、は共有履歴を書き換えません。別の例を考えてみましょう。この時点では話題にはなりませんが、真剣に面白いです(あなたがこのようなことをしている場合)。私たちのテストレポジトリより上記:
git add .
git commit -m "Second commit"
echo "even newer line">file
git add .
git commit -m "Third commit"
あなたは何を知っていますか?私はその第二のコミットがあまり好きではなかった。その実装はバグだった。それは破壊試験です。私はそれを共有したくない。それにもかかわらず、私は "Second commit"コミットメッセージを保持したいのですが、これは実際に入力するのが難しいためです。私はgit rebase -i HEAD~2
でそれを再定義することができますが、それはエディタを開くこと、コミットを削除すること、別の(ugh)コピー/ペーストを編集することを伴う。開発者とは何ですか?どうですか:
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
を組み合わせると、はるかに複雑なユースケースを構築するのは簡単です。
私は混乱しているかもしれませんが、作業ツリーとインデックスの違いを尋ねるだけではありませんか?それらは 'git diff'で示されています。 –
@TilmanVogel:ご存じのように、 'git clean'コマンドは、追跡されていないファイルを削除します。 'git clean -n'はファイルを削除しません。ファイルが削除されるのはどういうことかだけです。私はちょうど知りたがっています、git checkoutコマンドにそのようなオプションがありますか?ありがとう。 –
さて、 'git help checkout'を見ると、簡単にこれを「いいえ」と答えることができます。その理由は、「git status」と「git diff」が一緒にすべての情報を提供しているからだと思います。私はまた、その意見のために 'git citool'が好きです。もちろん、索引以外のもので 'git checkout'を使用すると、ストーリーは異なるものになります。 –