Git checkout не меняет файлы
Мне очень нравится мерзавец. По крайней мере, мне нравится идея git. Возможность проверить свой главный проект как отдельную ветку, где я могу изменить все, что захочу, без риска испортить все остальное - это здорово. Но это не работает.
По сути, мой рабочий процесс такой:
- Оформите стабильную версию в новой ветке, чтобы поэкспериментировать с новым кодом
- Внесите кучу изменений - я не собираюсь ничего из этого оставлять, я просто экспериментирую.
- Посмотри на все, что я изменил
- Добавьте все изменения, которые нужно отслеживать
- Зафиксируйте ветку и отправьте ветку в исходную точку (если она сработала, в противном случае пропустите этот шаг)
- Решите попробовать другой метод, вернитесь к мастеру
- Наблюдайте за артефактами из экспериментальной ветки, в которой я работал, даже если я нахожусь в основной ветке.
Каждый раз, когда я проверяю ветку на другую ветку, вношу изменения в одну ветку, а затем проверяю исходную ветку, у меня все еще есть все файлы и изменения, которые произошли в другой ветке. Это очень расстраивает. Я читал, что это может произойти, когда у вас есть файлы, открытые в среде IDE при этом, но я был очень осторожен с этим, и оба закрыли файлы в среде IDE, закрыли среду IDE и выключили мой сервер rails перед переключением ветки, и это все еще происходит. Кроме того, запуск 'git clean -f' либо удаляет все, что произошло после некоторой произвольной фиксации (причем случайным образом), либо, как в последнем случае, ничего не меняет обратно в исходное состояние.
Я думал, что использую git правильно, но на данный момент я уже не в себе. Я пытаюсь работать с кучей экспериментального кода, используя стабильную версию моего проекта, но мне постоянно приходится вручную отслеживать и исправлять все внесенные мной изменения. Есть идеи или предложения?
Кажется, это происходит независимо от того, делаю ли я коммит или нет в ветке.
Вот пример того, как использовать git и ветки.
Теперь Мастер обновлялся много раз с тех пор, как кто-то что-то делал в сети.
Ого, мерзавец действительно злится. Похоже, что Master слишком далеко опередил сеть, чтобы git мог сделать всю работу за меня.
Хорошо, теперь я «вернулся в прошлое», когда в последний раз сеть отправлялась в исходную точку. Но мне действительно нужно вернуться и слиться с Мастером сейчас, прежде чем я буду делать какую-либо работу. Иначе даже слиться будет сложно.
Время, затраченное на объединение файлов
Теперь применим наши изменения.
Вы можете сделать это, если вам нравится "Да!"
Продвиньте наши изменения в мир
Вкратце: зафиксируйте свои изменения (убедитесь, что вы проверили правильную ветку, «экспериментальную»), даже если вы не заботитесь о ее сохранении, вы можете удалить ветку позже, если это то, что вы хотите), затем проверьте ветку, которую вы хотите (до внесения изменений) ваша IDE теперь будет отображать / обновлять статус файлов в ветке, которую вы только что извлекли)
Suppose I create (but do not commit) a file file.txt , and then type git checkout HEAD or git checkout HEAD . . I thought git checkout basically overwrote your current working files with the snapshot at the commit you give it, so I would have thought this would delete file.txt . But it doesn't. Why?
Git only manages tracked files, and it works fairly hard to avoid letting you lose data (which is critical).
@SergioTulentsev I don't think that's really a good way to phrase it. "Untracked" just means "not in the staging area right now". git checkout will still modify files that differ from how they were in the last commit, even if you haven't staged those changes.
The Git book isn't really disagreeing: the index is normally populated via git checkout , so what's in the index right now are those that were in the snapshot. But if you change the index (with git rm --cached or git add , for instance), that changes the set of tracked files. Note also that git checkout is a very different command from git checkout . Some (including myself) believe it should use a different spelling, i.e., not start with git checkout at all.
11 Answers 11
The cause for this was due to multiple files with the same name but different cases. In OSX, which is case-insensitive, doesn't like multiple files with the same name but different cases. It views them as the same file. To fix this, I ran git mv (or just mv ) to a temporary filename, added the temp files, which allowed git to remove the old/incorrectly named versions, then a second commit to name them back. This could also be corrected on a filesystem which allows different files with the same name to be different cases.
I use Git on Windows via Cygwin. We have some crazy security policies that magically change permissions on files during Git actions. (Others on Cygwin mailing list have noticed this.) Git detects these file mode changes, but git checkout -- $
This helped. After checking out using 'git checkout -- file', try doing a git diff. If it says the entire file has changed, but it really looks exactly the same, then it could be autocrlf.
Мне очень нравится git. По крайней мере, мне нравится идея ЖКТ. Возможность проверить мой мастер-проект как отдельную ветку, где я могу изменить все, что хочу, без риска испортить все остальное, потрясающе. Но это не работает.
в принципе, мой рабочий процесс выглядит так:
- проверка стабильной версии в новую ветку, чтобы поэкспериментировать с новым кодом
- сделайте кучу изменений - у меня нет намерения держать что-либо из этого, я просто экспериментирующий.
- смотреть на все вещи, которые я изменил
- добавить все изменения, которые будут отслеживаться
- зафиксируйте ветку и нажмите ветку в origin (если это сработало, в противном случае пропустите этот шаг)
- решите попробовать другой метод, вернитесь к master
- наблюдайте за артефактами из экспериментальной ветви, в которой я работал, хотя я нахожусь в главной ветви.
каждый раз, когда я проверяю ветку на другую ветку, сделайте изменения в одной ветви, а затем проверка исходной ветви, у меня все еще есть все файлы и изменения, которые произошли в другой ветви. Это становится чрезвычайно сложно. Я читал, что это может произойти, когда у вас есть файлы, открытые в IDE при этом, но я был довольно осторожен в этом, и оба закрыли файлы в IDE, закрыли IDE и выключили мой сервер rails перед переключением ветвей, и это все еще происходит. Кроме того, запуск "git clean-f" либо удаляет все это произошло после некоторой произвольной фиксации (и случайным образом), или, как в последнем случае, ничего не изменило обратно в исходное состояние.
Я думал, что правильно использую git, но на данный момент я нахожусь в тупике. Я пытаюсь работать с кучей экспериментальный код, используя стабильную версию моего проекта, но мне приходится вручную отслеживать и фиксировать все изменения, которые я сделал. Есть идеи или предложения?
это, кажется, происходит, делаю ли я фиксация или нет на ветке.
вот пример того, как использовать Git и ветви.
теперь Мастер был обновлен много раз, так как кто-нибудь сделал что-нибудь в сети
ого, ГИТ действительно сумасшедший. Похоже, мастер слишком далеко опережает сеть для git, чтобы делать ВСЮ работу за меня.
хорошо, теперь я "назад во времени", когда сеть в последний раз толкнул к origin. Но я действительно должен вернуться и слиться с мастером сейчас, прежде чем делать какую-либо работу. Другие мудрые это будет даже трудно слиться.
время, потраченное на объединение файлов
теперь применяем наши изменения.
вы можете сделать это, если вам нравится "да!"
нажмите наши изменения в мире
У меня была эта проблема, когда я попытался переключить temp на другую ветку из главной ветви, и когда я бы что-то изменил на этой странице temp и без фиксации изменений я бы снова проверил главную ветвь, он фактически объединил все изменения из временной ветви в MASTER.
всякий раз, когда вы оформляете заказ на ветку TEMP, зафиксируйте свои изменения. Таким образом, если вы зафиксируете их на ветке TEMP и checkout MASTER снова, он будет работать как предполагаемый.
Мне нравится объяснять git на общем языке. Ответ: это из-за предположения, что изменение ветвей (checkout) приведет вас к другому "рабочему пространству". Git этого не делает (хотя это кажется более естественным, и у многих есть это недоразумение).
вместо этого ветви похожи на теги, так сказать. Таким образом, вы можете танцевать вокруг ветвей, делать какую-то работу, изменять вещи, снова танцевать, а затем совершать. Тогда коммит будет съеден последней веткой, на которую вы пошли! Кассе только изменения "тег" / ветка, которую вы будете использовать, точка.
обновление после комментария Мартаса
Это относится к тому, когда ваша ветка и ваш мастер синхронизируются (относительно отслеживаемых файлов) или с неотслеживаемыми файлами. Если на самом деле они находятся в разных состояниях, при проверке файлы и папки фактически исчезнут и снова появятся. Если у вас есть изменения, отслеживаемые, но не комментируемые, то git фактически отменит проверку, и вам нужно либо зафиксировать, либо спрятать их.
у меня есть изменения в моем рабочем каталоге, которые я пытаюсь отбросить (сбросить до текущей индексированной версии файлов), однако, git checkout -- не отменить изменения. Я попытался вручную удалить файлы ( rm -r files ) запустите git checkout -- . , который отображает файлы как измененные снова.
под управлением git diff показывает, что файлы изменены.
Примечание: некоторые люди сказали бежать git checkout . , однако это приведет к тому же результату, что и git checkout -- . . The -- - это просто обозначение, используемое в команде git checkout для различения точек treeish / commit от файлов / путей.
OS: OSX 10.6 Git: 1.7.10.2
основываясь на ваших комментариях, вы должны настроить свой репозиторий с учетом регистра:
это позволяет git отслеживать оба файла (хотя файловая система показывает только один, что чрезвычайно запутанно). Вот шаги репликации, чтобы продемонстрировать, что происходит, когда git правильно отслеживает чувствительность к регистру:
теперь git status не показывает никаких различий в test :
Commit Test и использовать git ls-files чтобы увидеть, что мы теперь отслеживание:
что значит ls отчет? Ну, просто "тест", естественно:
наконец, что происходит, когда мы изменяем тест?
по какой-то причине то же самое произошло со мной, но это не было проблемой чувствительности к регистру. Удаление файла, а затем изменение ветвей решили проблему.
Если вы хотите отменить все внесенные изменения, просто используйте
Я столкнулся с той же проблемой. Я обнаружил, что два проблемных файла имели символы окончания строки DOS. Я сделал это, чтобы решить проблему.
1-используйте другой Клон для изменения строки, заканчивающейся на UNIX 2-сдуть Клон, где проблема появлялась и повторно клонировать его.
чтобы избежать этой проблемы в следующий раз, я решил преобразовать файловую систему в регистр.
Я был приятно удивлен, что это довольно легко на Mac OS (10.13.4).
можно быстро создать новый диск с другой файловой системой:
- запустить Дисковую утилиту
- нажмите на контейнер
- нажмите на громкости (+)
Я назвал новый том "проекты" и установил формат в APFS (Чувствительный к регистру.)
после этого я перевел все проекты на Новый том.
что помогло в моем случае: (также улучшая ответ vinboxx х)
Я был настроен .gitattributes следующим образом:
(Я хотел-X перенормировать, чтобы автоматически использовать правильный формат после слияния)
после временного комментирования этой строки вместе с настройкой git config core.autocrlf false . Все вернулось на круги своя.
Я использовал git checkout -- .
также git checkout .
== то же самое, что сказал op оба работали на Mac OSX 10.7 и Linux, работали на обоих
с Git версии 1.7.7.5 (Apple Git-26) и git 1.7.1 скомпилирован
попробуйте другое РЕПО и посмотрите, получите ли вы те же результаты. Может быть, ошибка команды в версии git?
когда вы удаляете файл из файловой системы с помощью "rm-r file", вы не удаляете его из репозитория. Йо нужно сделать Де же в git используя "git rm"
2 Answers 2
git checkout doesn't overwrite your working copy by-design.
It works in the same way as git reset --hard but with the important difference - git checkout is working-directory safe, so it doesn't overwrite existing changes in your working directory. Actually, it’s a bit smarter — it tries to do a trivial merge in the working directory.
So, if you want to discard all of your changes and just get the snapshot from HEAD use git reset --hard HEAD or just git reset --hard instead.
But even git reset --hard doesn't remove your untracked files. To remove untracked files:
- Run git clean --dry-run . It just tells you what will be removed. Do it because cleaning is a dangerous command.
- Run git clean --force to eventually remove your untracked files.
You can find more details about git checkout and git reset here and about cleaning here.
I have changes in my working directory that I'm trying to discard (reset to the current indexed version of the files), however, git checkout -- will not discard the changes. I've attempted to manually remove the files ( rm -r files ) then run git checkout -- . , which displays the files as modified again.
Running git diff shows the files are modified.
NOTE: Some people have said to run git checkout . , however this will achieve the same result as git checkout -- . . The -- is just a notation used in the git checkout command to differentiate treeish/commit points from files/paths.
OS: OSX 10.6 Git: 1.7.10.2
@vergenzt, no. doesn't work. I discovered the problem. I'm working with a repo that appears to have multiple files with the same names and different cases. Since I'm on an OSX workstation, which is case-insensitive, the files appeared to change, but not really. That's why I can't reset them nor can I commit the "change". I have to actually rename the files on a case sensitive OS and commit the result.
Читайте также: