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


193

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

git add -- .

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

git checkout -- .

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


Хех. Мы получили полезный вопрос и ответ на этот вопрос, хотя.
— Steveha


Я считаю, что это не дубликат. ОП в другом вопросе просит отменить это или удалить эти файлы из коммита. Я хочу (ed) точно и только отменить изменения, которые были добавлены с помощью последней git addкоманды, особенно для файлов, в которых уже были поэтапные изменения и были некоторые изменения, которые должны были быть отменены, а не подготовлены. Не могу сказать, что другой вопрос не связан, хотя.
— Септаграмма

1
Возможно, он должен был / был / совершен, прежде чем экспериментировать в первую очередь.
— android.weasel

@ android.weasel да, это было много лет назад ...
— Septagram

Ответы:


299

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

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

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


3
Как грустно. Я думаю, что-то не так в моих практиках совершения в конце концов. Принятие этого ответа, потому что вы упомянули -pпереключатель. Спасибо! :)
— Septagram

Генерирует (для меня) ошибку: fatal: Не удалось разрешить 'HEAD' как действительный ref. Я еще ничего не совершил (новый репо), только что сделал git add. и пожалел об этом. Я не хочу сбрасывать все добавления, только один каталог. git reset - dir /*.* генерирует ошибку выше.
— Фрэнсис Дейви

... Ах, я вижу, что происходит со мной. У меня не было ничего, на что HEAD мог бы указать, поэтому сбой git (потому что он работает на HEAD).
— Фрэнсис Дейви

42

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

git reset

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);
}

больше


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


3

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

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

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


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>

1

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

git reset

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

 git reset file_name

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


0

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.