Gitextensions: Окно разрешения конфликтов помечает локальные как их, а удаленные - как наши во время обычного слияния.

Созданный на 29 нояб. 2011  ·  13Комментарии  ·  Источник: gitextensions/gitextensions

Описание

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

Choose local (theirs)
Choose remote (ours)

Из того, что я понимаю о git, должно быть сказано:

Choose local (ours)
Choose remote (theirs)

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

Как воспроизвести

  1. Запустите локальное слияние, которое вызовет конфликт слияния.
  2. На вопрос, хотите ли вы разрешать конфликты, нажмите «Да».
  3. Выберите файл в окне конфликта и нажмите на нем правую кнопку мыши.

    Ожидаемый результат

Откроется меню, которое содержит, среди прочего, следующие записи:

Choose local (ours)
Choose remote (theirs)

Фактический результат

Откроется меню, которое содержит, среди прочего, следующие записи:

Choose local (theirs)
Choose remote (ours)

Самый полезный комментарий

Я согласен с dleinhaeuser, эти имена действительно расплывчаты.

Новички всегда не понимают, какую версию выбрать. Я помогаю своим друзьям с git, и большинство из них спрашивали меня, какой выбор правильный в этом окне.

Я не уверен, что у git есть один типичный рабочий процесс, потому что каждый использует его со своими предпочтениями. Например, когда я работаю над тематической веткой в ​​течение нескольких дней или недель, я предпочитаю время от времени объединять master в свою тематическую ветку, чтобы предотвратить ад слияния и как можно скорее разрешить конфликты. Это помогает поддерживать совместимую, готовую к слиянию базу кода, и это действительно полезно для длинных веток функций.

Я предлагаю просто написать настоящие имена веток и полагаться на то, что пользователь знает, какая ветка содержит фактический код.
Например, «выбрать нашего (главного)» и «выбрать их (feature-branch-42)» - гораздо более понятные названия.

Все 13 Комментарий

GitExtensions на самом деле правильный. См. Раздел слияния по этой ссылке: http://stackoverflow.com/questions/3051461/git-rebase-keeping-track-of-local-and-remote

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

Я согласен с dleinhaeuser, эти имена действительно расплывчаты.

Новички всегда не понимают, какую версию выбрать. Я помогаю своим друзьям с git, и большинство из них спрашивали меня, какой выбор правильный в этом окне.

Я не уверен, что у git есть один типичный рабочий процесс, потому что каждый использует его со своими предпочтениями. Например, когда я работаю над тематической веткой в ​​течение нескольких дней или недель, я предпочитаю время от времени объединять master в свою тематическую ветку, чтобы предотвратить ад слияния и как можно скорее разрешить конфликты. Это помогает поддерживать совместимую, готовую к слиянию базу кода, и это действительно полезно для длинных веток функций.

Я предлагаю просто написать настоящие имена веток и полагаться на то, что пользователь знает, какая ветка содержит фактический код.
Например, «выбрать нашего (главного)» и «выбрать их (feature-branch-42)» - гораздо более понятные названия.

да, это очень сбивает с толку. Наши и их действительно имеют значение в git-land: вы можете использовать их для изменения стратегии слияния, поэтому вы должны использовать их так же, как git. И да, было бы лучше всего упомянуть фактическое имя ветки, но я не уверен, поддерживает ли это kdiff.

Рассмотрим следующую последовательность команд:

> mkdir test && cd test
> git init
> touch test.txt
> git add test.txt
> git commit -m "..."
> git branch test
> git checkout test
> echo "test" >test.txt
> git commit -a -m "..."
> git checkout master
> echo "master" >test.txt
> git add -a -m "..."
> git merge test

На этом этапе будет конфликт слияния test.txt.
Если я сейчас открою git gui, он покажет конфликт в окне фиксации.
При щелчке правой кнопкой мыши в окне сравнения будет предложено «Использовать удаленную версию» и «Использовать локальную версию».

  • Если я выберу «Использовать локальную версию», содержимое test.txt будет «основным» после слияния.
  • Если я выберу «Использовать удаленную версию», содержимое test.txt будет «тестовым» после слияния.

Итак, согласно логике git gui, текущая ветвь является «локальной», а ветка, в которую я сливаю ее, - «удаленной».

Если я продолжу использовать командную строку вместо git gui для разрешения конфликта, я могу выполнить следующие команды:

> git checkout --ours test.txt
> cat test.txt
master
> git checkout --theirs test.txt
> cat test.txt
test

Итак, в интерфейсе командной строки «наш» относится к текущей ветке, а «их» - к той, с которой я сливаюсь.
Вот почему я думаю, что меню в Git Extensions дает противоречивую информацию.

Может быть, наши и их меняются местами, когда слияние выполняется по-разному. Если так, то я об этом не подозреваю.

Спасибо, в этом есть смысл. Фактически, когда вы запускаете kdiff для разрешения конфликта, текущая ветвь (--ours) называется .LOCAL. Итак, да, похоже, проблема с меню.

Хорошо. Видимо «наши» и «их» меняются местами при ребазе.

Может быть, git gui настроен таким образом, что «локальный» и «удаленный» имеют смысл для конфликта слияния во время операции извлечения?

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

Хмммммм, думаю, если вы выполните команду «pull --rebase» (которую я использую по умолчанию), то меню может быть правильным из-за переключения между нами и нами. Но да, это очень сбивает с толку и должно быть где-то задокументировано. Также локальный и удаленный
терминология очень запутанная, так как у нас уже есть локальные филиалы и удаленные репозитории.

Кстати, вы можете сделать это немного эффективнее:

mkdir test && cd test
git init
сенсорный test.txt
git добавить test.txt
git commit -m "..."
git checkout -b test *эхо "тест"> test.txtgit commit -am "..."
мастер проверки git
эхо "мастер"> test.txt
git commit -am "..." **
git merge test

Первоначальное объяснение проблемы, данное dleinhaeuser, является правильным.
Правильные слова должны быть

 Выбирайте местный (наш)
 Выберите пульт (их)

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

Rebase сложнее (я всегда смотрю на эту картинку, чтобы убедиться, что все делаю правильно, ха-ха). «Наши» и «их», на мой взгляд, неверны.
Скажем, вы хотите переставить «Branch A» на «Master».
Несмотря на то, что вы должны быть зарегистрированы в «Ветке A», чтобы переустановить ветвь A на Master, в конфликте слияния вы считаются находящимися в ветке Master (несите меня сюда ...) Считается, что вы находитесь в Master, потому что вы пытаетесь «воспроизвести» фиксацию ветки A ПОСЛЕ фиксации Master, так что это похоже на то, что вы находитесь в ветке Master и выполняете pull.

верно. Эта публикация довольно хорошо объясняет:

http://stackoverflow.com/questions/3051461/git-rebase-keeping-track-of-local-and-remote

Итак, local / remote должны быть нашими / их для слияния, а их / нашим - для перебазирования.

Это особенно сбивает с толку для конфликтов после извлечения, когда их явно далекие. Кто-нибудь планирует это исправить?

Хорошо, метки должны быть исправлены в приведенном выше коммите.
Нормальное слияние говорит

 Выбирайте местный (наш)
 Выберите пульт (их)

и перебазирование слияния остается неизменным, т.е.

 Выберите местный (их)
 Выбери пульт (наш)

Было бы намного легче понять, что происходит, если бы вместо LOCAL / REMOTE или OURS / THEIRS он просто отображал имена веток.

См. # 6582 для более позднего обсуждения

Была ли эта страница полезной?
0 / 5 - 0 рейтинги