Как вы можете отменить последнее добавление git?

193

Можно ли отменить этап последнего (не зафиксированного) изменения в git ? Предположим, что в текущей ветке было много файлов, некоторые из которых были подготовлены, а некоторые нет. В какой-то момент какой-то глупый программист случайно выполнил:

git add -- .

...вместо того:

git checkout -- .

Может ли этот программист теперь отменить последние изменения с помощью магической команды git ? Или он должен был совершить эксперимент прежде всего?

Septagram
источник
Хех. Мы получили полезный вопрос и ответ на этот вопрос, хотя.
Steveha
2
возможный дубликат отмены 'git add' перед коммитом
Джим Фелл
Я считаю, что это не дубликат. ОП в другом вопросе просит отменить это или удалить эти файлы из коммита. Я хочу (ed) точно и только отменить изменения, которые были добавлены с помощью последней git addкоманды, особенно для файлов, в которых уже были поэтапные изменения и были некоторые изменения, которые должны были быть отменены, а не подготовлены. Не могу сказать, что другой вопрос не связан, хотя.
Септаграмма
1
Возможно, он должен был / был / совершен, прежде чем экспериментировать в первую очередь.
android.weasel
@ android.weasel да, это было много лет назад ...
Septagram

Ответы:

299

Вы можете использовать git reset. Это приведет к «удалению» всех файлов, которые вы добавили после последнего коммита.

Если вы хотите удалить только некоторые файлы, используйте git reset -- <file 1> <file 2> <file n>.

Также можно отменить некоторые изменения в файлах с помощью git reset -p.

thameera
источник
3
Как грустно. Я думаю, что-то не так в моих практиках совершения в конце концов. Принятие этого ответа, потому что вы упомянули -pпереключатель. Спасибо! :)
Septagram
Генерирует (для меня) ошибку: fatal: Не удалось разрешить 'HEAD' как действительный ref. Я еще ничего не совершил (новый репо), только что сделал git add. и пожалел об этом. Я не хочу сбрасывать все добавления, только один каталог. git reset - dir /*.* генерирует ошибку выше.
Фрэнсис Дейви
... Ах, я вижу, что происходит со мной. У меня не было ничего, на что HEAD мог бы указать, поэтому сбой git (потому что он работает на HEAD).
Фрэнсис Дейви
42

Вы не можете отменить последнее добавление git, но вы можете отменить все adds с момента последнего коммита. git resetбез аргумента фиксации сбрасывает индекс (поэтапное внесение изменений):

git reset
knittl
источник
2
«Вы не можете отменить последнее добавление git»: Вау, это удивительно и потенциально болезненно. Есть ли определенный источник для этого? Кроме того, есть ли веская причина, по которой это должно быть так? Спасибо!
Эндрю Мойлан
@AndrewMoylan: ну, нет автоматического способа сделать это. Вы всегда можете resetиспользовать один файл или использовать reset -pдля удаления определенного фрагмента.
knittl
15

Так что настоящий ответ на

Может ли этот программист теперь отменить последние изменения с помощью магической команды git?

на самом деле: нет, вы не можете удалить только последнийgit add .

Это если мы интерпретируем вопрос как в следующей ситуации:

Исходный файл:

void foo() {

}

main() {
    foo();
}

Первое изменение с последующим git add:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

Второе изменение сопровождается git add:

void foo(int bar, String baz) {
    print("$bar $baz");
}

main() {
    foo(1337, "h4x0r");
}

В этом случае git reset -pне поможет, так как его наименьшая зернистость это строки. gitне знает, что о промежуточном состоянии:

void foo(int bar) {
    print("$bar");
}

main() {
    foo(1337);
}

больше

stanm
источник
Я добавил плюс, потому что, как новый пользователь git, это действительно важное различие, которое подчеркивает то, что мои друзья описывают как «иметь хорошую гигиену при заезде» ... мой личный опыт - это было описано как «совместное использование» (плохо!).
Бен
3

На дату git предлагает:

  1. use "git rm --cached <file>..." to unstageесли файлов не было в репо. Это unstages файлы, хранящие их там.
  2. use "git reset HEAD <file>..." to unstageесли файлы были в репо, и вы добавляете их как измененные. Он хранит файлы такими, какие они есть, и их удаление.

git add --Насколько мне известно, вы не можете отменить, но вы можете удалить список файлов, как указано выше.

theGiallo
источник
2
  • Удалите файл из индекса, но оставьте его версионным и оставьте с незафиксированными изменениями в рабочей копии:

    git reset head <file>
    
  • Сбросьте файл до последнего состояния из HEAD, отмените изменения и удалите их из индекса:

    git reset HEAD <file>
    git checkout <file>
    
    # If you have a `<branch>` named like `<file>`, use:
    git checkout -- <file>

    Это необходимо, поскольку git reset --hard HEADне будет работать с отдельными файлами.

  • Удалить <file>из индекса и управления версиями, сохранив файл без версии с изменениями в рабочей копии:

    git rm --cached <file>
    
  • Удалить <file>из рабочей копии и полностью управлять версиями:

    git rm <file>
    
Фейсал
источник
2

Если вы хотите удалить все добавленные файлы из git для коммита

git reset

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

git rm <file>
BSB
источник
1

Ты можешь использовать

git reset

отменить недавно добавленные локальные файлы

 git reset file_name

отменить изменения для определенного файла

ирешика пиюмалие
источник
0

В зависимости от размера и масштаба трудно, вы можете создать временную ветку и зафиксировать текущую работу там.

Затем переключитесь на исходную ветку и оформите ее, а затем выберите соответствующие файлы с нуля.

По крайней мере, у вас будет постоянная запись о текущих и предыдущих состояниях для работы (до тех пор, пока вы не удалите эту пустую ветку).

Филип Окли
источник