Как отказаться от неустановленных изменений в Git?

Как отменить изменения в моей рабочей копии, которые не указаны в индексе?

+4491
источник поделиться
36 ответов
  • 1
  • 2

Ни одно из решений не работает, если вы просто изменили разрешения файла (это на DOS/Windoze)

Mon 23/11/2015-15:16:34.80 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:16:37.87 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Mon 23/11/2015-15:16:45.22 C:\...\work\checkout\slf4j+> git reset --hard HEAD
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:16:47.42 C:\...\work\checkout\slf4j+> git clean -f

Mon 23/11/2015-15:16:53.49 C:\...\work\checkout\slf4j+> git stash save -u
Saved working directory and index state WIP on SLF4J_1.5.3: 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore
HEAD is now at 8fa8488 12133-CHIXMISSINGMESSAGES MALCOLMBOEKHOFF 20141223124940 Added .gitignore

Mon 23/11/2015-15:17:00.40 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (cb4966e9b1e9c9d8daa79ab94edc0c1442a294dd)

Mon 23/11/2015-15:17:06.75 C:\...\work\checkout\slf4j+> git stash drop
Dropped refs/[email protected]{0} (e6c49c470f433ce344e305c5b778e810625d0529)

Mon 23/11/2015-15:17:08.90 C:\...\work\checkout\slf4j+> git stash drop
No stash found.

Mon 23/11/2015-15:17:15.21 C:\...\work\checkout\slf4j+> git checkout -- .

Mon 23/11/2015-15:22:00.68 C:\...\work\checkout\slf4j+> git checkout -f -- .

Mon 23/11/2015-15:22:04.53 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)

        modified:   .gitignore
        modified:   LICENSE.txt
        modified:   TODO.txt
        modified:   codeStyle.xml
        modified:   pom.xml
        modified:   version.pl

no changes added to commit (use "git add" and/or "git commit -a")

Mon 23/11/2015-15:22:13.06 C:\...\work\checkout\slf4j+> git diff
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
diff --git a/LICENSE.txt b/LICENSE.txt
old mode 100644
new mode 100755
diff --git a/TODO.txt b/TODO.txt
old mode 100644
new mode 100755
diff --git a/codeStyle.xml b/codeStyle.xml
old mode 100644
new mode 100755
diff --git a/pom.xml b/pom.xml
old mode 100644
new mode 100755
diff --git a/version.pl b/version.pl
old mode 100644
new mode 100755

Единственный способ исправить это - вручную reset разрешения на измененные файлы:

Mon 23/11/2015-15:25:43.79 C:\...\work\checkout\slf4j+> git status -s | egrep "^ M" | cut -c4- | for /f "usebackq tokens=* delims=" %A in (`more`) do chmod 644 %~A

Mon 23/11/2015-15:25:55.37 C:\...\work\checkout\slf4j+> git status
On branch SLF4J_1.5.3
nothing to commit, working directory clean

Mon 23/11/2015-15:25:59.28 C:\...\work\checkout\slf4j+>

Mon 23/11/2015-15:26:31.12 C:\...\work\checkout\slf4j+> git diff

+5
источник

Обновление 2019 года:

С июля 2019 года появилась новая команда, которая делает именно это: git restore.

В git status теперь Git рекомендует использовать эту команду вместо git checkout, как раньше.

Хотя эту команду также можно использовать для восстановления рабочего дерева до определенного коммита или для восстановления содержимого индекса, по умолчанию рабочее дерево восстанавливается до состояния в индексе (о чем здесь говорится).

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

git restore <pathspec>

И чтобы удалить все неотмеченные изменения в текущем хранилище:

git restore .

Как и в случае с git checkout -- ., при этом будут отменены только изменения в файлах, отслеживаемых Git, и не будут удалены любые новые неотслеживаемые файлы. Если вы хотите отменить любые неотмеченные изменения, включая новые неотслеживаемые файлы, вы можете выполнить дополнительные:

git clean -dff

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


Примечание к git restore: поскольку это новая команда, ее страница руководства выдает предупреждение:

Эта команда является экспериментальной. Поведение может измениться.

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

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

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


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

у вас очень простая команда git git checkout .

+3
источник

Чтобы сделать постоянный сброс: git reset --hard

Чтобы сохранить изменения на потом: git stash

+2
источник

Просто используйте:

git stash -k -u

Это закроет неустановленные изменения и необработанные файлы (новые файлы) и сохранит поставленные файлы.

Это лучше, чем reset/checkout/clean, потому что вы можете захотеть их позже (через git stash pop). Держать их в кошельке лучше, чем отбрасывать их.

+1
источник

Если в вашем локальном репозитории есть остатки кого-то, принудительно совершившего коммит, вы можете попытаться безрезультатно удалить все локальные изменения, используя все вышеупомянутые предложения. Если удаленный (origin/branch_name) был исправлен вами или кем-то еще, но ваш локальный репозиторий по-прежнему показывает конфликты, запустите:

   git checkout branch_name
   git reset --hard origin/branch_name    
   git pull
0
источник
  • 1
  • 2

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