Как отменить git add с помощью Git Reset

Чтобы отменить git add перед фиксацией:

Запустите git reset или git reset , чтобы отключить все изменения.

В более старых версиях git команды были git reset HEAD и git reset HEAD соответственно. Это было изменено в Git 1.8.2

Команда git reset позволяет вам СБРОСИТЬ текущую головку в указанное состояние. Вы можете сбросить состояние отдельных файлов, а также всей ветки.

Сбросить файл или набор файлов

Следующая команда позволяет выборочно выбирать фрагменты содержимого и вернуть или отключить его.

  git reset (--patch | -p) [tree-ish] [-] [paths]  

Деактивировать файл

Если вы переместили файл в промежуточную область с помощью git add , но больше не хотите, чтобы он был частью фиксации , вы можете использовать git reset , чтобы отключить этот файл:

  git reset HEAD FILE-TO-UNSTAGE  

Внесенные вами изменения останутся в файле, эта команда просто удаляет этот файл из вашей промежуточной области.

Сбросить ветвь до предыдущей фиксации

Следующая команда сбрасывает HEAD вашей текущей ветки на заданный COMMIT и обновляет индекс. Он в основном перематывает состояние вашей ветки, затем все коммиты, которые вы делаете в дальнейшем, записывают все, что было после точки сброса. Если вы опустите MODE , по умолчанию будет установлено значение - mixed :

  git reset MODE COMMIT  

Параметры для MODE :

  • - soft : не сбрасывает индексный файл или рабочее дерево, а сбрасывает HEAD в commit . Изменяет все файлы на «Изменения, подлежащие фиксации».
  • - смешанный : сбрасывает индекс, но не рабочее дерево, и сообщает, что не было обновлено
  • - жестко : сбрасывает индекс и рабочее дерево. Любые изменения в отслеживаемых файлах в рабочем дереве после commit отбрасываются
  • - merge : сбрасывает индекс и обновляет файлы в рабочем дереве, которые различаются между commit и HEAD, но сохраняют те, которые различаются между индексом и рабочим деревом
  • - keep : сбрасывает записи индекса и обновляет файлы в рабочем дереве, которые различаются между commit и HEAD. Если файл, который отличается между commit и HEAD, имеет локальные изменения, сброс прерывается

Указывает на примечание

Будьте очень осторожны при использовании параметра - hard с git reset , поскольку он сбрасывает вашу фиксацию, промежуточную область и ваш рабочий каталог. Если этот параметр не используется должным образом, можно потерять записанный код.




Как мне отменить ‘git add ‘перед фиксацией?

Я по ошибке добавил файлы в Git с помощью команды:

  git add myfile. txt  

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


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

  git reset  

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

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

  git reset  

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

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

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

Документация: git reset


Вы хотите:

  git rm --cached  

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

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

  git reset.  

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

  фатальный: не удалось разрешить "HEAD" как действительную ссылку.  

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

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

    … много дерьма прокручивается …

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

  5. google «undo git add»

    => find Переполнение стека — ура

  6. git reset.

    => фатальный: не удалось устранить ‘HEAD’ в качестве действительной ссылки.

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

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

  ...  # Изменения, которые необходимо зафиксировать: # (используйте "git rm --cached  ..." для деактивации) ... 

И решение действительно заключается в использовании 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 не уничтожение чего-либо (а что, если я неправильно написал).

25


Если вы наберете:

  git status  

Git сообщит вам, что поставлено, и т. д. ., включая инструкции по отключению от сценария:

  используйте "git reset HEAD  ..." для отмены сценария  

Я считаю, что Git довольно хорошо подталкивает меня к правильным поступкам в подобных ситуациях.

Примечание. Последние версии Git (1.8.4.x) изменили это сообщение:

  (используйте "git rm --cached  ..." для отключения)  

4


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

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

  git stage  

git add — это просто псевдоним, который проще ввести для стадии git

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

  git reset HEAD -  

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

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

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

  git add file1git stage file2git unadd file2git unstage  file1  

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

  git a # для staginggit u # для unstaging  

4


Дополнение к принятому ответ: если ваш ошибочно добавленный файл был огромным, вы, вероятно, заметите, что даже после удаления его из индекса с помощью ‘ git reset ‘ он все еще занимает место в .git .

Не о чем беспокоиться; файл действительно все еще находится в репозитории, но только как «свободный объект». Он не будет скопирован в другие репозитории (через clone, push), и пространство будет в конечном итоге освобождено — хотя, возможно, не очень скоро. Если вы беспокоитесь, вы можете запустить:

  git gc --prune = now  

из git add ?

git reset HEAD ?

или

git rm --cached ?

Строго говоря, и, если я не ошибаюсь: none .

git add нельзя отменить — в целом безопасно.

Давайте сначала вспомним, что на самом деле делает git add :

  1. Если был ранее не отслеживался , git add добавляет его в кеш с его текущее содержимое.

  2. Если был уже отслежен , git add сохраняет текущий контент (снимок, версию) в кеш. В Git это действие по-прежнему называется add (а не просто update it), потому что две разные версии (снимки) файла считаются двумя разными items: следовательно, мы действительно добавляем новый элемент в кеш, который в конечном итоге будет зафиксирован позже.

В свете этого вопрос несколько неоднозначен:

Я по ошибке добавил файлы с помощью команды …

Сценарий OP кажется первым (неотслеживаемый файл), мы хотим, чтобы «отмена» удаляла файл (а не только текущее содержимое) из отслеживаемых элементов. Если это так, то можно запустить git rm --cached .

И мы могли бы также запустите git reset HEAD . В целом это предпочтительнее, поскольку работает в обоих сценариях: он также отменяет действие, когда мы ошибочно добавили версию уже отслеживаемого элемента.

Но есть два предостережения..

Во-первых: существует (как указано в ответе) только один сценарий, в котором git reset HEAD не работает, но git rm --cached делает: новый репозиторий (без коммитов). Но на самом деле это практически несущественный случай.

Во-вторых: имейте в виду, что git reset HEAD не может волшебным образом восстановить содержимое ранее кэшированного файла, он просто повторно синхронизируется это из ГОЛОВКИ. Если наш ошибочный git add перезаписал предыдущую поэтапную незафиксированную версию, мы не сможем ее восстановить. Вот почему, строго говоря, мы не можем отменить [*].

Пример:

  $ git init $ echo "version 1"> файл.  txt $ git add file.txt # Первое добавление file.txt $ git commit -m 'first commit' $ echo "version 2"> file.txt $ git add file.txt # Stage (not commit) "version 2  "of file.txt $ git diff --cached file.txt-version 1 + version 2 $ echo" version 3 "> file.txt $ git diff file.txt-version 2 + version 3 $ git add file.txt # К сожалению  мы не имели в виду этот $ git reset HEAD file.txt # Отменить? $ git diff --cached file.txt # Разумеется, без разницы.  stage == HEAD $ git diff file.txt # Мы безвозвратно потеряли "версия 2" -версия 1 + версия 3  

Конечно, это не очень критично, если мы просто будем следовать обычный ленивый рабочий процесс, состоящий в выполнении ‘git add’ только для добавления новых файлов (случай 1), и мы обновляем новое содержимое с помощью команды commit, git commit -a .


* (Изменить: приведенное выше практически правильно, но все же могут быть некоторые слегка хакерские/запутанные способы восстановления изменений, которые были поставлены, но не зафиксированы, а затем перезаписаны — см. комментарии Йоханнеса Матокича и iolsmit)

3


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

  git reset HEAD myfile.txt  

Объяснение:

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

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

2


  git rm --cached. -r  

рекурсивно «отменит добавление» всего, что вы добавили из текущего каталога

3


Выполнить

  git gui  

и удалите все файлы вручную или выделив их все и нажав кнопку unstage from commit .

4


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

То, что вы делали раньше:

  • Изменил файл и использовал git add. или git add .

Что вы хотите:

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

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

      # Подумайте `svn revert ` IIRC.  git reset HEAD  git checkout  # Если у вас есть  `с именем типа `, используйте: git checkout -  

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

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

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

      git rm 

3


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

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

Если сомневаетесь, используйте

   git reset HEAD file  

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

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

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

  В ветке master Изменения, которые необходимо зафиксировать: (используйте "git reset HEAD  ..." для отмены постановки) новый файл: my_new_file.txt изменен: my_modified_file.txt  

2


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

2


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

НО:

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

Просто

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

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

  git unadd foo.txt bar.txt  

0


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

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

  $ git add foo $ git status # На главном сервере # Изменения, которые необходимо зафиксировать  : # (используйте "git reset HEAD  ..." для отмены постановки) ## новый файл: foo ## Не отслеживаемые файлы: # (используйте "git add  ..." для включения в то, что будет зафиксировано)  # [...] #  

Переход к интерактивному добавлению для отмены добавления (команды, введенные в git, здесь: «r» (возврат), «1» (первая запись в в списке отображается возврат), ‘return’ для выхода из режима возврата и «q» (выход):

  $ git add -i staged unstaged path 1: +1 /-0 ничего foo *** Команды *** 1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd неотслеживаемый 5: [p] atch 6: [d] iff 7  : [q] uit 8: [h] elpWhat now> r ступенчатый неустановленный путь 1: + 1/-0 ничего [f] ooRevert >> 1 ступенчатый неустановленный путь * 1: + 1/-0 ничего [f] ooRevert >>  примечание: foo сейчас не отслеживается. изменен один путь *** Команды *** 1: [s] tatus 2: [u] pdate 3: [r] evert 4: [a] dd не отслеживается 5: [p] atch 6:  [d] iff 7: [q] uit 8: [h] elpWhat now> qBye. $  

Вот и все ! Вот ваше доказательство, показывающее, что «foo» снова в списке неотслеживаемых:

  $ git status # На главном сервере # Не отслеживаемые файлы: # (используйте "git add   ... "включить в то, что будет совершено) # [... ] # ничего не добавлено для фиксации, но присутствуют неотслеживаемые файлы (для отслеживания используйте "git add") $  


Для этого можно использовать

git remove или git rm с флаг - cached . Попробуйте:

  git help rm  

2


Вот способ избежать этой неприятной проблемы при запуске нового проекта:

  • Создать основной каталог для вашего нового проекта.
  • Запустите git init .
  • Теперь создайте файл .gitignore (даже если он пуст ).
  • Зафиксируйте файл .gitignore.

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

Еще одним преимуществом этого метода является то, что если вы позже столкнетесь с проблемами, связанными с окончанием строки, и вам потребуется обновить все свои файлы, это легко:

  • Проверьте исходную фиксацию. Это удалит все ваши файлы.
  • Затем снова проверьте свой последний коммит. При этом будут получены свежие копии ваших файлов с использованием ваших текущих настроек окончания строки.

4


Обратите внимание, что если вы не укажете ревизию, вы должны включить разделитель. Пример из моей консоли:

  git reset  фатальный: неоднозначный аргумент '': неизвестная версия или путь не в рабочем дереве. Используйте '-', чтобы  отдельные пути от ревизий git reset -  Неустановленные изменения после сброса: M  

(Git версии 1.7.5.4)

1


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

  $> git --versiongit version 1.6.2.1  

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

  git reset HEAD.  

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

1


Чтобы удалить новые файлы из области подготовки (и только в случае нового файла), как предложено выше:

  git rm --cached FILE  e> 

Используйте rm --cached только для новых файлов, случайно добавленных.

2


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

  git reset *  

2


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

  git reset HEAD * .prjgit reset HEAD * .bmpgit reset HEAD * gdb *  

и т. д.

1


Просто введите git reset он вернется обратно, и это похоже на то, что вы не набирали git add. с момента последней фиксации. Убедитесь, что вы сделали это раньше.

1


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

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

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

11


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

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

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

  • git reset.
  • git checkout.

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

4


Чтобы отменить git add , используйте:

  git reset filename  

0


Также есть интерактивный режим:

  git add -i  

Выберите вариант 3, чтобы отменить добавление файлов. В моем случае я часто хочу добавить более одного файла, а в интерактивном режиме вы можете использовать такие числа для добавления файлов. Это займет все, кроме 4: 1, 2, 3 и 5

Чтобы выбрать последовательность, просто введите 1-5, чтобы взять все от 1 до 5.

Промежуточные файлы Git

1


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

  git reset HEAD filename.txt  

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

  git add -p  

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


git add myfile.txt # Это добавит ваш файл в список подлежащих фиксации

Совершенно противоположно этой команде

  git reset HEAD myfile.txt  # Это отменит его.  

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

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


  git reset filename.txt  

Удалит файл с именем filename.txt из текущего индекса, область «собирается быть совершенным», ничего не меняя.


  git reset filename.txt  

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

1


В Sourcetree вы можете легко сделать это через графический интерфейс. Вы можете проверить, какую команду Sourcetree использует для деактивации файла.

Я создаю взял новый файл и добавил его в Git. Затем я отключил его с помощью графического интерфейса Sourcetree. Вот результат:

Файлы без постановки [15.08.15 10:43] git -c diff.mnemonicprefix = false -c core.quotepath = false -c credential.helper = sourcetree reset -q — path/to/file/filename.java

Sourcetree использует reset , чтобы отключить новые файлы.

1

Оцените статью
clickpad.ru
Добавить комментарий