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

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

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

git checkout .

git clean -f

мой вопрос:

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

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

спасибо

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

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

Тип 1. Устроили отслеживаемые файлы

Тип 2. Отслеживаемые файлы проиндексированы

Тип 3. Unstaged UnTracked files a.к. Неотслеженные файлы

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

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

  1. git checkout . - удаляет только неустановленные отслеживаемые файлы [Тип 2]

  2. git clean -f - Удаляет только неустановленные файлы [Тип 3]

  3. git reset --hard - удаляет поэтапные отслеживаемые и неустановленные отслеживаемые файлы только[Тип 1, Тип 2]

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

вывод:

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

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

или

(2) `git stash -u`

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

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

спасибо Кристоф и Фредерик Schøning.

Edit: 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

или git reset --hard origin/master [если местное отделение master]

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

Edit: 06/23/15

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

$ git revert ab12cd15

Edit: 09/01/2015

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

Case: вы просто внесли изменения в свою локальную ветку и сразу же нажали на удаленную ветку, Вдруг понял , О нет! Мне не нужны эти изменения. Что теперь делать?

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.

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

единственное, что работала какие-то из них ниже:

$ git reset --hard origin/master

или

$ git reset --hard HEAD~8

или

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

9 ответов


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

перезагрузка

git reset --hard [HEAD]

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

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

очистить

git clean [-f]

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

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

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

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

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

git checkout .

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

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

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

хранит

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

подведем итоги

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

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

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

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


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

удобная вещь о git stash -u Это

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

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


причина добавления ответа в данный момент:

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

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

#устанавливает имя, которое вы хотите прикрепить к транзакциям фиксации

$ git config --global user.name "[name]"

#устанавливает адрес электронной почты, который вы хотите привязать к транзакциям фиксации

$ git config --global user.email "[email address]"

#список глобальной конфигурации

$ git config --list

#проверка статуса

git status

#Список всех локальных и удаленных филиалов

git branch -a

#создать новая локальная ветвь и начать работать над этой ветвью

git checkout -b "branchname" 

или это можно сделать как двухэтапный процесс

создать ветку: git branch branchname работа над этой веткой:git checkout branchname

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

git add <path to file>

git commit -m "commit message"

#проверка некоторых других местных бранч

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) для получения обновлений в origin / master ]

git pull

# слить ветку в ветку master.

git merge feature_branch

# сброс главной ветви в состояние origin.

git reset origin/master

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

git checkout branchname <file path name>

вот именно!

#слияние главной ветви с someotherbranch

git checkout master
git merge someotherbranchname

#переименовать местного отделения

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

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

git branch -D branch-name

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

git push origin --delete branchname

или

git push origin :branch-name

#revert a commit уже нажата на удаленный репозиторий

git revert hgytyz4567

#ветвь от предыдущей фиксации с помощью GIT

git branch branchname <sha1-of-commit>

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

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

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

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

git reset --hard @{u}

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

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

$ git revert ab12cd15

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

Use-Case: вы только что совершили переходите на местную ветку и сразу же нажимаете на удаленную ветку, вдруг понимаете, о нет! Мне не нужны эти изменения. Что теперь делать?

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

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

#удалить некоторые из последних коммиты из локального и удаленного РЕПО и сохранения в коммит, который вы хотите. (своего рода возврат коммитов с локального и удаленного)

предположим, у вас есть 3 коммита, которые вы нажали на удаленную ветку с именем'develop'

commitid-1 done at 9am
commitid-2 done at 10am
commitid-3 done at 11am. // latest commit. HEAD is current here.

вернуться к старой фиксации (для изменения состояния филиала)

git log --oneline --decorate --graph //, чтобы увидеть все ваши commitids

git clean -d -f // очистить любые локальные изменения

git reset --hard commitid-1 // локально возвращаясь к этому commitid

git push -u origin +develop // push это состояние к удаленному. + делать силу толчка

# удалить локальное слияние git: Случай: Я нахожусь на master branch и объединил master branch с новой рабочей веткой phase2

$ git status

на ветке master

$ git merge phase2 $ git status

на ветке master

ваша ветвь опережает "origin / master" по 8 commits.

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

$ git reset --hard origin/master

или

$ git reset --hard HEAD~8

или

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

#создать файл gitignore

touch .gitignore // создать файл в Mac или unix пользователей

образец .содержание пример:

.project
*.py
.settings

ссылка на шпаргалку GIT:https://services.github.com/on-demand/downloads/github-git-cheat-sheet.pdf


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

git reset --hard

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

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

если вы хотите вытащить новые изменения из remote и хотите игнорировать локальные изменения во время этого pull затем,

git stash

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

git pull

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

git stash pop

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

git checkout -- <file>

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


Я думаю, что у git есть одна вещь, которая четко не документирована. Я думаю, что на самом деле им пренебрегли.

git checkout .

Мужик, ты спас мой день. У меня всегда есть вещи, которые я хочу попробовать использовать измененный код. Но иногда в конечном итоге Мессинг измененный код, добавлять новые неотслеживаемые файлы и т. д. Так что я хочу делать то, что хочу, делать грязные вещи, а затем быстро убирать и делать, если я счастлив.

здесь git clean -fd хорошо работает для игнорируемых файлов.

затем git reset просто удаляет устроили, но git checkout - это слишком громоздко. Указание файла по одному или использование каталогов не всегда идеально. Иногда измененные файлы, от которых я хочу избавиться, находятся в каталогах, которые я хочу сохранить. Я хотел, чтобы эта команда просто удаляла неустановленные изменения, и вот вы здесь. Спасибо.

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


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

изменение файла 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'

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

Это будет хранить все изменения в {0} ключ и мгновенно уронить его из {0}

git stash && git stash drop


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

$ git статус

чем попробуй!--1-->

$ git reset --hard

он сбросит вашу ветку по умолчанию

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

$ edit (1) $ Git в нем могут содержаться материалы только добавить.с фильфре.c $ mailx (2) $ ГИТ сброс
(3) $ git pull git: / / информация.пример.com / nitfol


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