2016-12-20 2 views
3

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

  • исправить конфликты
  • добавить
  • Вдавите

Это кажется довольно простым. Но что, если я что-то пропущу и не исправлю? Предоставляет ли Git возможность проверить, есть ли что-то еще, чтобы быть исправленным, кроме использования mergetool?

+1

Что вы подразумеваете под фиксированным? Вы имеете в виду, что, если есть еще конфликты? Если вы можете завершить слияние, конфликты должны быть разрешены. – dave

+0

После того, как вы «добавили» и «совершили» слияние, вы говорите Git, что изменений больше не нужно. Если вы что-то пропустите, тогда это ваша проблема. Исправьте его и повторите попытку или «-amend» ваше слияние. –

+1

Возможный дубликат [Как разрешить конфликты слияния в Git?] (Http://stackoverflow.com/questions/161813/how-to-resolve-merge-conflicts-in-git) –

ответ

2

Do:

git diff -S "<<<<<<< HEAD" -S "=======" -S ">>>>>>> $(git name-rev --name-only MERGE_HEAD)" HEAD 

Это сравнивает содержимое worktree с HEAD, но показывает только любой выход, если один или более из трех типов слияния меток включена в изменение.

Например, если вы объединяете из филиала называется develop, неслитая файл может выглядеть следующим образом:

public void fooTheBar(Bar input) { 
<<<<<<< HEAD 
    if (input == null) { 
    throw new Exception("input cannot be null!"); 
    } 
======= 
    Console.WriteLine("preparing to foo the bar"); 
>>>>>>> develop 
    input.foo(); 
} 

Таким образом, чтобы гарантировать, что все файлы были объединены, то нужно искать какой-либо из следующих три линии:

<<<<<<< HEAD 
======= 
>>>>>>> develop 

И это то, что -S аргументы в команде сделать.Так как это не всегда будет develop, мы используем команду:

git name-rev --name-only MERGE_HEAD 

, чтобы получить имя ветви, вы переходящая в текущую ветку.

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

Так как команда сравнивает рабочую строку с HEAD, а не только с поэтапными изменениями, это будет работать, даже если у вас есть git add файл, который все еще содержит конфликты.

+0

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

+1

Этот трюк 'git name-rev' довольно умный! Одна из незначительных проблем, если вы используете 'git checkout -m' для повторного создания конфликтов слияния, он, как правило, теряет оригинальные символические имена, особенно во время зависания вишней. Возможно, было бы безопаснее просто искать маркерные шевроны (хотя даже они настраиваются). – torek

0

Я думаю, что вопрос намекает на то, как разработчик знает, когда все ручные слияния были закончены? Например, вы можете запустить простое слияние как так:

git checkout master 
git merge dev 

и тогда вы получите:

CONFLICT blah blah 
CONFLICT blah blah 
CONFLICT blah blah 

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

то, что я делаю, это решить все руководство сливается, что я могу найти, а затем я глобальный поиск и «>>>>>» последовательность символов «< < < < <» в кодовом. Кажется, я работал в прошлом в прекрасном состоянии. Если у вас нет какой-либо из этих строк символов, то очень вероятно, что вы позаботились обо всех ручных слияниях, которые нужно заботиться. До тех пор, пока вы не используете -Xtheirs и опций git merge, то это довольно безопасная ставка, что вы успешно скомпилировали код на своих условиях.

0

Прежде чем добавлять файл, убедитесь, что вы не можете найти «====» внутри вашего файла. Вы можете легко достигнуть этого в командной строке с Vim:

vim yourFile 
/==== 
Enter 

Если вы не нашли ничего, то вы хорошо, чтобы добавить его!

Надеется, что это помогает

Смежные вопросы