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): Злиття конфлікту у selelen / 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`` також важливий. Я хочу отримати останню версію, і я не хочу зберігати застарілі записи кеш-пам'яті або інші генеровані ресурси, які відсутні в репо-репо. Відповідь чітка щодо того, що вона видалить локальні зміни та імітує останню версію з репо, тому мені це виглядає ідеально. Я переміщу свої файли журналів в інше місце, якщо мені дійсно потрібно тримати їх між оновленнями.
Бальміпур

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> unmited-changes.patch - Скиньте гілку - витягніть зміни - застосуйте патч
tvl

3
Ця відповідь заслуговує набагато більше відгуків, ніж відповідь, яку прийняли як відповідь.
Джеймс

@James :) Я радий, що моя відповідь вам допомагає. Порада, спробуйте написати документацію так, як ви нічого не знаєте про тему, і, безумовно, багатослівність допоможе вам повернутися.
tvl

4
Найкраща відповідь на отримання git fetch. Ця публікація повинна бути заблокована
Callat

17

Я підозрюю, що може статися те, що ви видалили файли, які ви змінили (тому що ви не переймалися цими змінами) і тепер git приймає видалення як зміну.

Ось підхід, який переміщує ваші зміни з вашої робочої копії та перетворюється на "сховище" (витягнутий, якщо насправді виявиться, що вони вам колись потрібні знову), тож ви зможете витягнути останні зміни вниз із верхнього потоку.

git stash  
git pull

Якщо ви коли-небудь захочете отримати свої файли (можливі конфлікти зі змінами в потоці та всіма іншими), запустіть a, git stash applyщоб приклеїти ці зміни поверх коду. Таким чином, у вас є "скасувати" підхід.


1
Я, мабуть, рекомендую використовувати, git stash popякщо ви не хочете історії своїх git
stashes

7

Спершу потрібно злити файли. Зробіть a, git statusщоб побачити, які файли потрібно об'єднати (значить, потрібно спочатку вирішити конфлікти). Як тільки це буде зроблено, зробіть git add file_mergedі зробіть pullще раз.


2
Дякую. Я стикався з цією проблемою. У своїх робочих файлах є деякі зміни, які я не хочу робити. Але я не можу в цьому випадку зробити тягу. Так я роблю - git stash, git pull --rebase, git stash pop. Потім вручну об'єднайте та git додайте file_merged
RuntimeException

6

спробуйте цей код

cd /go/to/path
git pull origin master

5
Ласкаво просимо до Stackoverflow! Будь ласка, подумайте про те, як додати своє пояснення до свого рішення, щоб краще описати, як воно вирішує проблему. Це зробить ваші відповіді ще кориснішими
dkackman

2

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


1

Я розумію, що ви хочете виправити свої локальні зміни та знищити те, що є на пульті?

Якщо все інше не вдається, і якщо ви (цілком зрозуміло) боїтесь "скидання", найпростіше - це просто клонувати походження в новий каталог і виправити ваш старий.


1

Запустивши цю команду, ви отримаєте найсвіжіший тег, який зазвичай є версією вашого проекту:

git describe --abbrev=0 --tags

0

Мені це здається, що у вас проблеми з core.autocrlf. core.autocrlf = true може створювати проблеми, подібні до тих, які ви описуєте в Windows, якщо нові схожі рядки CRLF були зареєстровані у сховищі. Спробуйте відключити core.autocrlf для сховища та виконати жорстке скидання.


0

Якщо ви використовуєте Git GUI, спочатку виберіть, а потім з’єднайте.

Отримати через віддалене меню >> Вибрати >> Походження. Об'єднання через меню Об'єднання >> Об’єднання локального.

З'явиться наступне діалогове вікно.

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

Виберіть перемикач гілки відстеження (також вибрано за замовчуванням), залиште жовте поле порожнім і натисніть об'єднати, і це повинно оновити файли.

Я вже відміняв деякі локальні зміни, перш ніж робити ці кроки, оскільки я хотів їх відкинути, так що мені не доведеться ліквідувати через злиття пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.