Злиття ліворуч GIT в моїх файлах


101

Я намагався об'єднати файл у командному рядку за допомогою Git, коли з’явилося повідомлення про помилку, яке говорить про те, що злиття перервано.

Я думав, що це було кінцем, але тоді я зрозумів, що в моїх файлах є гітмарк. Так:

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-гілці, об'єдналися в головну гілку?

Відповіді:


96

Це маркери конфлікту . Ви все ще перебуваєте в процесі злиття, але були деякі частини, які 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 позначки.
нижня клавіша

1
Так, це правильно. (Немає справжнього "відпочинку", про який потрібно подбати - ви просто здійснюєте результати злиття, які Git зазвичай робив автоматично, якби не було конфліктів.)
Амбер

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

1
Як це смішно. Ви вказуєте на відповідь на запитання, яке позначається як дублікат цього, хоча відповідь на це питання можна знайти в іншому питанні.
t3chb0t

22

Абсолютно почніть зі статусу git, щоб побачити, що у вас є. Якщо ви перервали злиття (або злиття перервано), і у вас є конфліктні файли в робочому каталозі, то щось пішло не так. Статус 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: ім'я файлу. Дивіться тут для пояснення. Але все вищесказане передбачає, що "git status" показує, що файли потребують об'єднання.

Нарешті, у вас завжди є можливість:

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

6
Я б абсолютно хотів би скористатися git statusпорадою "почніть з того, щоб побачити, що у вас є": в деяких колах досить доречно звинувачувати Гіта в уявній складності, але насправді уважного читання результатів git statusдостатньо, щоб зрозуміти, що робити далі у більшості поширених ситуацій. Отже, справді: якщо щось піде не так, зупиніться, прочитайте git status, подумайте.
kostix

4

Усі відповіді вірні, але якщо ви хочете Автоматизувати всі конфліктні позначки і хочете змінити файли, щоб зберегти 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 у мене виникла проблема, що деякі файли не зберігають вирішені конфлікти злиття на диску, тому мені довелося вручну натиснути «save». Мені знадобилося досить багато часу, щоб розібратися.


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.