#git #git-branch #git-merge #git-pull #git-fetch
#git #git-branch #git-слияние #git-pull #git-fetch
Вопрос:
У меня есть локальный feature/branch
. Когда я извлекаю из remote/origin
, это отменяет мои локальные изменения, хотя обычно это приводит к конфликтам из-за слияния…. Как мне настроить локальную ветвь git, чтобы я получал отчет о конфликте при объединении удаленной ветви и мог разрешить эти конфликты?
Обновить:
используя git branch -vv
, я вижу, что ветвь была объединена с remote branch origin/master
и имеет идентификатор запроса на извлечение. Многие изменения были внесены сверху, и часть работы над текущим feature/branch
, а некоторые изменения были перезаписаны. Я переместил feature/branch
обратно в предыдущий коммит, прежде чем его изменения были перезаписаны.
Я могу видеть изменения в git diff master
, но я хотел бы иметь возможность видеть конфликты и разрешать их в vscode, а не прокручивать вывод терминала git diff master
.
могу ли я отсоединить local feature/branch
от remote feature/branch
, чтобы git улавливал конфликты на git pull origin master
?
Комментарии:
1. какую команду вы запускаете, чтобы извлечь?
Ответ №1:
Другой способ получить последние изменения с удаленного — сначала git fetch
это внесет изменения в вашу локальную систему. Затем проверьте, что использовались изменения git diff
, и если вы хотите включить эти изменения И сохранить свои изменения тоже, используйте это:
git stash -u # u flag is used to include untracked files
git rebase
git stash apply
Ответ №2:
Я предполагаю, что есть локальный «мастер», который настроен на «работу против» удаленного источника, и есть одна локальная ветвь под названием feature/branch
, созданная из master, у которой нет аналога remove. Чтобы проверить это (своего рода начальная проверка, напрямую не связанная с ответом), используйте:
git branch -vv
Вы должны увидеть, что у вашей локальной master
ветви есть аналог удаленной ветви origin/master
(указан в квадратных скобках), в то время как feature/branch
у нее нет удаленной ветви.
Теперь с точки зрения решения:
Вы можете вообще избежать слияний. Предполагая, что ваша текущая ветвь feature/branch
:
# get the information about the latest changes from "origin".
# This doesn't change your local filesystem, so you can run it as often as you with
git fetch origin
# make sure you don't have any uncommitted changes. If you do, stash them or commit if you need, Fo the sake of example, I assume you did three (3) local commits with ids (as if its a sha1) 'a', 'b' and 'c'.
git status
# now when you know that there are no commits and the status is empty, you can:
git rebase origin/master
Последняя команда принимает коммиты, которые произошли в источнике / главном (предположим, это коммиты ‘x’, ‘y’ и ‘z’) и выполняет перебазирование:
feature/branch
Будет выглядеть:
'commont-parent-commit` --> 'x' --> 'y' --> 'z' --> 'a*' --> 'b*' --> 'c*'
Здесь a*
«логически» тот же коммит, что и a
, но с другим sha1.
Как вы видите, здесь вообще нет коммитов слияния.
Если были конфликты, вам придется разрешить их во время этого процесса, а затем ввести git rebase --continue
Обратите внимание, есть также команда git pull --rebase
, которую вы также можете использовать (ее выборка перебазирование вместо хорошо известной формулы pull = fetch merge), это более «компактный» способ сделать то же самое, но я обнаружил, что способ, описанный выше, в некотором роде проще для понимания людям, начинающим с перебазирования.