Git新手疑问:第二次rebase为何引发冲突?fetch是否拉取特性分支?
咱们先一步步拆解你遇到的问题,搞清楚为啥两次 rebase 结果截然不同:
第一次 git rebase origin/develop 为啥显示「up to date」?
当你第一次运行这条命令时,你的本地仓库里,origin/develop 这个远程跟踪分支的指针还是旧版本(和你上次 fetch/pull 后的状态一致),而你的 feature/featurename 分支已经基于这个旧的 origin/develop 完成了提交,所以 Git 判断没有新内容需要重新应用,就提示你分支已经是最新状态了。
git fetch 到底做了啥?
你运行 git fetch 后,输出里的这行是核心信息:
df825005..000000cf develop -> origin/develop
这说明远程仓库的 develop 分支有了新提交,Git 把这些新内容拉取到本地,并更新了 origin/develop 这个远程跟踪分支的指针——现在它已经指向远程 develop 的最新版本了。
顺便解答你的疑问:git fetch 默认会拉取远程仓库(这里是 origin)的所有分支更新,但它只会同步到本地的「远程跟踪分支」(比如 origin/develop、origin/feature/你的分支名),不会修改你正在工作的本地分支(比如当前的 feature/featurename)。所以如果你的 VSTS 里有对应的远程 feature 分支,fetch 确实会拉取它的更新,但只是同步到 origin/feature/featurename,不会影响你当前的工作分支。
第二次 rebase 为啥出现冲突?
当你再次运行 git rebase origin/develop 时,Git 需要把你的 feature/featurename 分支上的所有提交,重新应用到最新版的 origin/develop 分支之上。这时候冲突就出现了:远程 develop 的新修改和你的 feature 分支里的子模块 br/br 产生了矛盾——大概率是远程 develop 更新了这个子模块的版本,而你在 feature 分支里也修改了该子模块的引用,两者无法自动合并,就触发了 CONFLICT (submodule) 提示。
解决这个冲突的话,你需要手动处理子模块版本:进入 br/br 子模块目录,切换到合适的 commit,回到主仓库后添加修改后的子模块路径,再运行 git rebase --continue 就能完成整个 rebase 流程了。
内容的提问来源于stack exchange,提问作者Programmer

