14

git checkout --<dir_name(or)file_name>特定のディレクトリまたはファイル内のすべての変更を破棄するために使用します。私がそうするときはいつでも、GITはリポジトリからディレクトリ(または)ファイルをチェックアウトします。

GITに伝える方法はありますか?「変更を上書きせず、どうなるか教えてください。

git clean -n(または)に似ていgit clean --dry-runます。

更新: を実行する前に、git checkout --src/どのファイルがオーバーライドされるかを確認したいと思います。使用できることはわかっていますgit status src/。しかし、持っているのは素晴らしいことではないでしょうgit checkout -n --src/か?ユーザーにとってコマンドの変更はあまりありません。

4

5 に答える 5

6

Gitコマンドには(または同様の) オプションcheckoutがありません。dry-runただし、Gitls-filesコマンドを使用して、どの作業ディレクトリ ファイルが と異なるかを確認できますHEAD

git ls-files -dm -- src/

これにより、削除または変更されたすべてのファイルが一覧表示されます。これらのファイルは通常、checkout.

もう 1 つのオプションは、Gitdiffコマンドを使用することです。

git diff --name-only HEAD -- src/

これは、HEAD とは異なり、checkout.

これが頻繁に行われるものである場合は、次を作成することをお勧めしますalias

git config --global alias.lco "diff --name-only HEAD"

次に、次を使用できます。

git lco -- src/
于 2012-07-03T13:30:05.897 に答える
5

実行できます

$ git checkout --patch -- <files>

それぞれの違いについて、その違いを「チェックアウト」するかどうか尋ねられます。各プロンプトに対して「いいえ」と言った場合、そのまま残ります。

于 2012-07-03T11:44:59.517 に答える
1

git stash -uよくわかりませんが、回避策としてはできませんgit applygit checkout

不満がある場合は、いつでも隠し場所に戻ることができます。

于 2012-07-03T08:10:06.707 に答える
0

対話性を避けたい場合 (「各プロンプトにノーと言う」)、 を使用します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 diffgit で最も便利で拡張可能なコマンドの 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

于 2012-07-03T14:27:09.190 に答える