0

最初に後者をコミットせずに、ステージングされていないすべての変更を破棄する簡単な方法はありますか?

たとえば、次Aのような追跡ファイルであるとします。

% git init -q
% echo "state 1" > A
% git add A && git commit -q -m 'initial commit'
% cat A
state 1

次のものは を変更しA、それをステージングします:

% echo "state 2" > A
% git add A
% cat A
state 2

最後に、A3 回目の変更を行いますが、今回Aはステージングされていません。

% echo "state 3" > A
% cat A
state 3

ステージングされた状態、つまり状態 2Aに戻すにはどうすればよいでしょうか。

編集:コードシーケンスを少し変更しました。うまくいけば、より明確になりました。また、質問を投稿した後に思いついた解決策も投稿しました。このソリューションは回り道のように思えますが (もっと直接的なものが必要です)、少なくともA、作業ディレクトリとインデックスの両方で、最終的に行きたい状態を明確に示しています。

4

3 に答える 3

2

これがあなたのワークフローであると仮定します:

  1. ファイルをコミットしました
  2. あなたはいくつかの変更を加えてそれを上演しました
  3. さらにいくつかの変更を加えましたが、手順2で段階的に変更したバージョンに戻したいと考えています。

を実行する必要がありますgit checkout -- A。これにより、ステージングされていない変更はすべて削除されますが、ステップ2の終了時に変更が保持されます。

物事をクリアするこのワークフロー例を見てください。

Aの内容はただversion1

$ echo "version1" > A

変更をコミットします$gitadd A && git commit -q-m'初期コミット'

$ git log
commit 4fd90642df048ca4beeb29c65c5f7a436e83055a
Author: Tuxdude <foo@bar>
Date:   Fri Mar 8 16:28:36 2013 -0800

    initial commit

Aの内容は現在version2

$ echo "version2" > A

$ cat A
version2

ファイルの変更をステージングする

$ git add A

現在のgitステータスを確認する

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   A
#

にさらに変更を加えるA

$ echo "version3" > A

$ cat A
version3

ここで、`Aのローカルのステージングされていない変更を削除することにしました。gitのキャッシュ、つまりステージング領域からファイルをチェックアウトする必要があります。

$ git checkout -- A

$ cat A
version2

git statusもう一度実行すると、段階的な変更について通知されます。

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   A
#
于 2013-03-09T00:26:06.350 に答える
1

あなたはただしなければならない

git checkout -- .

単一のファイルを元に戻したい場合は、

git checkout -- myfile

ファイルが既に追加されている場合は、次のようにしてステージングを解除する必要があります

git reset HEAD myfile
于 2013-03-09T00:18:51.080 に答える
0

私は自分の質問に対する可能な答えを考えました。特にエレガントというわけではなく、潜在的な落とし穴があるかどうかはわかりませんが、少なくとも、A最終的に行きたい状態を明確に示しています. 誰かが回り道の少ないルートを知っていることを願っています。

元の質問で指定されたシーケンスの後、次のことを行います。

% git stash -q -k
% git stash drop -q
% cat A
state 2
于 2013-03-09T00:36:51.940 に答える