fork的仓库怎么使用git rebase与git merge同步上游仓库的更新及解决冲突问题的总结

如果是fork的仓库需要同步上游仓库的更新

rebase 和 merge 都用于把上游代码合并到自己的分支,但方式不同:

  • merge(合并) :把两个分支直接合并,保留双方原来的提交历史,并生成一个新的合并提交(merge commit)。优点是历史真实完整,缺点是可能产生较多分叉。
  • rebase(变基) :把自己的提交暂时取下来,然后重新应用到上游最新代码之后,相当于把自己的修改"移动"到最新版本基础上。优点是提交历史更加线性、整洁,缺点是会改变提交历史,不适合修改已经共享的公共分支。
先把fork后拉到本地的代码添加上游仓库
yaml 复制代码
git remote add upstream https://github.com/A/project.git

(给 Git 保存一个地址,名字叫 upstream,这个地址指向原作者仓库。)

使用fetch命令查看上游发生的更新
cpp 复制代码
git fetch upstream
查看上游更新:
复制代码
git log master..upstream/master

查看有哪些提交:

复制代码
commit def5678
Author: xxx

修复登录问题

commit aaa111
Author: xxx

增加缓存功能
切换到自己的 master:
复制代码
git checkout master
使用rebase命令合并上游仓库master分支
lua 复制代码
git rebase upstream/master
rebase 时发生冲突

例如:

复制代码
CONFLICT (content): Merge conflict in src/UserService.java

说明:

你的修改:

复制代码
public void login(){

    //你的微信登录代码

}

上游修改:

复制代码
public void login(){

    //作者微信登录代码

}

Git 不知道应该保留谁。

查看冲突文件:
复制代码
git status

输出:

复制代码
Unmerged paths:

both modified:
    src/UserService.java

查看冲突内容

打开文件:
复制代码
public void login(){

<<<<<<< HEAD

    //作者最新代码

=======

    //你的代码

>>>>>>> your_commit

}

解释:

复制代码
<<<<<<< HEAD

到:

复制代码
=======

之间:

表示当前 rebase 基础代码(上游代码)


复制代码
=======

到:

复制代码
>>>>>>> your_commit

之间:

表示你的提交。


手动解决冲突

例如:

上游:

复制代码
public void login(){

    checkToken();

}

你的:

复制代码
public void login(){

    sendWechatMessage();

}
最终决定合并:
复制代码
public void login(){

    checkToken();

    sendWechatMessage();

}

然后删除:

复制代码
<<<<<<<
=======
>>>>>>>

这些标记。


标记冲突已经解决

例如:

复制代码
git add src/UserService.java

或者所有文件:

复制代码
git add .

继续 rebase

执行:

复制代码
git rebase --continue

如果还有冲突:

重复:

复制代码
git status

# 修改冲突文件

git add .

git rebase --continue

直到完成。

放弃本次 rebase

如果发现合并太复杂,不想继续:

复制代码
git rebase --abort

恢复到 rebase 前状态

rebase 完成后推送
复制代码
git push origin master

或者强制推送:

复制代码
git push origin master --force-with-lease

总结
lua 复制代码
1. 获取上游更新
git fetch upstream


 2. 切换自己的master
git checkout master


 3. 查看上游有哪些更新
git log master..upstream/master


 4. rebase同步
git rebase upstream/master


 5. 如果冲突

git status


 修改冲突文件


git add .


git rebase --continue


 如果放弃

git rebase --abort


 6. 推送自己的fork

git push origin master --force-with-lease
如果是merge
lua 复制代码
 1. 获取上游更新
git fetch upstream


 2. 切换自己的master
git checkout master


 3. 查看上游更新
git log master..upstream/master


 4. 合并上游master
git merge upstream/master


 5. 如果冲突

git status


 修改冲突文件


git add .


 完成merge提交

git commit (Git 会生成 merge commit。)


 如果放弃merge

git merge --abort


 6. 推送fork

git push origin master

相关推荐
小溪彼岸1 小时前
Git命令行可视化管理工具:lazygit
git
badhope2 小时前
入职第一天就把main分支搞崩了——我的Git血泪史和团队规范诞生记
git·devops
Eloudy4 小时前
git clone --mirror 完整迁移仓库的全流程
git
:-)19 小时前
开源项目二开 Git 规范工作流
git
阿米亚波1 天前
【C/C++包管理器】vcpkg(by microsoft)
c语言·c++·git·vscode·microsoft·github·vcpkg
苍煜1 天前
Git Worktree 多工作树实战教学-工作多分支实用教程
git
RainingTime1 天前
新版IDEA使用传统用户名、密码登录Git
git
DevangLic2 天前
【诡异的空文件夹 和 git:冲突合并】最新的尝试
git
舒一笑2 天前
Windows + WSL2 完整复现 Avernet WAIC 6 Bot 协作演示
人工智能·git·开源