Git объединить левые метки HEAD в моих файлах
Я попытался объединить файл в командной строке с помощью Git, когда появилось сообщение об ошибке, сообщающее, что слияние было прервано.
Я думал, что это конец, но потом я понял, что в моих файлах есть gitmarks. Например:
start =
expression
validchar =
[0-9a-zA-Z_?!+\[email protected]#$%^&*/.]
integer =
<<<<<<< HEAD
digits:[0-9]+
{ return digits.join(""); }
=======
sign:"-"* digits:[0-9]+
{ return sign + digits.join(""); }
>>>>>>> gh-pages
Файлы были отредактированы не мной, а отображаемые строки вставлены с помощью:
- Голова после меньше знаков (
<<<<<<< HEAD
)
- строки измененного кода
- строка знаков равенства (
=======
)
- новая версия кода
- другая строка, начинающаяся с знаков больше, чем имя и название ветки (
>>>>>>> gh-pages
)
Чем хуже то, что содержимое файла больше не в порядке. Кто-нибудь знает, как я верну эти файлы, и изменения, которые я сделал в ветки gh, объединены в главную ветвь?
Ответы
Ответ 1
Это маркеры конфликтов. Вы все еще в процессе слияния, но были некоторые части, которые 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(""); }
Ответ 2
Абсолютно начните с '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
Ответ 3
Все ответы правильные, но если вы хотите Autoremove все метки конфликтов и хотите автоматически менять файлы для хранения HEAD, тогда вы можете создать свой собственный bash script как: -
Пример Script:
# 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.
Ответ 4
В Atom у меня была проблема с тем, что некоторые файлы не сохраняли разрешенные конфликты слияния на диск, поэтому мне пришлось вручную нажимать "сохранить". Мне потребовалось некоторое время, чтобы понять.
Ответ 5
Я исхожу из этого вопроса. И я хотел какой-то автоматизированный метод объединения половинных файлов вместо ручного редактирования файлов (как это предлагалось в других ответах, что мне не очень удобно). Итак, вот что я в итоге сделал через netbeans, но можно сделать и через командную строку.
Теперь, имейте в виду, это работает, только если сразу после merge->add->commit
вы поняли, что все испортили, и хотите повторить процесс.
ШАГ 1: Сброс до предыдущего коммита.
git reset --hard a992a93f9312c6fa07c3a1b471c85e9fbf767d0e
ШАГ 2: Попробуйте объединить ветку
git merge --ff origin/feature/YOUR-Branch_here
На этом этапе вам будет предложено окно слияния, если вы используете графический интерфейс. и тогда вы можете продолжить как обычно.