Как избежать коммитов слияния из Git pull при удалении

У меня есть репозиторий и некоторые локальные изменения, которые нужно зафиксировать. Перед фиксацией я перенес изменения на свой локальный компьютер с помощью Egit в Eclipse.

Он создает коммит слияния, и я отправляю свой коммит поверх него.

Теперь, когда я пытаюсь нажать на источник, это показывает, что он будет подталкивать мою фиксацию, а также объединить фиксацию. Но в идеале коммит слияния не должен быть частью удаленного репозитория.

Как этого избежать?


person jazz199    schedule 05.05.2015    source источник
comment
Здесь вы найдете много информации: atlassian.com/ git / tutorials / merging-vs-rebasing /   -  person Ryp    schedule 05.05.2015
comment
возможный дубликат рабочего процесса git и вопросы о перебазировании и слиянии   -  person raina77ow    schedule 05.05.2015


Ответы (6)


Используйте опцию rebase всякий раз, когда вы извлекаете из удаленного репозитория. Пожалуйста, следуйте инструкциям ниже,

  1. Зафиксируйте свои изменения - это создаст новую фиксацию в вашем локальном файле.
  2. А теперь сделай git pull --rebase <remote-name> <branch-name>.
  3. По сути, rebase удаляет ваши коммиты, которые вы зафиксировали в текущей ветке HEAD, как патч. Затем он применяет все удаленные коммиты поверх HEAD, а затем применяет ваши коммиты поверх него.
  4. Поэтому лучше всего фиксировать изменения, а затем извлекать удаленные фиксации с помощью параметра rebase.
person Mohanraj    schedule 05.05.2015
comment
Однако будьте осторожны, поскольку ваши коммиты больше не будут располагаться в хронологическом порядке. Вы эффективно переписали историю, и это может вызвать множество неприятных ошибок, если у вас нет очень хорошего тестового покрытия. Безопаснее использовать слияние. - person samthebest; 11.12.2018

Если у вас есть незафиксированные изменения, вы можете:

git stash
git pull --rebase <remote> <branch>
git stash apply
person Gayan Weerakutti    schedule 21.01.2018
comment
Могу ли я заменить вторую команду на git pull --rebase (см. эту ссылку. Какая будет разница? - person vineeshvs; 11.05.2020
comment
@vineeshvs, если вы извлекаете изменения из той же ветки, над которой работаете, вы можете просто git pull --rebase. В противном случае вы должны явно указать удаленное имя и имя ветки. - person Gayan Weerakutti; 13.05.2020
comment
Или лучше: git pull --rebase --autostash. - person FelipeC; 11.12.2020
comment
@FelipeC, ваш комментарий должен быть ответом, чтобы любой мог легко его увидеть, так здорово, спасибо, - person Thinh NV; 02.07.2021
comment
@ThinhNV Готово. Я добавил ответ, а также конфигурации, если вы всегда хотите это делать. - person FelipeC; 03.07.2021

Вы можете запустить

git config --global branch.autosetuprebase always

чтобы сделать git pull --rebase поведением по умолчанию для git pull.

person CodeKid    schedule 24.05.2018

Обычная стратегия - работать над веткой. Когда удаленный главный сервер изменится, потяните изменения на главный и вместо объединения перебазируйте ветку.

См. Git Rebase на сайте Atlassian.

person choroba    schedule 05.05.2015

Сценарий:

Предположим, в репозитории GIT повышен PR: с feature/my_bug_fix на release/project-007. Но GIT не разрешает слияние из-за конфликтов между указанными выше ветвями.

Тогда просто сделайте это

$ git checkout feature/my_bug_fix

$ git pull --rebase origin release/project-007

$ # resolve any conflicts encounter during the process

$ git rebase --continue

$ git push origin feature/my_bug_fix  --force

Это эффективный и чистый способ разрешить конфликтующие ветки. этим вы не получите тех коммитов слияния, которые в противном случае появляются, если вы используете git merge.

Более того:

pull          = fetch + merge

pull --rebase = fetch + rebase

Итак, выберите способ обращения с веткой.

Вам лучше знать разницу между слиянием и перебазированием :)

person James Bond    schedule 26.05.2021

Если вам не нужна фиксация слияния, лучший способ синхронизировать локальную ветвь с удаленной ветвью - выполнить перебазирование. Рекомендуется сначала сделать git fetch, а затем git rebase, однако, как уже упоминали другие, вы можете делать и то, и другое одновременно:

git pull --rebase --autostash

Если вы всегда это делаете, вы можете настроить git pull на автоматическое выполнение этого действия:

git config --global pull.rebase true
git config --global rebase.autostash true
person FelipeC    schedule 02.07.2021