git: Как мне получить последнюю версию моего кода?

200

Я использую Git 1.7.4.1. Я хочу получить последнюю версию своего кода из репозитория, но я получаю ошибки ...

$ git pull
….
M   selenium/ant/build.properties
….
M   selenium/scripts/linux/get_latest_updates.sh
M   selenium/scripts/windows/start-selenium.bat
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>' as appropriate to mark resolution, or use 'git commit -a'.

Я удалил локальные копии файлов, на которые жалуется инструмент, но я все еще получаю ошибки. Как проверить последнюю версию из удаленного репо? - Дэйв

Дейв
источник
1
Ответ @ Kzqai ниже помог мне: попробуйте сделать git fetchсначала. У меня не было конфликтов, но я получил последнюю версию кода.
Крис К

Ответы:

258

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

git reset --hard HEAD
git clean -xffd
git pull

Опять же, это сведет на нет все изменения, которые вы сделали локально, поэтому используйте их осторожно. Думайте о том, rm -Rfкогда делаете это.

Алекс Кертис
источник
1
Я попробовал эти команды и все еще получил сообщение об ошибке «CONFLICT (content): конфликт слияния в selenium / ant / build.xml» (среди прочих). Я просто хочу перезаписать последнюю версию моего файла тем, что находится в репо. Что мне делать??
Дэйв
31
git clean -fна самом деле не является частью ответа. Он удалит файлы, которые не хранятся в хранилище (например, в моем случае, файлы журнала); Вам не нужно делать это, чтобы git pullснова работать, git reset --hard HEADдостаточно.
Даррен Кук
12
Эш, чувак, не рекомендую одну из немногих команд удаления для мерзавцев.
Kzqai
6
@DarrenCook Я думаю, что git clean -fэто важно, если вы хотите реальную очистку вашей репозитой. Это эквивалентно выполнению операции «Удалить все из папки -> Получить последнюю версию / Получить спецификацию» в TFS, и в моем случае это то, что я хотел.
RPDeshaies
3
@Darren Я думаю, что git clean -f`` тоже важен. Я хочу получить последнюю версию и не хочу хранить устаревшие записи кэшей или другие сгенерированные ресурсы, которых нет в репо. Ответ ясен о том факте, что он удалит локальные изменения и имитирует последнюю версию из репозитория, поэтому он выглядит идеально для меня. Я бы переместил свои файлы журналов в другое место, если мне действительно нужно хранить их между обновлениями.
Balmipour
231

Случай 1: не заботиться о локальных изменениях

  • Решение 1. Получите последний код и сбросьте код

    git fetch origin
    git reset --hard origin/[tag/branch/commit-id usually: master]
    
  • Решение 2. Удалите папку и снова клонируйте: D

    rm -rf [project_folder]
    git clone [remote_repo]
    

Случай 2: Забота о локальных изменениях

  • Решение 1: не конфликтует с новой онлайн-версией

    git fetch origin
    git status
    

    сообщит что-то вроде:

    Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
    

    Тогда получите последнюю версию

    git pull
    
  • Решение 2: конфликтует с новой онлайн-версией

    git fetch origin
    git status
    

    сообщит что-то вроде:

    error: Your local changes to the following files would be overwritten by merge:
        file_name
    Please, commit your changes or stash them before you can merge.
    Aborting
    

    Зафиксируйте свои локальные изменения

    git add .
    git commit -m ‘Commit msg’
    

    Попробуйте получить изменения (не получится)

    git pull
    

    сообщит что-то вроде:

    Pull is not possible because you have unmerged files.
    Please, fix them up in the work tree, and then use 'git add/rm <file>'
    as appropriate to mark resolution, or use 'git commit -a'.
    

    Откройте файл конфликта и исправьте конфликт. Затем:

    git add .
    git commit -m ‘Fix conflicts’
    git pull
    

    сообщит что-то вроде:

    Already up-to-date.
    

Дополнительная информация: Как мне использовать 'git reset --hard HEAD', чтобы вернуться к предыдущему коммиту?

твл
источник
@ tvl.Как я могу получать последние обновления, не передавая свой код (есть конфликты) на ветку .. Помогите, пожалуйста
user3354457
@ user3354457 xm, интересный вопрос. Я никогда не пробовал этого раньше, но вы можете попробовать и доложить;) так: - Сделайте патч с изменениями: git diff> uncommited-changes.patch - Сбросьте ветку - вытяните изменения - примените патч
tvl
3
Этот ответ заслуживает гораздо больше голосов, чем тот, который был принят в качестве ответа.
Джеймс
@ Джеймс :) Я рад, что мой ответ поможет вам. Совет, попробуйте написать документацию, как будто вы ничего не знаете о предмете, и определенно многословие поможет вам вернуться.
твл
4
Лучший полный ответ для git fetch. Этот пост должен быть заблокирован
Callat
17

Я подозреваю, что произошло то, что вы удалили файлы, которые вы изменили (потому что вы не заботились об этих изменениях), и теперь git воспринимает удаление как изменение.

Вот подход, который перемещает ваши изменения из вашей рабочей копии в «тайник» (извлекаемый, если на самом деле окажется, что они вам когда-нибудь понадобятся снова), так что вы можете затем извлечь последние изменения из апстрима.

git stash  
git pull

Если вы когда-нибудь захотите получить ваши файлы (потенциальные конфликты с изменениями git stash applyв исходном коде и т. Д. ), Запустите команду, чтобы поместить эти изменения поверх вашего кода. Таким образом, у вас есть подход «отменить».

Kzqai
источник
1
Я, вероятно, рекомендую использовать, git stash popесли вы не хотите историю ваших git-
тайников
7

Вы должны объединить свои файлы в первую очередь. Сделайте, git statusчтобы увидеть, какие файлы нужно объединить (значит, вам нужно сначала разрешить конфликты). Как только это будет сделано, делай git add file_mergedи делай pullснова.

Амокране Чентир
источник
2
Спасибо. Я столкнулся с этой проблемой. У меня есть некоторые изменения в моих рабочих файлах, которые я не хочу фиксировать. Но я не могу сделать мерзавец в этом случае. Так что я делаю - git stash, git pull --rebase, git stash pop. Затем вручную объедините и добавьте git add file_merged
RuntimeException
6

попробуй этот код

cd /go/to/path
git pull origin master
Amirouche Zeggagh
источник
5
Добро пожаловать в Stackoverflow! Пожалуйста, рассмотрите возможность добавления некоторого объяснения к вашему решению, чтобы лучше описать, как оно решает проблему. Это сделает ваши ответы еще более полезными
dkackman
2

Если вы просто хотите выбросить все в своей рабочей папке (например, результаты неудачного или прерванного слияния) и вернуться к чистой предыдущей фиксации, выполните a git reset --hard.

Дамиан
источник
1

Я понимаю, что вы хотите удалить ваши локальные изменения и выяснить, что находится на вашем пульте?

Если все остальное терпит неудачу, и если вы (вполне понятно) боитесь «перезагрузки», самое простое - просто клонировать источник в новый каталог и удалить старый.

Дэн Рэй
источник
1

Запустив эту команду, вы получите самый последний тег, который обычно является версией вашего проекта:

git describe --abbrev=0 --tags
ReCatCoder
источник
0

Мне кажется, что у вас проблемы с core.autocrlf. core.autocrlf = true может создать проблемы, подобные тем, которые вы описываете в Windows, если в репозиторий были добавлены новые строки CRLF. Попробуйте отключить core.autocrlf для репозитория и выполнить полную перезагрузку.

kusma
источник
0

Если вы используете Git GUI, сначала получите, а затем объедините.

Извлечь через Удаленное меню >> Извлечь >> Происхождение. Объединить через меню Merge >> Merge Local.

Появится следующий диалог.

введите описание изображения здесь

Выберите радиокнопку ветви отслеживания (также по умолчанию выбрана), оставьте желтое поле пустым и нажмите кнопку слияния, и это должно обновить файлы.

Я уже отменил некоторые локальные изменения перед выполнением этих шагов, так как я в любом случае хотел их отменить, чтобы позже мне не пришлось их удалять с помощью слияния.

зар
источник