Git merge оставил метки HEAD в моих файлах


103

Я попытался объединить файл в командной строке с помощью Git, когда появилось сообщение об ошибке, в котором говорилось, что объединение было прервано.

Я думал, что это конец, но потом понял, что в моих файлах есть gitmark. Вот так:

start =
    expression

validchar = 
    [0-9a-zA-Z_?!+\-=@#$%^&*/.]

integer = 
<<<<<<< HEAD
    digits:[0-9]+
        { return digits.join(""); }
=======
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages

Файлы отредактированы не мной, и в них есть строки, в которые вставлены:

  • ГОЛОВА после знаков "меньше чем" ( <<<<<<< HEAD)
  • строки измененного кода
  • строка знаков равенства ( =======)
  • новая версия кода
  • другая строка, начинающаяся со знаков "больше чем" и имя ветки ( >>>>>>> gh-pages)

Что еще хуже, содержимое файла уже не в порядке. Кто-нибудь знает, как мне вернуть эти файлы в нормальное состояние, а изменения, которые я внес в ветку gh, объединить с основной веткой?

Ответы:


97

Это маркеры конфликта . Вы все еще в процессе объединения, но были некоторые части, которые Git не мог объединить автоматически. Вам нужно будет вручную отредактировать эти части так, как вы хотите, а затем зафиксировать результаты.


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

integer = 
<<<<<<< HEAD                                  <-+ remove the bits here
    digits:[0-9]+                               |
        { return digits.join(""); }             |
=======                                       <-+
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }
>>>>>>> gh-pages                              <-- and this

и таким образом вы сохраните файл как ...

integer = 
    sign:"-"* digits:[0-9]+
        { return sign + digits.join(""); }

4
@lowerkey Точно так, как вы хотите, чтобы конечный результат слияния выглядел. Я предполагаю, что вам действительно нужна часть в gh-pagesверсии, поэтому вы просто удалите материал из <<<<<<в, ======а также удалите одну >>>>>>строку, оставив две строки фактического кода между =======и >>>>>>.
Эмбер

Спасибо, я думаю, что у меня это получается. Удалите все от головы до ======, а затем удалите оставшиеся метки HEAD.
lowerkey

1
Ага, это правильно. (Здесь нет настоящего «отдыха», о котором нужно заботиться - вы просто фиксируете результаты слияния, что Git обычно делал бы автоматически, если бы не было конфликтов.)
Янтарь

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

1
Как это смешно. Вы указываете на ответ на вопрос, который помечен как дубликат этого вопроса, хотя ответ на этот вопрос можно найти в другом вопросе.
t3chb0t

23

Обязательно начните с git status, чтобы увидеть, что у вас есть. Если вы прервали слияние (или слияние было прервано) и у вас есть конфликтующие файлы в рабочем каталоге, что-то пошло не так. Статус Git сообщит вам, где вы находитесь. После этого у вас есть несколько вариантов. Вы должны разрешить фиксацию слияния вручную, что может быть сложно, или с помощью такого инструмента, как:

git mergetool

Инструмент слияния будет работать, если ваши файлы указаны как нуждающиеся в слиянии.

Вы также можете выполнить одно из следующих действий:

git checkout --ours -- /path/to/conflicted-file       # this is probably the one you want
git checkout --theirs -- /path/to/conflicted-file

Вы можете увидеть разные версии, используя синтаксис: 1: filename. См. Здесь объяснение. Но все вышесказанное предполагает, что «git status» показывает, что файлы нуждаются в слиянии.

Наконец, у вас всегда есть возможность:

git reset --hard   # sounds like --hard is what you need but check other options

7
Я абсолютно хотел бы git statusподдержать совет «начни с того, чтобы увидеть, что у тебя есть»: в некоторых кругах модно обвинять Git в его воображаемой сложности, но на самом деле внимательного прочтения вывода git statusдостаточно, чтобы понять, что делать дальше. в самых распространенных ситуациях. Значит, действительно: если что не так, остановитесь, прочтите git status, подумайте.
kostix

5

Все ответы верны, но если вы хотите автоматически удалить все знаки конфликта и хотите автоматически менять файлы, чтобы сохранить HEAD, вы можете создать свой собственный сценарий bash, например: -

Пример сценария:

# vim /usr/sbin/solve.git

(Добавить после)

#!/bin/bash
for f in $(grep -Rl '^>>>>>>> ' --include="*.php" --include="*.css" --include="*.js" --include="*.html" --include="*.svg" --include="*.txt" .)
do
sed -i -e '/^=======/,/^>>>>>>> /d' -e '/^<<<<<<< /d' $f
sed -i -e '/^>>>>>>> /d' $f
echo "$f Fixed"
done
git add . ; git commit -am "[+] Resolved on `date` from `hostname` by `whoami`" --no-verify

# chmod 755 /usr/sbin/solve.git

и просто запустите его в своем репозитории / пути GIT, чтобы решить:

$ cd <path_to_repo>
$ solve.git

Примечание: - Вышеупомянутые расширения файлов: php, css, js, html, svg и txt.


0

В Atom у меня была проблема, что некоторые файлы не сохраняли разрешенные конфликты слияния на диск, поэтому мне пришлось вручную нажать «Сохранить». Мне потребовалось некоторое время, чтобы понять.


0

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

Имейте в виду, что это работает только в том случае, если сразу после этого merge->add->commitвы поняли, что напортачили, и хотите повторить процесс заново.

ШАГ 1: Вернитесь к предыдущей фиксации.

git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e

ШАГ 2. Повторите попытку слияния ветки

git merge --ff origin/feature/YOUR-Branch_here

На этом этапе вам будет предложено окно слияния, если вы используете графический интерфейс. и вы можете продолжить как обычно.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.