首页 > 解决方案 > 为什么 git pull 似乎从另一个分支中提取更改

问题描述

我有一个正在工作的分支 - feature1。当我完成更改后,我想将它合并到一个发布分支 - release1。但是,自从我开始工作以来,release1 发生了变化,因此存在冲突。如果我还在 feature1 上执行 git pull,它会拉入尚未在 feature1 分支上进行的更改并合并它们。为什么?为什么从其他分支中提取和合并更改?是不是因为 feature1 基于 release1 并且因此引入了对 release1 的更改?

git checkout feature 1
{do some work}
git pull 
{changes are merged that were not made on feature1}

标签: gitgithub

解决方案


当你这样做时git pull,你正在从本地分支当前正在跟踪的任何分支中“拉取”提交。通常,您会使用与签出分支相同的名称来跟踪远程分支,但不一定。例如,如果您已feature1签出分支,通常您将跟踪origin/feature1. 听起来您的情况feature1可能是设置为跟踪origin/release1

您可以检查您的签出分支正在跟踪哪个远程分支git status。状态输出将包括您正在跟踪的分支,如果您正在跟踪一个分支,并且如果您没有跟踪任何分支,则不会提及它。您还可以使用命令查看每个本地分支正在跟踪的内容git branch -vv

确认当前分支跟踪错误分支后,可以通过运行以下命令更改跟踪分支:

git branch --set-upstream-to=origin/feature1

您的问题现在应该得到解决。

这怎么发生的?

您在评论中提到您使用以下命令创建了分支:

git checkout -b feature1 release1

如果你是正确的,那么我认为它不应该被跟踪origin/release1。但是,是否有可能您实际上使用了此命令(与之前相同,但现在包含单词origin):

git checkout -b feature1 origin/release1

在这种情况下,它会origin/release1默认跟踪!这实际上就是我的做法。我通常不会检查诸如main, master,之类的共享分支developrelease*因为我不需要它们;我只是使用他们的origin/*同行,所以我不必用本地副本让他们保持最新。当您想要更新分支时,这也使合并和变基更简单,因为您可以简单地执行以下操作:

git fetch
git rebase origin/release1 # or merge if you don't like rebasing for some reason

我通常每天这样做一次或多次以使用最新的更新我的分支,它使我能够尽早解决任何冲突。

当您使用 以这种方式创建分支时origin,最好也使用不跟踪远程的选项:

git checkout -b feature1 origin/release1 --no-track

这样您就不会意外跟踪您不打算跟踪的分支,因此推拉不会触及该分支。当您还没有跟踪分支时,您可以git push -u origin feature1在第一次推送时使用,或者在推送后,您可以使用以下命令设置跟踪分支:

git branch --set-upstream-to=origin/feature1

如果您绝对确定origin/release1在创建分支时没有使用,那么您可能会再次设置跟踪分支并且不小心使用了不正确的上游分支名称,可能是在第一次推送尝试时。


推荐阅读