git reset - тверда голова залишає позаштатні файли позаду


584

Коли я біжу git reset --hard HEAD, то, як я розумію, слід повернути до первозданної версії того, що ви витягнули. На жаль, він залишає файли, що лежать навколо, як git statusпоказує великий список файлів, що не відслідковуються.

Як ви скажете git "Просто поверніть це ТОЧНО, що було в останньому тягненні, нічого більше, нічого менше"?


44
git reset --hardскидає ваш індекс та повертає відстежені файли назад у стан, як вони є в HEAD. Не залишає відстежуваних файлів у спокої.
п’ятігюрі

Відповіді:


903

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

Якщо вам потрібно скинути весь сховище до master, включаючи всі підмодулі git, запустіть цей сценарій:

git reset --hard HEAD
git clean -f -d
git checkout master
git fetch origin master
git reset --hard origin/master
git pull
git submodule update
git submodule update --init --recursive
git submodule foreach git reset --hard HEAD
git submodule foreach git clean -f -d
git submodule foreach git submodule update --init --recursive
git submodule foreach git fetch
git submodule foreach git pull
git status

56
Також -xякщо ви хочете видалити ваші .gitignored файли та повернутися до первозданного стану.
jtdubs

44
Додайте -nдо тесту спочатку буде видалено. об'єднайте їх в одному аргументі:-dfn
HyBRiD

31
Моя загальна команда git clean -qfdxтут. Видаліть усе і зробіть це мовчки.
aragaer

3
-d -fможна двічі декларувати -dffдля -d -f -f, це видалить ВСІ неперевірені каталоги, включаючи захищені відслідковувані каталоги.
ThorSummoner

3
@BKSpurgeon: так, він видаляє файли. Що ви маєте на увазі під «Я хочу відслідковувати файли такими, які були раніше»? Git нічого не знає про незаймані файли, за винятком того, що вони існують. Він не відстежує кілька версій цих файлів (так як вони неотслежіваемих ).
knittl

60

Якщо у вас є файли, які ви все ще хочете зберегти:

git clean -di зробить інтерактивну чистку, яка дозволяє видаляти лише ті файли / режими, які ви більше не хочете.


48
git reset --hard && git clean -dfx

або, zsh надає псевдонім 'gpristine':

alias gpristine='git reset --hard && git clean -dfx'

Що справді зручно.

Якщо ви працюєте над роздвоєним репо, переконайтеся, що ви отримаєте та скиньте з правильного репо / гілки, наприклад:

git fetch upstream && git reset --hard upstream/master && git clean -df

8
Вибачте, якщо це не безпечна команда - я не намагався бути безпечним, я намагався відповісти на питання. Чи можете ви прокоментувати, чи відповідає це питання?
jjnevis

3
Це добре працює, і його слід вбудовувати в git IMHO (хоча я не впевнений, що використовував би -x звичайно). Так багато разів я працюю над локальним проектом, ще не синхронізованим з github тощо, і брудний рефактор переходить у сірий за межі статусу "скасувати" IDE. Мій інстинкт полягає в тому, щоб повернутися до останнього вчинення, але гуглінг для цього, як правило, відповідає на відповіді за передостаннє, а не останнє. Все, що я хочу, - це повернутися до останніх зобов'язань. Це робить це. Має бути більш простим способом. Дякую Лінус! ;-)
Dell Anderson

5
Це небезпечно, оскільки він також видаляє ігноровані файли з -xподібними, якби ви просто клонували репо. Якщо це те, що ти хочеш, це ідеально. Якщо ви просто хочете видалити незатребувані файли, видалення -xпараметра працює добре.
Еміль Бержерон

2
Слава богу заgpristine
Snowcrash

2
і видаляє налаштування Intellij;)
Kalpesh Soni

17

Інтерактивний підхід користувача:

git clean -i -fd

Remove .classpath [y/N]? N
Remove .gitignore [y/N]? N
Remove .project [y/N]? N
Remove .settings/ [y/N]? N
Remove src/com/amazon/arsdumpgenerator/inspector/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove src/com/amazon/arsdumpgenerator/s3/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/manifest/ [y/N]? y
Remove tst/com/amazon/arsdumpgenerator/s3/ [y/N]? y

-i для інтерактивних
-f for force
-d для каталогу
-x для проігнорованих файлів (додати, якщо потрібно)

Примітка. Додайте -n або --dry-run, щоб просто перевірити, що це буде робити.


4

Можна використовувати git stash. Ви маєте вказати --include-untracked, інакше у вас виникне початкова проблема.

git stash --include-untracked

Потім просто опустіть останній запис у сховище

git stash drop

Ви можете зробити для цього зручний псевдонім і назвати його, git wipeнаприклад:

git config --global alias.wipe "! git stash -q --include-untracked && git stash drop -q"

2

Команда, яку ви шукаєте, - це git clean


4
Наступного разу, будь ласка, додайте трохи більше опису / прикладів тощо. Що б не допомогло користувачеві зрозуміти, що він робить, і, в цьому випадку, які параметри використовувати.
рюк

1

git-clean Використовуйте для видалення файлів, що не відслідковуються, з робочого дерева. Далі наведено кілька варіантів (стисло), які можна використовувати з git cleanкомандою.

-dвикористовувати, коли шлях не вказано. Тож git повторно записується до невиправлених каталогів, видаляйте їх.

-f/--force Щоб видалити вкладені файли без відстеження.

-i/--interactive Покажіть, що буде зроблено, та чистіть файли інтерактивно.

-n/--dry-run Покажіть, що буде, не знімаючи нічого.

-x ігноруйте файли

Приклад: git clean -f -d-> Видаліть усі незафіксовані файли з поточного каталогу будь-яких підкаталогів.


-16

Ви, можливо, в якийсь момент зробили м'який перезавантаження, вирішити цю проблему можна, виконавши

git add .
git reset --hard HEAD~100
git pull

7
Я не думаю, що саме цього хотів ОП. Будь-яка з інших відповідей робить набагато кращу роботу, фактично показуючи, як це виправити.
Avery

1
Це також може бути повільним, якщо у вас є багато файлів, які потрібно додати.
Девін Г Род

4
абсолютно не пов'язані між собою.
Азем Хасні

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