Git pull не обновляет файлы
Я пытаюсь обновить репозиторий Git на GitHub. Я сделал кучу изменений, добавил их, совершил, а затем попытался сделать git push . Ответ говорит мне, что все обновлено, но очевидно, что это не так.
отвечает репозиторием, который я ожидал.
почему Git говорит мне, что репозиторий обновлен, когда есть локальные коммиты, которые не видны в репозитории?
git push не толкает все ваши локальные ветви: как он узнает, какие удаленные ветви их толкать? Он только толкает локальные ветви, которые были настроены для толчка к определенной удаленной ветви.
на моей версии Git (1.6.5.3), когда я запускаю git remote show origin он фактически печатает, какие ветви настроены для push:
Q. но я мог бы нажать на master , не беспокоясь обо всем этом!
когда вы git clone , по умолчанию он устанавливает локальный master ветка, чтобы нажать на пульт master филиал (локально называемый origin/master ), так что если вы совершаете только на master и git push всегда будет толкать свои изменения обратно.
однако, из выходного фрагмента, который вы опубликовали, вы находитесь в ветке под названием develop , который, как я предполагаю,не был настроен ни на что. Так что git push без аргументов не будет нажимать коммиты на этой ветке.
когда он говорит: "Все up-to-date", это означает"все ветви, которые вы сказали мне, как нажать, актуальны".
Q. Итак, как я могу нажать мои коммиты?
если то, что вы хотите сделать, это внести изменения из develop на origin/master , тогда вы можете объединить их в локальную master тогда Нажмите это:
если вы хотите создать develop ветка на пульте, отдельно от master , потом аргументы git push :
это будет: создать новую ветку на пульте под названием develop ; и приведите эту ветку в соответствие с вашим местным develop филиала; и set develop для передачи origin/develop так что в будущем git push без аргументов будет push develop автоматически.
если вы хотите нажать ваш местный develop в удаленную ветку под названием Что-то кроме develop , то вы можете скажи:
однако, что форма не настройка develop всегда нажимать на origin/something-else в будущем; это одноразовая операция.
это произошло со мной, когда мое приложение SourceTree разбилось во время постановки. И в командной строке это выглядело как предыдущее git add были повреждены. Если это так, попробуйте:
по последней команде вам может потребоваться установить ветку.
имейте в виду, что этого достаточно, если вы не сделали ветвления или любого из этого рода. В этом случае, убедитесь, что вы нажимаете на правильную ветку, как git push origin develop .
Как принудительно перезаписать локальные файлы во время git pull?
Имею следующий сценарий:
- Один из коллег вносит изменения в шаблоны веб-сайта, на котором мы работаем.
- Он добавляет несколько изображений в соответствующую директорию (но забывает добавить их в систему контроля версий).
- Затем он отправляет мне эти изображения по почте.
- Я добавляю изображения в систему контроля версий и отправляю их на Github вместе с другими изменениями.
- Сотрудник не может обновить свою версию проекта из Github, потому что git не переписывает его локальные файлы.
Ошибка выглядит так:
error: Untracked working tree file 'public/images/icon.jpg' would be overwritten by merge.
Как заставить Git перезаписать локальные файлы? Упомянутый сотрудник – дизайнер, и обычно все конфликты решаются мною вручную: я слежу, чтобы на сервере была самая последняя версия всех файлов, то есть мой коллега должен обновлять локальные файлы на своем компьютере.
Я добавляю изображения в систему контроля версий — плохое решение. blob-ы нежелательно помещать под управление системы контроля версий исходных текстов.
@alexanderbarakin Буду крайне признателен, если вы оформите рекомендации в виде еще одного ответа или отдельного вопроса с ответом!
важно: если у вас есть какие-либо изменения, они будут утеряны. С или без --hard опция, любые локальные коммиты, которые не были нажаты, будут потеряны. [*]
если у вас есть какие-либо файлы не отслеживается Git (например, загруженный пользовательский контент), эти файлы не будут затронуты.
я думаю, что это правильно:
затем, у вас есть два варианта:
или если вы на какая-то другая ветвь:
незафиксированные изменения
незафиксированные изменения, однако (даже постановочные), будут потеряны. Убедитесь в том, чтобы спрятать и совершить все, что вам нужно. Для этого вы можете запустить следующее:
а затем повторно применить эти незафиксированные изменения:
Он должен делать то, что вы хотите.
предупреждение: git clean удалить все неотслеживаемые файлы/директории и не может быть отменено.
иногда просто clean -f не помогает. В случае, если у вас есть неотслеженные каталоги, - D опция также необходима:
предупреждение: git clean удалить все неотслеживаемые файлы/директории и не может быть отменено.
рассмотрите возможность использования -n ( --dry-run ) первый флаг. Это покажет вам, что будет удалено без фактического удаление ничего:
Как Ежик я думаю, что ответы ужасны. Но хотя ответ ежика может быть лучше, я не думаю, что это так элегантно, как могло бы быть. Я нашел способ сделать это, используя "fetch" и "merge" с определенной стратегией. Что должно сделать так, чтобы ваши локальные изменения сохранялись до тех пор, пока они не являются одним из файлов, которые вы пытаетесь принудительно перезаписать.
объяснение:
git fetch загружает последнюю версию с пульта дистанционного управления, не пытаясь объединить или перебазировать что-либо.
тут git reset сбрасывает главную ветку на то, что вы только что получили. The --hard опция изменяет все файлы в вашем рабочем дереве, чтобы соответствовать файлам в origin/master
затем принесите изменения и перезаписать, если есть конфликт
" - X "- это имя опции, а" их " - значение для этой опции. Вы предпочитаете использовать" их "изменения, а не" ваши " изменения, если есть конфликт.
Я бы посоветовал сделать следующее:
нет необходимости извлекать все пульты и ветви, если вы собираетесь сбросить в исходную / главную ветвь правильно?
похоже, что лучший способ-сначала сделать:
чтобы удалить все неотслеженные файлы, а затем продолжить с обычным git pull .
некоторые ответы кажутся ужасными. Страшная, в смысле, что случилось с @Лаури по следующим Дэвид предложение Avsajanishvili.
скорее (git > v1.7.6):
позже вы можете очистить историю заначку.
конечно, если вы хотите, чтобы вернуться к тому, что вы спрятали:
вы можете найти эту команду полезной, чтобы выбросить локальные изменения:
а затем выполните очистку (удаляет неотслеженные файлы из рабочего дерева):
Если вы хотите удалить неотслеживаемые каталоги в дополнение к неотслеживаемым файлам:
вместо слияния с git pull , попробуйте это:
git reset --hard origin/master .
единственное, что работал для меня было:
это вернет вам пять коммитов, а затем с
Я нашел это, посмотрев вверх как отменить слияние Git.
проблема со всеми этими решениями заключается в том, что все они либо слишком сложны, либо, что еще большая проблема, в том, что они удаляют все неотслеженные файлы с веб-сервера, чего мы не хотим, так как всегда есть необходимые файлы конфигурации, которые находятся на сервере, а не в репозитории Git.
здесь самое чистое решение, которое мы используем:
первая команда загружает новые данные.
второй команда проверяет наличие файлов, добавляемых в репозиторий, и удаляет из локального репозитория непрослеженные файлы, которые могут вызвать конфликты.
третья команда проверяет все файлы, которые были изменены локально.
наконец, мы делаем pull для обновления до последней версии, но на этот раз без каких-либо конфликтов, так как неотслеженные файлы, которые находятся в репо, больше не существуют, и все локально измененные файлы уже то же самое, что и в репозитории.
у меня была та же проблема. Никто не дал мне это решение, но оно сработало для меня.
- удаление всех файлов. Оставь только то .каталог git.
- git reset --hard HEAD
- git pull
- git push
Теперь все работает.
прежде всего, попробуйте стандартный способ:
если выше не поможет и вы не заботитесь о свой неотслеживаемый файлы/каталоги (сделайте резервную копию на всякий случай), попробуйте следующие простые шаги:
это удалит все файлы git (excempt .git/ dir, где у вас есть все коммиты) и потяните его снова.
почему git reset HEAD --hard может потерпеть неудачу в некоторых случаях?
пользовательские правила в .gitattributes file
С eol=lf правило .gitattributes может заставить git изменять некоторые изменения файлов путем преобразования окончаний строк CRLF в LF в некоторых текстовых файлах.
если это так, вы должны зафиксировать эти изменения CRLF/LF (просмотрев их в git status ), или попробовать: git config core.autcrlf false временно игнорировать их.
incompability файловой системы
когда вы используете файловую систему, которая не поддерживает атрибутами разрешения. В примере вы есть два репозитория, один на Linux / Mac ( ext3 / hfs+ ) и еще один в файловой системе на основе FAT32/NTFS.
как вы заметили, существует два вида файловых систем, так что не поддерживает разрешений Unix в принципе не можем восстановить доступ к файлам системы, которая не поддерживает такие разрешения, так как ни --hard вы пытаетесь, git всегда обнаруживает некоторые "изменения".
Важно: Изменения, сделанные вами локально, будут потеряны. Как с опцией --hard , так и без нее, будут утеряны любые локальные коммиты, не отправленные на сервер. [*]
Если у вам есть не отслеживаемые локальные файлы (например, загруженные пользователями), они не будут затронуты.
Скорее всего, правильным решением в данном случае будет:
Или если вы находитесь в другой ветке:
3 ответа 3
Пояснение:
Команда git fetch загружает последнюю версию файлов из удаленного репозитория, не пытаясь что-либо объединить или синхронизировать ( merge или rebase ).
Затем git reset назначает главной веткой ту, которую вы только что обновили. Опция --hard изменяет все файлы в вашей рабочей ветке в соответствии с файлами в origin/master
[*] : Важно отметить, что поддерживать актуальность локальных изменений можно, если создать отдельную ветку от master перед тем, как выполнить git reset :
После этого все старые версии будут храниться в new-branch-to-save-current-commits . Неподтвержденные изменения, тем не менее (даже индексированные), будут утеряны. Поэтому индексируйте и добавляйте в локальный репозиторий все, что вам может пригодиться.
I am using Git to cooperate with other users, but today I cannot get the latest change on some files using " git pull ", and I cannot see the changes in " git log ".
What could be the issue?
It seems nothing is there to get the updates. Are you sure the files are committed correctly by other user and in the same repository? No Logs gives a doubt in this direction.
I'm having the same issue (I'm the only one at work with this issue). It's driving me batty! For the past few days I've been doing manual merges because pulls just aren't happening. But the manual merge causes all sorts of warnings to go off, which scares the entire team.
10 Answers 10
what worked for me is ,
- remove .git folder
- copy .git from other repo
- now git checkout
Before Removing , You can try
You will need to replace master with the appropriate branch, which now defaults to main .
The last two steps (fetch and reset) worked for me. Btw, "copy .git from other repo" shouldn't work, as each .git contains info specific to the repo it belongs to.
What worked for me,
It showed me that some file names were too long for git to pull them from my repo and hence the mismatch and incorrect builds.
So I ran following to fix and did a hard reset again.
Thankfully it worked.
Like now we can name and push/pull files with long names? I dont think it would break anything and I am not sure if it came from any GIT or Java standards.
In my case the issue was me having an index.lock file in my .git folder. I removed that, and pull worked.
Check your current branch.
If you are not in a branch, you are in a detached HEAD mode and git pull wouldn't merge anything.
That git log will help make sure you see if there are any new commits on fetched branches (that is, the remote tracking branches).
I use that git log alias to display those commits as a graph.
You could have an unfinished merge that prevents the pull. Check if you have a commit in progress.
I just wanted to add another case where this could happen. I was using a sparse checkout. For some reason I had a directory in my working tree that I thought was included in the sparse checkout (I thought it was listed in .git/info/sparse-checkout ) but wasn't (I had removed it from .git/info/sparse-checkout for some reason I now forget.) So it was just being ignored by pull or checkout or reset or any other commands. It was very confusing until I started replicating the sparse checkout configuration in a new, fresh clone and realized the error.
This would only happen to you if you are using a sparse checkout. If you are not using a sparse checkout, it couldn't happen. (Check git config to see if sparseCheckout is enabled, and check for the existence of .git/info/sparse-checkout, but you would know if you were doing this since I think it has to be set up manually by the user anyway.) (Google it if you're curious what it is-- its just a simple mechanism to omit files and directories from a checkout that would otherwise be tracked/pulled/fetched etc.)
After changing the origin to SSH, everything went smooth again.
(To get the SSH URL just click the "Clone" button in your Gitlab/Github web interface and select "Clone with SSH")
There are 2 possible sceanrios:
1. If you have any account in Bitbucket, gitlab and etc.
You might have to synchronise with your fork directory first and then perform git pull on your local branch. Basically you have to rebase your fork copy to get in sync with remote master and perform git pull in your local copy.
2. Just try to rebase your local work copy to be in sync with remote master.
ваши локальные изменения в следующих файлах будут перезаписаны merge
что если я хочу перезаписать их?
Я пробовал такие вещи, как git pull -f , но ничего не работает.
чтобы быть ясным, я хочу только перезаписать определенные изменения, а не все.
если вы хотите удалить все локальные изменения из рабочей копии, просто спрячьте их:
если они вам больше не нужны, теперь вы можете бросить эту заначку:
если вы хотите перезаписать только определенные части ваших локальных изменений, есть две возможности:
- зафиксируйте все, что вы не хотите перезаписывать, и используйте метод выше для остальных.
- использовать git checkout path/to/file/to/revert для изменения, которые вы хотите перезаписать. Делать уверен, что файл не находится в стадии через git reset HEAD path/to/file/to/revert .
это работает для меня, чтобы переопределить все локальные изменения и не требует идентификации:
вот решение, которое отбрасывает поэтапные изменения:
вы можете либо зафиксировать изменения перед слиянием, либо сохранить их:
- git stash save
- git merge origin/master
- git stash pop
мое решение для решения этой проблемы было:
тогда я мог бы перезаписать файл через:
если ваш репозиторий содержит несколько файлов, которые удаляются из master :
- git checkout master
- git fetch origin
- git reset --hard origin/master
- git checkout -b newbranch
в недавнем Git вы можете добавить -r / --rebase on pull команда для перебазирования текущей ветви поверх восходящей ветви после извлечения. Предупреждение должно исчезнуть, но есть риск, что вы получите некоторые конфликты, которые вам необходимо решить.
в качестве альтернативы вы можете проверить другую ветку с силой, а затем вернуться к master снова, например:
затем потяните его снова, как обычно:
использование этого метода может сэкономьте время от тайника ( git stash ) и потенциальные проблемы с разрешениями, сброс файлов ( git reset HEAD --hard ), удаление ( git clean -fd ) и т. д. Кроме того, выше это легче запомнить.
эта проблема заключается в том, что вы внесли изменения локально в файл / s и тот же файл/S существует с изменениями в репозитории Git, поэтому перед pull / push вам понадобятся локальные изменения stash:
для перезаписи локальных изменений одного файла:
заменить все локальные изменения (изменения во всех файлах):
также эта проблема может быть из-за того, что вы находитесь на ветке, которая не объединена с главной веткой.
иногда ничего из этого не работает. Досадно, из-за вещи LF я думаю, что будет работать удаление файлы затем потянуть. Не то чтобы я рекомендовал это решение, но если файл не существует, git не будет бесполезно сообщать вам, что ваши изменения (которые могут даже не быть изменениями) будут переопределены и позволят вам продолжить.
используйте на свой страх и риск.
вы можете использовать это для перезаписи файла
Если вы хотите перезаписать определенные изменения, вам нужно каким-то образом сказать ему, какие из них вы хотите забыть.
вы можете попробовать выборочно хранить изменения, которые вы хотите отказаться от использования git stash --patch и затем бросив эту заначку с git stash drop . Затем вы можете вытащить удаленные изменения и объединить их как обычно.
лучший способ решить эту проблему:
после этого вы можете перезаписать файл с:
У меня был особый случай этого: у меня был файл с --assume-unchanged на нем. Его было трудно обнаружить, так как git status команда не показывала никаких изменений
это сработало для меня, чтобы отбросить изменения на живом удаленном сервере и вытащить из системы управления версиями GitHub:
Если вы хотите сохранить изменения на сервере, просто сливаются в новый элемент конфигурации. Метод обработки выглядит следующим образом:
возможно, вы не выполняете все операции. Ты знаешь, что делать дальше.
git stash save --keep-index не работал для меня.
ниже команда работает, как ожидалось.
он переопределяет все локальные изменения, если они вам не нужны.
я игнорировал файл в моем РЕПО, и когда я это сделал git pull upstream master Я получил следующую ошибку:
ошибка: локальные изменения в следующие файлы будут переписаны слияния: myfile.Яш Пожалуйста, зафиксируйте свои изменения или спрячьте их, прежде чем вы сможете объединить. Аборт
чтобы решить это, я сделал следующее
на ветке master ваша ветка позади "origin / master" на 4 коммита, и можно быстро перемотать. (используйте "git pull" для обновления локального бранч)
изменения, не поставленные для фиксации: (используйте " git add . " обновлять что будет совершено) (используйте "git checkout -- . " отбрасывать изменения в рабочем каталоге)
изменено: myfile.js
никаких изменений для фиксации (используйте" git add "и/или"git commit-a")
тогда я сделал git checkout myfile.js следовал по git pull upstream master . Эта пора операция git pull была успешной.
вот моя стратегия решения проблемы.
Постановка Задачи
нужно внести изменения в более чем 10 файлов. Мы пытались!--0-->, но мерзавец крикнул:
ошибка: локальные изменения в следующие файлы будут переписаны путем слияния: пожалуйста, зафиксируйте свои изменения или спрячьте их, прежде чем сможете объединить.
мы пытались выполнить commit а то pull , но они не работают любой.
решение
мы были в грязный этап на самом деле, потому что файлы были в "промежуточной области" a.к."индексная область" и некоторые из них находились в "головной области" a.к."локальный каталог Git". И мы хотели забрать изменения с сервера.
проверьте эту ссылку для получения информации о различных этапах Git в ясной форме: этапы GIT
мы следовали следующему шаги
- git stash (это сделало наш рабочий каталог чистым. Ваши изменения хранятся в стеке Git).
- git pull origin master (вытащите изменения с сервера)
- git stash apply (применены все изменения из стека)
- git commit -m 'message' (внесенные изменения)
- git push origin master (передвинул изменения на сервер)
- git stash drop (падение стека)
давайте поймем, когда и почему вам нужно тайник
если вы находитесь в грязный состояние, означает, что вы вносите изменения в свои файлы, а затем вы вынуждены, по любой причине,тянуть или переключатель в другой филиал для очень срочной работы, поэтому в этот момент Вы не можете тянуть или переключаться, пока не совершите изменение. The stash команда здесь как Рука помощи.
из книги ProGIT, 2-е издание:
часто, когда вы работаете над частью своего проекта, все в грязное состояние, и вы хотите немного переключить ветви, чтобы работать что-то еще. Проблема в том, что вы не хотите делать фиксацию наполовину законченная работа, чтобы вы могли вернуться к этому позже. Этот ответом на эту проблему является команда git stash. Припрятать берет грязное состояние вашего рабочего каталога, то есть измененные отслеживаемые файлы и поэтапные изменения-и сохраняет его в стопке незавершенных изменения, которые можно применить в любое время.
Я столкнулся с этим при вытягивании из Мастера.
Как я справился с этим, используя Visual Studio;
- во-первых, я выполнил отмену фиксации на моем решении.
- затем я сделал процесс git pull.
надеюсь, что это помогает!
Если эта ошибка из-за окончания строк,
будет работать. Я не совсем понимаю, почему это работает.
для Pycharm вы можете сделать Git-- > Revert, а затем потянуть.
затем вы можете использовать:
полный выход из моего дела
Как принудительно перезаписать локальные файлы на git pull ?
- член команды изменяет шаблоны для веб-сайта, над которым мы работаем
- они добавляют некоторые изображения в каталог изображений (но забывает добавить их под контролем источника)
- они посылают изображения по почте, позже, мне
- я добавляю изображения под контролем источника и нажимаю их на GitHub вместе с другие изменения
- они не могут извлекать обновления из GitHub, потому что Git не хочет перезаписывать свои файлы.
это ошибка, которую я получаю:
Как заставить Git перезаписать их? Человек-дизайнер-обычно я разрешаю все конфликты вручную, поэтому сервер имеет самую последнюю версию, которую им просто нужно обновить на своем компьютере.
поддерживать текущие локальные коммиты
[*] : стоит отметить, что можно поддерживайте текущие локальные коммиты, создавая ветвь из master работает:
после этого, все старые коммиты будут храниться в new-branch-to-save-current-commits .
сначала сделайте фиксацию ваших изменений
Читайте также: