git скасувати всі незапущені або збережені зміни


834

Я намагаюся скасувати всі зміни з мого останнього вчинення. Я спробував git reset --hardі git reset --hard HEADпісля перегляду цієї публікації . Я відповідаю головою зараз у 18c3773 ... але коли я дивлюсь на своє місцеве джерело, всі файли все ще є. Що я пропускаю?


1
Це чудовий ресурс прямо з Github: Як скасувати (майже) що-небудь із Git
jasonleonhard

Легкий для розуміння і простий для читання: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Відповіді:


1619
  • Це призведе до видалення всіх файлів, з якими ви могли інсценізуватись git add:

    git reset
    
  • Це відновить усі локальні невідпущені зміни (повинні бути виконані в корені repo):

    git checkout .
    

    Ви також можете повернути незапущені зміни лише до певного файлу чи каталогу:

    git checkout [some_dir|file.txt]
    

    Ще один спосіб відновити всі непослані зміни (довше вводити, але працює з будь-якого підкаталогу):

    git reset --hard HEAD
    
  • Це видалить усі локальні файли без відстеження, тому залишаються лише відстежені файли git:

    git clean -fdx
    

    ПОПЕРЕДЖЕННЯ: -x також буде видалено всі проігноровані файли, включаючи вказані файлом .gitignore! Ви можете використовувати -nдля попереднього перегляду файлів, які потрібно видалити.


Підсумовуючи це: виконання команд нижче, в основному, еквівалентно свіжим git cloneз оригінального джерела (але воно нічого не завантажує повторно, так що це набагато швидше):

git reset
git checkout .
git clean -fdx

Типовим для цього є сценарії збирання, коли ви повинні переконатися, що ваше дерево абсолютно чисте - не має жодних модифікацій, локально створених об’єктних файлів або створює артефакти, і ви хочете змусити його працювати дуже швидко і не повторно клонувати ціле сховище кожного разу.


@turibe це правильно. Мені довелося запускати свій проект кілька разів, оскільки він видаляв усі завантажені залежності та папку .idea. Потрібно краще рішення.
EresDev

2
@EresDev, вам не доведеться виконувати git clean, це скасує невідомі зміни, але збереже всі відтворені або додані файли. Але це може вплинути на результат нарощування, оскільки деякі файли, що не відслідковуються, можуть заважати. Наприклад, якщо ваш каталог .idea був пошкоджений?
mvp

git resetговорить мені, що я маю зміни, які мені потрібно зберегти
Даніель Спрінгер

1
біг git clean -fdxвидалив мій node_modulesі .env, чудово
fires3as0n

1
@ fires3as0n Що ще ти очікував? Це мало статися. У відповіді є також попередження.
Рішав

148

Якщо ви хочете " скасувати " всі непослані зміни, просто запустіть:

git stash
git stash drop

Якщо у вас є які-небудь відстежені файли (перевірити запуском git status), їх можна видалити запуском:

git clean -fdx

git stashстворює нову скриньку, яка перетвориться на скрипт @ {0} . Якщо ви хочете перевірити спочатку, ви можете бігти, git stash listщоб побачити список ваших скриптів. Це буде виглядати приблизно так:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Кожна скринька названа на честь попереднього обміну повідомленнями.


2
Хороше рішення, але вам потрібно поетапно змінити зміни, використовуючи git add .раніше, git stashтому що він показував мені невтішні зміни навіть післяgit stash
EresDev


12

Я використовую вихідне дерево .... Ви можете відновити всі невідомі зміни за допомогою 2 простих кроків:

1) просто потрібно скинути стан файлу робочої області

введіть тут опис зображення 2) виберіть усі нестабільні файли (команда + a), клацніть правою кнопкою миші та виберіть видалити

введіть тут опис зображення

Це так просто: D


Якщо скинути, а потім змінити гілку та перезавантажити на відреставровану гілку, це зашкодить. Скидання корисне, але не повинно використовуватися для відмови від невмілих змін. У разі викидання неподілених змін просто приберіть і скиньте скриньку.
Dinu Nicolae

10

Що я і роблю

git add . (adding everything)
git stash 
git stash drop

Один вкладиш: git add . && git stash && git stash drop


це найкращий
Madrugada

7

Для тих, хто доїхав сюди, шукаючи, чи не могли б вони скасувати git clean -f -d, за допомогою чого файл створюється у затемненні видалено,

Ви можете зробити те ж саме з користувальницького інтерфейсу, використовуючи для відновлення "відновлення з локальної історії": Відновлення з місцевої історії


3
Я не проголосував, проте ваша відповідь є менш зрозумілою щодо вашого наміру; допоможе, якби ви переформулювали перше речення у відповіді.
Марк Шультейс

5

Держави переходять від одного зобов'язання до нового

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Дія щодо переходу держави

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Перевірте різн

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Поверніться до останнього фіксації

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Еквівалентний git-клон, без повторного завантаження

git reset && git checkout . && git clean -fdx

Я не бачу, як це стосується заданого питання. Це лише низка дивних рецептів, без жодної реальної суті.
mvp
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.