статус git показывает изменения, git checkout - не удаляет их
Я хотел бы удалить все изменения в моей рабочей копии.
Бег!--1--> показывает файлы, которые были изменены.
Ничто из того, что я делаю, не удаляет эти изменения.
Например:
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout -- Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git checkout `git ls-files -m`
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git reset --hard HEAD
HEAD is now at 6c857e7 boo libraries updated to 2.0.9.2 and rhino.dsl.dll updated.
rbellamy@PROMETHEUS /d/Development/rhino-etl (master)
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: Rhino.Etl.Core/Enumerables/CachingEnumerable.cs
# modified: Rhino.Etl.Core/Pipelines/SingleThreadedPipelineExecuter.cs
# modified: Rhino.Etl.Tests/Rhino.Etl.Tests.csproj
# modified: Rhino.Etl.Tests/SingleThreadedPipelineExecuterTest.cs
#
no changes added to commit (use "git add" and/or "git commit -a")
20 ответов
существует несколько проблем, которые могут вызвать это поведение:
строка, заканчивающаяся нормализацией
у меня тоже были такие проблемы. Это сводится к Git автоматического преобразования crlf в lf. Обычно это вызвано смешанными окончаниями строк в одном файле. Файл нормализуется в индексе, но когда git затем денормализует его снова, чтобы отличить его от файла в рабочем дереве, результат будет другим.
но если вы хотите, чтобы исправить это, вы должны отключить ядра.
git config --global core.autocrlf false
вместо ядра..gitattribute
файлы. Таким образом, вы можете убедиться, что все, кто использует РЕПО, используют одни и те же правила нормализации, предотвращая попадание смешанных окончаний строк в репозиторий.
также рассмотреть вопрос о создании ядра.safecrlf чтобы предупредить, если вы хотите, чтобы git предупредил вас, когда будет выполнена необратимая нормализация.
ЖКТ manpages скажу так:
преобразование CRLF имеет небольшой шанс порчи данных. autocrlf=True будет преобразование CRLF в LF во время фиксации и LF к CRLF во время проверки. Папка который содержит смесь LF и CRLF прежде чем совершить невозможно с помощью Git. Для текстовых файлов это право что делать: он исправляет линию окончания такие, что у нас есть только LF линия окончания в репозитории. Но для двоичные файлы, которые случайно классифицируется как текст преобразование может повредить данные.
файловые системы, нечувствительные к регистру
в файловых системах без учета регистра, когда одно и то же имя файла с другим корпусом находится в репозитории, git пытается проверить оба, но только один заканчивается в файловой системе. Когда git пытается сравнить второй во-первых, он сравнил бы его с неправильным файлом.
решением будет либо переключение на файловую систему без учета регистра, но в большинстве случаев это невозможно, либо переименование и фиксация одного из файлов в другой файловой системе.
у меня была эта проблема в Windows, но я не был готов изучить последствия использования config --global core.autocrlf false
Я также не был готов отказаться от других частных филиалов и лакомств в моем тайнике и начать со свежего клона. Мне просто нужно кое-что сделать. Сейчас.
это сработало для меня, по идее, что вы позволяете git полностью переписать свой рабочий каталог:
git rm --cached -r .
git reset --hard
(обратите внимание, что работает только git reset --hard
было недостаточно хорошо, и не было простым rm
на файлы перед reset
как предлагается в комментариях к первоначальному вопросу)
другое решение, которое может работать для людей, так как ни один из вариантов текста не работал для меня:
- заменить содержимое
.gitattributes
с одной строки:* binary
. Это говорит git рассматривать каждый файл как двоичный файл, с которым он ничего не может сделать. - проверьте, что сообщение для оскорбительных файлов исчезло; если это не так, вы можете
git checkout -- <files>
восстановить их в версии репозитория -
git checkout -- .gitattributes
восстановить.gitattributes
файл к его начальной государство - убедитесь, что файлы по-прежнему не помечены как измененные.
для будущих людей, имеющих эту проблему: изменение filemode также может иметь те же симптомы. git config core.filemode false
исправим это.
это сводило меня с ума, особенно то, что я не мог исправить это без каких-либо решений, найденных в интернете. Вот как я это решил. Не могу взять кредиты здесь, так как это работа коллеги :)
источник проблемы: моя первоначальная установка git была без автоматического преобразования строки в windows. Это вызвало мою первоначальную приверженность GLFW без надлежащего окончания строки.
Примечание: это только локальное решение. Следующий парень клонирует РЕПО все равно застрянет с этой проблемой. Окончательное решение может быть найти здесь: https://help.github.com/articles/dealing-with-line-endings/#re-normalizing-a-repository.
настройка: Xubuntu в 12.04 Git repo с проектом glfw
проблема: не удалось сбросить файлы glfw. Они всегда отображаются как измененные, независимо от того, что я пробовал.
решила:
edit .gitattributes
Comment out the line: # text=auto
Save the file
restore .gitattributes: git checkout .gitattributes
у меня было .файл bat с той же проблемой (не удалось избавиться от него в неотслеживаемых файлах). git checkout -- не сработало, ни одно из предложений на этой странице. Единственное, что у меня получилось, - это сделать:--3-->
git stash save --keep-index
и затем, чтобы удалить тайник:
git stash drop
получил ту же проблему дважды! Оба раза, когда я внес некоторые изменения, а затем попытался их вернуть. Не удалось вставить изменения, так как у меня много файлов, которые изменены, но это не так! Они совершенно одинаковые.
теперь я думаю, я пробовал все вышеперечисленные решения без успеха. После попытки
git rm --cached -r .
git reset --hard
теперь я изменил почти все файлы в моем репозитории.
когда сравниваете файл, он говорит, Я удалил все строки, а затем добавьте их снова.
немного тревожит. Теперь я буду избегать тайников в будущем..
единственное решение-клонировать новый репозиторий и начать все сначала. (Сделал это в последний раз)
я смог исправить это, временно удалив мои РЕПО .gitattributes файл (который определен * text=auto
и *.c text
).
Я побежал git status
после удаления и изменения исчезли. Они не вернулись даже после .gitattributes был поставлен на место.
наличие последовательных окончаний строк-это хорошо. Например, это не вызовет ненужных слияний, хотя и тривиальных. Я видел, как Visual Studio создает файлы со смешанными окончаниями строк.
также некоторые программы, такие как bash (на linux), требуют этого .sh-файлы завершаются LF.
чтобы убедиться, что это произойдет, вы можете использовать gitattributes по. Он работает на уровне репозитория независимо от значения autcrlf.
например, вы можете иметь .gitattributes по как этот: * text=auto
вы также можете быть более конкретным для каждого типа файла/расширения, если это важно в вашем случае.
затем autocrlf может конвертировать окончания строк для программ Windows локально.
в смешанном проекте C#/C++/Java/Ruby/R, Windows/Linux это работает хорошо. Пока никаких проблем.
у меня также были те же симптомы, но были вызваны другой вещью.
Я не смог:
git checkout app.js //did nothing
git rm app.js //did nothing
rm -rf app.js //did nothing
даже на
git rm --cached app.js
он подписывается как удаленные и в неотслеживаемых файлах я мог видеть приложение.js. Но когда я попытался ... --2--> и peform git status
снова он все еще показывает мне файл в "untracked".
после пары попыток с коллегой мы выяснили, что это было вызвано ворчанием!
как Grunt
был включен, и потому, что приложение.js был сгенерированный из нескольких других файлов js, мы узнали, что после каждой операции с файлами js (также это приложение.js) grunt воссоздать приложение.снова И..
здесь много решений, и я, возможно, должен был попробовать некоторые из них, прежде чем я придумал свой собственный. Во всяком случае, вот еще один ...
наша проблема заключалась в том, что у нас не было принудительного исполнения для конечных линий, и в репозитории было сочетание DOS / Unix. Еще хуже было то, что на самом деле это было РЕПО с открытым исходным кодом в этой позиции, и которое мы раздвоили. Решение было принято теми, кто имеет первичное владение репозиторием ОС, чтобы изменить все конечные линии на Unix, и фиксация была сделана, что включал в себя .gitattributes
для принудительного окончания строки.
к сожалению, это, похоже, вызвало проблемы, подобные описанным здесь, где после слияния кода до того, как DOS-2-Unix был сделан, файлы навсегда будут помечены как измененные и не могут быть возвращены.
во время моих исследований для этого я наткнулся -https://help.github.com/articles/dealing-with-line-endings/ - Если я снова столкнусь с этой проблемой, я сначала попробую это из.
вот что я сделал:
Я изначально сделал слияние, прежде чем понял, что у меня есть эта проблема, и мне пришлось прервать это -
git reset --hard HEAD
(я столкнулся с конфликтом слияния. Как я могу прервать слияние?)Я открыл соответствующие файлы в VIM и перешел на Unix (
:set ff=unix
). Такой инструмент, какdos2unix
может использоваться вместо курссовершено
-
слил
master
in (мастер имеет изменения DOS-2-Unix)git checkout old-code-branch; git merge master
разрешены конфликты, и файлы были DOS снова, поэтому пришлось
:set ff=unix
когда в VIM. (К сведению, у меня установлена https://github.com/itchyny/lightline.vim что позволило мне увидеть то, что формат файла на statusline ВИМ)- совершено. Все отсортированный!
эта проблема также может возникнуть, когда участник РЕПО работает на машине Linux или windows с Cygwin и правами доступа к файлам изменены. Git знает только 755 и 644.
пример этой проблемы и как ее проверить:
git diff styleguide/filename
diff --git a/filename b/filename
old mode 100644
new mode 100755
чтобы избежать этого, вы должны убедиться, что вы правильно настроили git, используя
git config --global core.filemode false
проблема, с которой я столкнулся, заключается в том, что windows не заботится о капитализации имени файла, но git делает. Таким образом, git сохранил нижнюю и верхнюю версии файла, но мог только проверить один.
для меня проблема заключалась в том, что Visual Studio была открыта при выполнении команды
git checkout <file>
после закрытия Visual Studio команда работала, и я мог, наконец, применить свою работу из стека. Поэтому проверьте все приложения, которые могут вносить изменения в ваш код, например SourceTree, SmartGit, NotePad, NotePad++ и другие редакторы.
Если вы клонируете репозиторий и мгновенно видите ожидающие изменения, то репозиторий находится в несогласованном состоянии. Пожалуйста, не комментируйте * text=auto
С . Это было сделано специально, потому что владелец репозитория хочет, чтобы все файлы хранились последовательно с окончаниями строк LF.
как указано HankCa, следуя инструкциям на https://help.github.com/articles/dealing-with-line-endings/ это способ решить проблему. Простой кнопка:
git clone git@host:repo-name
git checkout -b normalize-line-endings
git add .
git commit -m "Normalize line endings"
git push
git push -u origin normalize-line-endings
затем объедините (или вытяните запрос) ветку с владельцем РЕПО.
больше ничего на этой странице работали. Это, наконец, сработало для меня. Нет неотслеживаемых или загруженных файлов.
git add -A
git reset --hard
попробуйте сделать
git checkout-f
Это должно очистить все изменения в текущем рабочем локальном РЕПО
Я внес все изменения, а затем сделал и отменить на фиксации. Это сработало для меня
git добавить .
git commit-m "Random commit"
git reset --hard HEAD~1
мы столкнулись с подобной ситуацией в нашей компании. Ни один из предложенных методов не помогает нам. В результате исследования была выявлена проблема. чтобы решить проблему, мы удалили один из файлов на сервере. После этого в локальных репозиториях на Windows помогли следующие несколько команд (в разных последовательностях):
git reset --hard
git pull origin
git merge
я столкнулся с этой проблемой несколько раз. В настоящее время я разрабатываю на машине Windows 10, предоставленной моим работодателем. Сегодня это конкретное поведение git было вызвано тем, что я создал новую ветвь из моей ветви "разработки". По какой-то причине, после того, как я переключился на ветку "разработка", некоторые, казалось бы, случайные файлы сохранялись и отображались как "измененные" в "git status".
кроме того, в тот момент я не мог проверить другую ветку, поэтому я застрял на своем " развитии" отделение.
вот что я сделал:
$ git log
я заметил, что новая ветвь, которую я создал из" develop "ранее сегодня, показывалась в первом сообщении "commit", на которое ссылались в конце " HEAD -> develop, origin/develop, origin/HEAD, - филиал-я-создал-ранее-сегодня".
так как мне это действительно не нужно, я удалил его:
$ git branch -d The-branch-i-created-earlier-today
измененные файлы все еще появлялись, поэтому я сделал:
$ git stash
это решило мой проблема:
$ git status
On branch develop
Your branch is up to date with 'origin/develop'.
nothing to commit, working tree clean
конечно $ git stash list
покажет спрятанные изменения, и так как у меня было мало и не нужно ни одного из моих тайников, я сделал $ git stash clear
удалить все тайники.
Примечание: я не пробовал делать то, что кто-то предложил здесь передо мной:
$ git rm --cached -r .
$ git reset --hard
возможно, это сработало, я обязательно попробую в следующий раз, когда столкнусь с этой проблемой.