сброс git в локальный заголовок фиксации; необходимо извлечь из источника с сохранением локальных изменений

#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), это более «компактный» способ сделать то же самое, но я обнаружил, что способ, описанный выше, в некотором роде проще для понимания людям, начинающим с перебазирования.