файл - отменить удаление git




Как отменить «git add» перед фиксацией? (20)

Я ошибочно добавил файлы в git, используя команду:

git add myfile.txt

Я еще не git commit . Есть ли способ отменить это, поэтому эти файлы не будут включены в коммит?

На данный момент существует 48 ответов (некоторые удалены). Не добавляйте новую, если у вас нет новой информации.


Git имеет команды для каждого действия, которое только можно вообразить, но требует обширных знаний, чтобы все исправить, и из-за этого в лучшем случае оно встречно интуитивно ...

Что вы делали раньше:

  • Изменен файл и используется git add . , или git add <file> .

То, что ты хочешь:

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

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

    # Think `svn revert <file>` IIRC.
    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>
    

Бежать

git gui

и удалите все файлы вручную или выбрав все из них и нажав кнопку фиксации с фиксацией .


Возможно, Git развился с тех пор, как вы отправили свой вопрос.

$> git --version
git version 1.6.2.1

Теперь вы можете попробовать:

git reset HEAD .

Это должно быть то, что вы ищете.


Вопрос четко не сформулирован. Причина в том, что git add имеет два значения:

  1. добавив новый файл в промежуточную область, затем git rm --cached file .
  2. добавление измененного файла в промежуточную область, затем отмену с помощью git reset HEAD file .

если есть сомнения, используйте

git reset HEAD file

Потому что в обоих случаях это ожидаемая вещь.

Предупреждение: если вы делаете git rm --cached file в файле, который был изменен (файл, существовавший ранее в репозитории), тогда файл будет удален на git commit ! Он все равно будет существовать в вашей файловой системе, но если кто-то еще потянет вашу фиксацию, файл будет удален из рабочего дерева.

git status сообщит вам, был ли файл новым или изменен :

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   my_new_file.txt
    modified:   my_modified_file.txt

Вы можете отменить git add перед фиксацией с помощью

git reset <file>

который удалит его из текущего индекса (список «about to be commit») без изменения чего-либо еще.

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

git reset

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

В старых версиях Git приведенные выше команды эквивалентны git reset HEAD <file> и git reset HEAD соответственно и сбой, если HEAD не определен (поскольку вы еще не сделали никаких коммитов в своем репо) или неоднозначно (потому что вы создал ветку с именем HEAD , которая является глупой вещью, которую вы не должны делать). Это было изменено в Git 1.8.2 , хотя, поэтому в современных версиях Git вы можете использовать вышеприведенные команды еще до того, как сделаете свою первую фиксацию:

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


Если вы используете свой первоначальный коммит, и вы не можете использовать сброс git, просто объявите «банкротство Git» и удалите папку .git и начните с нее


Используйте git add -i для удаления только что добавленных файлов из вашего предстоящего коммита. Пример:

Добавление файла, который вам не нужен:

$ git add foo
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]#

Включение интерактивного добавления для отмены вашего добавления (команды, набранные в git, здесь: «r» (возврат), «1» (первая запись в списке возвращает показания), «возврат», чтобы отказаться от режима возврата, и «q», (уволиться):

$ git add -i
           staged     unstaged path
  1:        +1/-0      nothing foo

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> r
           staged     unstaged path
  1:        +1/-0      nothing [f]oo
Revert>> 1
           staged     unstaged path
* 1:        +1/-0      nothing [f]oo
Revert>> 
note: foo is untracked now.
reverted one path

*** Commands ***
  1: [s]tatus     2: [u]pdate     3: [r]evert     4: [a]dd untracked
  5: [p]atch      6: [d]iff       7: [q]uit       8: [h]elp
What now> q
Bye.
$

Это оно! Вот ваше доказательство, показывая, что «foo» возвращается в список без следа:

$ git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
# [...]
#       foo
nothing added to commit but untracked files present (use "git add" to track)
$

Как и многие другие ответы, вы можете использовать git reset

НО:

Я нашел это замечательное сообщение, которое фактически добавляет команду Git (ну алиас) для git unadd : см. Git unadd для деталей или ..

Просто,

git config --global alias.unadd "reset HEAD"

Теперь вы можете

git unadd foo.txt bar.txt

Отменить git добавить использование

git reset filename


Предположим, я создаю новый файл newFile.txt .

Предположим, что я добавляю файл случайно, git add newFile.txt

Теперь я хочу отменить это добавление, перед фиксацией, git reset newFile.txt


Ты хочешь:

git rm --cached <added_file_to_undo>

Обоснование:

Когда я был знаком с этим, я сначала попробовал

git reset .

(чтобы отменить все мое первоначальное добавление), только чтобы получить это (не очень) полезное сообщение:

fatal: Failed to resolve 'HEAD' as a valid ref.

Оказывается, это происходит потому, что HEAD ref (branch?) Не существует до момента первого коммита. То есть, вы столкнетесь с той же проблемой новичка, что и я, если ваш рабочий процесс, как и мой, был чем-то вроде:

  1. cd в мой новый новый каталог проектов, чтобы опробовать Git, новую горячку
  2. git init
  3. git add .
  4. git status

    ... множество свитков с дерьмом ...

    => Черт, я не хотел добавлять все это.

  5. google "undo git add"

    => Найти переполнение стека - yay

  6. git reset .

    => fatal: Не удалось разрешить «HEAD» в качестве действительного ref.

Далее выясняется, что есть ошибка, связанная с бесполезностью этого в списке рассылки.

И то, что правильное решение было прямо там, в выводе статуса Git (который, да, я затушевал как «дерьмо»)

...
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
...

И действительно, решение - использовать git rm --cached FILE .

Обратите внимание на предупреждения в другом месте здесь - git rm удаляет вашу локальную рабочую копию файла, но если вы используете --cached . Вот результат git help rm :

--cached Используйте эту опцию, чтобы отключить и удалить пути только из индекса. Файлы рабочих деревьев, независимо от того, были ли они изменены или нет, будут оставлены.

Я приступаю к использованию

git rm --cached .

удалить все и начать снова. Не работает, хотя, потому что add . является рекурсивным, оказывается, что rm нуждается в -r для рекурсии. Вздох.

git rm -r --cached .

Хорошо, теперь я вернулся туда, где начал. В следующий раз, когда я собираюсь использовать -n чтобы сделать сухой проход и посмотреть, что будет добавлено:

git add -n .

Я закрепил все до безопасного места, прежде чем доверять git help rm о - --cached не уничтожая ничего (и что, если я его опечатал).


Чтобы сбросить все файлы в определенной папке (и ее подпапках), вы можете использовать следующую команду:

git reset *

Чтобы уточнить: git add изменения перемещения из текущего рабочего каталога в промежуточную область (индекс).

Этот процесс называется постановкой . Таким образом, самая естественная команда для смены изменений (измененных файлов) очевидна:

git stage

git add просто проще вводить псевдоним для git stage

Жаль, что нет git unstage и git unadd команд. Соответствующий вопрос сложнее угадать или запомнить, но он довольно очевиден:

git reset HEAD --

Мы можем легко создать псевдоним для этого:

git config --global alias.unadd 'reset HEAD --'
git config --global alias.unstage 'reset HEAD --'

И, наконец, у нас есть новые команды:

git add file1
git stage file2
git unadd file2
git unstage file1

Лично я использую еще более короткие псевдонимы:

git a #for staging
git u #for unstaging

Эта команда изменяет ваши изменения:

git reset HEAD filename.txt

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

git add -p 

для добавления частей файлов.


используйте команду * для обработки нескольких файлов одновременно

git reset HEAD *.prj
git reset HEAD *.bmp
git reset HEAD *gdb*

так далее


git add myfile.txt # это добавит ваш файл в список, который будет зафиксирован

В отличие от этой команды,

git reset HEAD myfile.txt  # this will undo it. 

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

он сбросит вашу голову с указанным файлом. поэтому, если у вашей головы нет этого, он просто сбросит его


Для конкретного файла:

  • git reset my_file.txt
  • git checkout my_file.txt

Для всех добавленных файлов:

  • git reset.
  • git checkout.

Примечание: checkout изменяет код в файлах и переходит к последнему обновленному состоянию. сброс не изменяет коды; он просто сбрасывает заголовок.


Отменить файл, который уже добавлен, довольно просто с помощью git , для сброса myfile.txt который уже добавлен, используйте:

git reset HEAD myfile.txt

Объясните:

После того, как вы поставили ненужные файлы (файлы), чтобы отменить, вы можете выполнить git reset , Head - это git reset вашего файла в локальном, а последний параметр - это имя вашего файла.

Я создаю шаги на изображении ниже более подробно для вас, включая все шаги, которые могут произойти в этих случаях:


git reset filename.txt

Удалит файл с именем filename.txt из текущего индекса, область «about to be commit», не изменяя ничего.


git reset filename.txt  

Удалит файл с именем filename.txt из текущего индекса, область «about to be commit», не изменяя ничего.





git-stage