2013-03-09 7 views
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 

Наконец, один модифицирует A в третий раз, но это время A остается неустановленным:

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

Как можно вернуть A в его состояние, а именно состояние 2.

EDIT: Я немного изменил последовательность кода, надеюсь, теперь это яснее. Я также опубликовал решение, которое произошло со мной после того, как я опубликовал вопрос. Это решение поражает меня как круговое движение (должно быть что-то более прямое), но, по крайней мере, он ясно показывает состояние, в котором я хочу, чтобы A закончил работу, как в рабочем каталоге, так и в индексе.

ответ

2

Если предположить, что это был ваш рабочий процесс:

  1. Вы совершили файл
  2. Вы сделали некоторые изменения и поставил его
  3. Вы сделали некоторые изменения, но вы хотите вернуться к версии с поэтапных изменений в шаге 2.

Вы просто нужно запустить git checkout -- A. Это избавит вас от любых неустановленных изменений, но сохранит изменения в конце шага 2.

Посмотрите на этот пример процесса, который будет убрать вещи:

Содержание А просто version1

$ echo "version1" > A 

Фиксировать изменение $ мерзавец добавить & & мерзавца совершить -q -m «начальное commit "

$ git log 
commit 4fd90642df048ca4beeb29c65c5f7a436e83055a 
Author: Tuxdude <[email protected]> 
Date: Fri Mar 8 16:28:36 2013 -0800 

    initial commit 

Содержание A в настоящее время version2

$ echo "version2" > A 

$ cat A 
version2 

Stage файл изменяется

$ 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 
# 
+0

Извините, но рабочий процесс, который вы опубликовали, не отражает тот, о котором я спрашивал. В моем вопросе 'A' проходит три разных состояния: первая была совершена; второй был поставлен; третий - тот, который находится в текущем каталоге. Я хочу восстановить второй (так, чтобы он не только был поставлен в индексе, но и в рабочем каталоге). После того, как я опубликовал вопрос, я подумал о решении, которое я опубликовал. Решение является уродливым, но, по крайней мере, оно ясно показывает, что я пытался выяснить, как это сделать. – kjo

+0

@kjo - Ваш вопрос непонятен мне - по крайней мере, из начального вопроса, который вы опубликовали. У вас есть файл 'A', который был первичным, и вы его устроили, и у вас есть некоторые неустановленные изменения, которые не были зафиксированы? И вы хотите восстановить версию файла на шаге 2 - где вы просто поставили, но не зафиксировали? Можете ли вы это подтвердить? Я могу обновить пример. – Tuxdude

+0

извините за замешательство; Надеюсь, я отредактировал оригинал, чтобы сделать его более ясным. – kjo

1

Вы просто должны сделать

git checkout -- . 

Если вы хотите восстановить один файл, вы

git checkout -- myfile 

Если файл уже был добавлен, вы должны ун стадии его, делает

git reset HEAD myfile 
+1

Это правильно, для третьего фрагмента кода, который не делает то, что ОП хочет, потому что ОП хочет сохранить поэтапное значение и только кроме удалить неустановленные изменения. –

0

Я думал о возможном ответе на мой вопрос. Это не особенно изящно, и я не могу сказать, есть ли у него какие-либо потенциальные подводные камни, но, по крайней мере, он явно показывает состояние, в котором я хочу, чтобы A закончилось. Надеюсь, кто-то узнает менее окольный маршрут.

После последовательности, указанной в оригинальный вопрос, сделайте следующее:

% git stash -q -k 
% git stash drop -q 
% cat A 
state 2