Как вы можете отменить последний 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
чтобы отменить изменения для определенного файла