Git Pull невозможен, файлы без объединения

89

Я читал все похожие вопросы по этому поводу; похоже, что ничего из следующего не помогло:

Delete offending files
git reset --hard HEAD
git stash
git pull

Практически каждая комбинация, включая сохранение изменений и извлечение из репозитория, приводит к созданию файлов, которые невозможно объединить. Я хотел бы отменить все локальные изменения и просто использовать пульт, но я не могу клонировать снова (ограничения полосы пропускания и использования Интернета, когда разработчик пытается это сделать). Как мне это сделать?

Только что попробовал:

git stash
git pull

Тоже не сработало.

Больше информации

Есть одна локальная фиксация, и у апстрима также есть фиксация. Таким образом, я пробовал, git pull --rebaseно он все еще не работает должным образом ... Это дает мне ошибки - «выход из-за нерешенного конфликта». Если я это сделаю git stash, git reset --hard HEAD, git pull --rebase, я получаю сообщение об ошибке «вытащить невозможно, изменения не объединены ...»

Кристиан Стюарт
источник

Ответы:

199

Скажем, пульт есть, originа ветка есть master, и скажем, что вы уже masterвыполнили проверку, можете попробовать следующее:

git fetch origin
git reset --hard origin/master

Это в основном просто берет текущую ветвь и указывает ее на HEADудаленную ветку.

ПРЕДУПРЕЖДЕНИЕ : Как указано в комментариях, это отбросит ваши локальные изменения и перезапишет все, что находится в источнике .

Или вы можете использовать команды сантехники, чтобы сделать то же самое:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

РЕДАКТИРОВАТЬ: Я хотел бы вкратце объяснить, почему это работает.

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

Ветвь - это просто именованный указатель на заданный хеш. Вот пример:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Каждый из этих файлов содержит хэш, указывающий на фиксацию:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Все они предназначены для внутреннего механизма хранения git и работают независимо от рабочего каталога . Сделав следующее:

git reset --hard origin/master

git будет указывать текущую ветку на то же значение хэша, на которое указывает origin / master. Затем он принудительно изменяет рабочий каталог в соответствии с файловой структурой / содержимым этого хэша.

Чтобы увидеть это в работе, попробуйте следующее:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD
Тревор Норрис
источник
2
Из недавнего одобренного редактирования, добавляющего массивное предупреждение в начале, просто чтобы указать, что оно уже упоминалось: «Затем [git] принудительно изменяет рабочий каталог, чтобы он соответствовал структуре / содержимому файла в этом хэше». Но думаю, этого было недостаточно.
Тревор Норрис
5

Решено с помощью следующего набора команд:

git reset --hard
git pull --rebase
git rebase --skip
git pull

Хитрость заключается в том, чтобы перенастроить изменения ... У нас были некоторые проблемы с ребазом одного тривиального коммита, поэтому мы просто пропустили его, используя git rebase --skip (после копирования файлов).

Кристиан Стюарт
источник
3

Если у вас когда-нибудь возникнет эта проблема после запуска, git fetchа затем git не позволяет вам запускаться git pullиз-за конфликта слияния ( как измененные, так и не объединенные файлы , и, чтобы вас больше расстроить, он не покажет вам маркеры конфликта в файл, так как он еще не объединен). Если вы не хотите потерять свою работу, вы можете сделать следующее.

подготовить файл.

$ git add filename

затем спрячьте локальные изменения.

$ git stash

вытащите и обновите свой рабочий каталог

$ git pull

восстановить ваш локальный измененный файл (git автоматически объединит, если может, в противном случае разрешит его)

$ git stash pop

Надеюсь, это поможет.

Нимешка Сримал
источник
2

Есть решение, даже если вы не хотите удалять локальные изменения. Просто исправьте неслитые файлы (с помощью git addили git remove). Тогда сделай git pull.

Прити А.
источник
1

Предполагая, что вы хотите выбросить любые изменения, которые у вас есть, сначала проверьте вывод git status. Для любого файла, рядом с которым написано "unmerged", запустите git add <unmerged file>. Затем продолжайте с git reset --hard. Это избавит от любых локальных изменений, кроме неотслеживаемых файлов.

Райан Стюарт
источник
О верно. Он не может сказать «не объединенный». Также можно сказать «оба модифицированы» или, может быть, еще кое-что. Что на выходе git status?
Райан Стюарт,
После публикации я прошу члена команды попробовать, git rebase --abortи git pull --rebaseв соответствии с предложением git
Кристиан Стюарт,
1

Я решил с помощью git удалить не объединенный файл локально.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Когда я потом отправляю git commit:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Четабахана
источник
0

Ответ Райана Стюарта был почти готов. В случае, если вы на самом деле не хотите удалять свои локальные изменения, есть рабочий процесс, который вы можете использовать для слияния:

  • Беги git status. Это даст вам список не объединенных файлов.
  • Объедините их (вручную и т. Д.)
  • Бегать git commit

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

Затем Git считает слияние успешным и позволяет двигаться дальше.

nightblade9
источник