git - 为什么 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}
解决方案
当你这样做时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
,之类的共享分支develop
,release*
因为我不需要它们;我只是使用他们的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
在创建分支时没有使用,那么您可能会再次设置跟踪分支并且不小心使用了不正确的上游分支名称,可能是在第一次推送尝试时。
推荐阅读
- javascript - 无法访问模板 Ref 内的索引值
- java - 为什么序列化/反序列化几何类型时杰克逊 JSON 映射异常
- javascript - 如何制作一种将项目推送到带有点亮元素的空数组的方法
- ruby-on-rails - Rails 6 with ancestry gem:显示整个树,从根到最后一个子类别
- react-router-v4 - React Router V4 从 url 恢复导航状态
- ruby-on-rails - Sidekiq - 获取另一个工作人员所做的数据库更改
- c# - C# MVC 禁用将控制器方法名称绑定到模型的 Action 属性
- javascript - javascripts是否可以有带有ID的hrefs?
- json - For 循环仅返回第一个 json 对象 Flutter
- python - 在链接比较运算符python中分离表达式