1 前言
当本地仓库与远程仓库不在同一个commit上时,即本地仓库的提交历史与远程仓库的提交历史出现了分歧,但我们需要将本地分支merge到远程的主分支。这个情况是我们在团队协作共同开发一套代码时,经常遇到的问题。本文介绍我常用的操作步骤。
2 步骤
- 首先,你需要将远程仓库的最新提交拉取到本地,以便了解远程仓库的当前状态,这可以通过以下命令完成:
这个命令会将远程仓库(默认名为origin)的所有更新拉取到本地,但不会自动合并或修改你的当前工作目录和分支。git fetch origin
- 在拉取远程仓库的最新提交后,你可以使用git log或git diff等命令来比较本地分支与远程分支之间的差异,以便了解需要合并哪些更改。
使用git log查看提交历史:
这个命令将显示一个图形化的提交历史,包括所有分支的提交。git log --oneline --graph --decorate --all
或者使用git diff比较分支差异:
这个命令将比较本地master分支与远程origin/master分支之间的差异。git diff master origin/master
- 合并或变基
- 合并(Merge):合并是将远程分支的更改合并到当前分支中。这会在提交历史中创建一个新的“合并提交”(merge commit),表示两个分支的合并点。
git merge origin/master
- 变基(Rebase):变基是将一系列提交在当前分支上重新应用,就好像它们是在某个其他提交之后立即创建的一样。这可以使提交历史看起来更加线性和清晰。
变基过程中也可能出现冲突,同样需要手动解决。与合并不同的是,变基会改变本地分支的提交历史。git rebase origin/master
如果你之前使用了变基并且改变了本地分支的提交历史,推送可能会失败,因为远程仓库中可能已经有了基于旧提交历史的新提交。可能需要使用git push --force来强制推送你的更改。
- 解决冲突
合并冲突后,Git 会停止合并过程,并标记出冲突的文件。你可以通过 git status 查看哪些文件存在冲突。打开 Git 标记为冲突的文件。在冲突区域,你会看到 Git 插入的特殊标记,这些标记通常看起来像这样:
你需要手动编辑这些文件,决定如何合并这些更改。你可以保留当前分支的更改、合并分支的更改,或者将两者合并成新的内容。<<<<<<< HEAD 这是当前分支(HEAD)的内容 ======= 这是合并进来的分支的内容 >>>>>>> 合并分支的名称
- 推送更改到远程仓库
解决完冲突之后,需要git add和commit,然后push。
3 小结
在开发过程中,一般都是在分支上开发然后合并到主分支,合并过程会有各种方法做到,本章介绍自己在平时使用的一个流程步骤,大家也可在此基础上继续优化。