Различные способы удаления локальных изменений Git

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

Короче говоря, мне пришлось выполнить следующие две команды, чтобы удалить локальные изменения

git checkout .

git clean -f

Мой вопрос:

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

(2), когда мы используем git reset --hard, поскольку я могу reset даже без этой команды

Спасибо

* Решение: Основные изменения (ы): 03/26: * Заменили многие неопределенные термины с помощью git конкретной терминологии  [Отслеживаются/неотслеживаемая/постановка/unstaged]

При внесении локальных изменений может быть только три категории файлов:

Тип 1. Поэтапное отслеживание файлов

Тип 2. Неустановленные отслеживаемые файлы

Тип 3. Неустановленные файлы без сохранения файлов a.k.a UnTracked files

  • Поэтапно - те, которые перемещены в промежуточную область/добавлены в индекс
  • Отслеживаемые - измененные файлы
  • UnTracked - новые файлы. Всегда неустановлено. Если они организованы, это означает, что они отслеживаются.

Что делают каждая команда:

  • git checkout . - ТОЛЬКО удаляет неустановленные файлы с отслеживанием [Тип 2]

  • git clean -f - ТОЛЬКО удаляет Unstaged UnTracked файлы [Тип 3]

  • git reset --hard - ТОЛЬКО удаляет только отслеженные и нестатистические файлы с отслеживанием [Тип 1, Тип 2]

  • git stash -u - Удаляет все изменения [Тип 1, Тип 2, Тип 3]

Вывод:

Ясно, что мы можем использовать либо

(1) combination of `git clean -f` and `git reset --hard` 

ИЛИ

(2) `git stash -u`

для достижения желаемого результата.

Примечание: Stashing, поскольку это слово означает "Хранить (что-то) безопасно и тайно в определенном месте". Это всегда можно получить с помощью git stash pop. Таким образом, выбор между двумя вышеуказанными параметрами - вызов разработчика.

Спасибо Кристоф и Фредерик Шёнинг.

Изменить: 03/27

Я подумал, что стоит обратить внимание на "остерегаться" на git clean -f

git clean -f

Нет возврата. Используйте -n или --dry-run, чтобы просмотреть повреждение, которое вы будете делать.

Если вы хотите удалить каталоги, запустите git clean -f -d

Если вы просто хотите удалить проигнорированные файлы, запустите git clean -f -X

Если вы хотите удалить игнорируемые, а также не проигнорированные файлы, запустите git clean -f -X

ссылка: больше на git clean: Как удалить локальные (не отслеживаемые) файлы из текущего рабочего дерева git?

Редактировать: 05/20/15

Отбрасывание всех локальных коммитов на этой ветке [Удаление локальных коммитов]

Чтобы отбросить все локальные коммиты на этой ветке, чтобы сделать локальную ветвь идентичной к "восходящему потоку" этой ветки, просто запустите git reset --hard @{u}

Ссылка: http://sethrobertson.github.io/GitFixUm/fixup.html

или do git reset --hard origin/master [если локальная ветвь master]

Примечание: 06/12/2015 Это не дубликат другого вопроса SO, который помечен как дубликат. Этот вопрос касается удаления локальных изменений git [удаление добавленного файла, удаление изменений, добавленных в существующий файл и т.д., И различные подходы; Где в другом потоке SO только адрес, как удалить локальную фиксацию. Если вы добавили файл и хотите его удалить, то другой поток SO не обсуждает его. Следовательно, это не дубликат другого]

Редактировать: 06/23/15

Как отменить фиксацию, уже перенесенную в удаленный репозиторий?

$ git revert ab12cd15

Редактировать: 09/01/2015

Удалить предыдущую фиксацию из локальной ветки и удаленной ветки

Случай: вы только что совершили изменение в своем локальном филиале и сразу же нажали на удаленную ветку, Внезапно понял, о нет! Мне это не нужно. Теперь сделаем что?

git reset --hard HEAD~1 [для удаления этой фиксации из локальной ветки]

git push origin HEAD --force [обе команды должны быть выполнены. Для удаления из удаленной ветки]

Какая ветка? Его проверенная ветка.

Редактировать 09/08/2015 - удалить локальный git слияние:

Я нахожусь на ветке master и объединяет ветвь master с новой рабочей ветвью phase2

$ git status
# On branch master

$ git merge phase2

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 8 commits.

В: Как избавиться от этого слияния? Пробовал git reset --hard и git clean -d -f Оба не работали.

Единственное, что работало - это одно из следующих:

$ git reset --hard origin/master

или

$ git reset --hard HEAD~8

или

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code - это тот, который присутствовал до того, как все ваши транзакции слияния произошли]

+468
источник поделиться
8 ответов

Все зависит от того, что вы пытаетесь отменить/вернуть. Начните читать сообщение в ссылке Ube. Но попытаться ответить:

Жесткий reset

git reset --hard [HEAD]

полностью удалить все поэтапные и неустановленные изменения в отслеживаемые файлы.

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

Clean

git clean [-f]

Удалите файлы, которые не отслеживаются.

Для удаления временных файлов, но сохраняйте поэтапные и неустановленные изменения уже отслеженных файлов. В большинстве случаев я, вероятно, в конечном итоге делаю правило игнорирования вместо повторной очистки - например, для папок bin/obj в проекте С#, который вы обычно хотели бы исключить из своего репо, чтобы сэкономить место, или что-то в этом роде.

Опция -f (force) также удаляет файлы, которые не отслеживаются, а также игнорируются с помощью git, хотя правило игнорирования. В приведенном выше случае, когда правило игнорирования никогда не отслеживает папки bin/obj, хотя эти папки игнорируются git, использование параметра force удаляет их из вашей файловой системы. Я спорадически видел использование для этого, например. при развертывании сценариев, и вы хотите очистить свой код перед развертыванием, застежкой-молнией или любым другим.

Git clean не будет касаться файлов, которые уже отслеживаются.

Оформить заказ "точка"

git checkout .

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

"отменить все изменения в рабочем дереве".

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

припрятать

В некоторых ответах упоминается о том, как сшить. Как следует из формулировки, вы, вероятно, будете использовать stashing, когда вы находитесь в середине чего-то (не готовы к фиксации), и вам нужно временно переключать ветки или как-то работать над другим состоянием вашего кода, а затем возвращаться к вашему "грязному" стол письменный". Я не вижу, что это относится к вашему вопросу, но это определенно удобно.

Подводя итоги

Как правило, если вы уверены, что совершили и, возможно, нажали на удаленные важные изменения, если вы просто играете вокруг или тому подобное, использование git reset --hard HEAD, за которым следует git clean -f, окончательно очистит ваш код до состояния, это будет, если бы он был просто клонирован и выписан из ветки. Очень важно подчеркнуть, что сброс также удалит поставленные, но незафиксированные изменения. Он уничтожит все, что не было зафиксировано (кроме файлов без следа, в этом случае используйте clean).

Все остальные команды предназначены для облегчения более сложных сценариев, где необходима гранулярность "уничтожающего материала":)

Я чувствую, ваш вопрос №1 покрыт, но, наконец, заключить на # 2: причина, по которой вы никогда не находили необходимость использовать git reset --hard, заключалась в том, что вы никогда ничего не организовали. Если бы вы устроили изменение, ни git checkout ., ни git clean -f не вернули бы это.

Надеюсь, что это покрывает.

+384
источник

Как и все в git, существует несколько способов сделать это. Две команды, которые вы использовали, - это один из способов сделать это. Еще одна вещь, которую вы могли бы сделать, - просто прикрепить их к git stash -u. -u гарантирует, что также будут добавлены вновь добавленные файлы (без следа).

Полезная вещь о git stash -u заключается в том, что

  • это, возможно, самая простая (только?) одиночная команда для достижения вашей цели.
  • если вы передумаете после этого, вы получите all свою работу с помощью git stash pop (это как удаление сообщения электронной почты в gmail, где вы можете просто отменить, если после этого передумаете)

По вашему другому вопросу git reset --hard не удаляются неиспользуемые файлы, поэтому вам понадобится git clean -f. Но git stash -u может быть наиболее удобным.

+16
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

#check status

git status

# создать новую локальную ветвь

git checkout -b "branchname" 

#comput локальные изменения [двухэтапный процесс: - добавьте файл в индекс, что означает добавление в промежуточную область. Затем зафиксируйте файлы, которые присутствуют в этой промежуточной области]

git add <path to file>

git commit -m "commit message"

#checkout другая локальная ветвь

git checkout "local branch name"

# удалить все изменения в локальной ветке. Предположим, вы внесли некоторые изменения в локальную ветку, например, добавили новый файл или изменили существующий файл или сделали локальный коммит, но больше не нуждаетесь в этом] git clean -d -f и git reset --hard [очистить все локальные изменения, внесенные в локальную ветвь, за исключением случаев, когда локальная фиксация]

git stash -u также удаляет все изменения

Примечание: Ясно, что мы можем использовать либо (1) комбинация git clean –d –f и git reset --hard ИЛИ (2) git stash -u для достижения желаемого результата.

Примечание 1: Скрытие, так как это слово означает "Хранить (что-то) безопасно и тайно в определенном месте". Это всегда можно восстановить с помощью git stash pop. Таким образом, выбор между двумя вышеуказанными параметрами - вызов разработчика.

Примечание 2: git reset --hard удалит изменения рабочего каталога. Обязательно сохраните любые локальные изменения, которые вы хотите сохранить, прежде чем запускать эту команду.

# Перейдите на главную ветку и убедитесь, что вы в курсе.

git checkout master

git fetch [это может потребоваться (в зависимости от конфигурации git) для получения обновлений по источнику/мастеру]

git pull

# Объединить ветвь функции в ведущую ветвь.

git merge feature_branch

# Reset главная ветвь в исходное состояние.

git reset origin/master

# Удален ли файл из локального, как его вернуть? Сделайте git status, чтобы получить полный путь к файлу удаленного ресурса

git checkout branchname <file path name>

что это!

#Merge master branch с someotherbranch

git checkout master
git merge someotherbranchname

локальная ветка #rename

git branch -m old-branch-name new-branch-name

# удалять локальную ветвь

git branch -D branch-name

# удаленная ветка

git push origin :branch-name

# перезапустить коммит, уже перенесенный в удаленный репозиторий

git revert hgytyz4567

#branch из предыдущего фиксации с использованием GIT

git branch branchname <sha1-of-commit>

# Изменить сообщение о фиксации последней фиксации, которая уже была нажата на удаленный

git commit --amend -m "new commit message"
git push --force origin <branch-name>

# Отбрасывание всех локальных коммитов на этой ветке [Удаление локальных коммитов]

Чтобы отбросить все локальные коммиты в этой ветки, чтобы локальная ветвь была идентичной "вверх по течению" этой ветки, просто запустите

git reset --hard @{u}

Ссылка: http://sethrobertson.github.io/GitFixUm/fixup.html или do git reset --hard origin/master [если локальная ветка является мастером]

# Отменить фиксацию, уже перенесенную в удаленный репозиторий?

$ git revert ab12cd15

#Удалить предыдущую фиксацию из локальной ветки и удаленной ветки Дело: вы только что совершили переход в свою местную ветку и сразу же оттолкнули к удаленной ветке, Внезапно осознал, о нет! Мне это не нужно. Теперь что? git reset --hard HEAD~1 [для удаления этой фиксации из локальной ветки. 1 означает, что вы сделали ONE commit]

git push origin HEAD --force [обе команды должны быть выполнены. Для удаления из удаленной ветки]. branch означает текущую проверочную ветвь.

# Удалить локальное слияние git: Случай: Я на главной ветке и объединенной главной ветки с новой рабочей фазой2

$ git status

В главном ветки

$ git merge phase2  $ git status

В главном ветки

Ваша ветка опережает "origin/master" на 8.

Q: Как избавиться от этого локального слияния git? Пробовал git reset --hard и git clean -d -f Оба не работали. Единственное, что работало - это одно из следующих:

$git Reset - грубое происхождение/мастер

или

$git Reset --hard HEAD ~ 8

или

$ git reset --hard 9a88396f51e2a068bb7 [sha commit code - это тот, который присутствовал до того, как все ваши транзакции слияния произошли]

+12
источник

1. Если вы вообще не хотите сохранять локальные изменения.

git reset --hard

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

2. Если вы хотите сохранить локальные изменения

Если вы хотите вывести новые изменения с удаленного устройства и хотите игнорировать локальные изменения во время этого вытягивания,

git stash

Он закроет все локальные изменения, теперь вы можете удалить удаленные изменения,

git pull

Теперь вы можете вернуть свои локальные изменения,

git stash pop
+6
источник

Использование:

git checkout -- <file>

Отменить изменения в рабочем каталоге.

+4
источник

Лучший способ - проверить изменения.

Изменение файла pom.xml в проекте с именем project-name вы можете сделать:

git status

# modified:   project-name/pom.xml

git checkout project-name/pom.xml
git checkout master

# Checking out files: 100% (491/491), done.
# Branch master set up to track remote branch master from origin.
# Switched to a new branch 'master'
+2
источник

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

Это закроет все изменения в {0} и мгновенно отбросит его с {0}

git stash && git stash drop

+1
источник

Прежде всего проверьте, что ваше важное изменение сохранено или нет:

$git статус

чем попробуйте

$git reset --hard

он будет reset вашей ветки по умолчанию

но если вам нужно просто отменить:

$edit (1) $ git добавить frotz.c filfre.c $mailx (2) $git reset
(3) $git pull git://info.example.com/nitfol


Подробнее → https://git-scm.com/docs/git-reset

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос