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

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

git add -- .

... вместо:

git checkout -- .

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

Ответ 1

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

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

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

Ответ 2

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

git reset

Ответ 3

Итак, реальный ответ на

Может ли этот программист отключить свои последние изменения с помощью некоторой магической команды 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);
}

.

Ответ 4

Вы можете использовать git reset (см. docs)

Ответ 5

На дату git появится запрос:

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

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

Ответ 6

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

    git reset head <file>
    
  • Reset файл с последним состоянием из 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>
    

Ответ 7

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

git reset

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

git rm <file>

Ответ 8

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

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

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

Ответ 9

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

git reset

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

 git reset file_name

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