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

‍

相关推荐
OsDepK9 小时前
osgit纯图形化git版本管理工具,多人开发团队协作工具,支持Mac与Windows
git
Madison-No715 小时前
Git版本控制工具(一)
git
小小小米粒1 天前
重置本地git
大数据·git·elasticsearch
鶴哥只手遮天1 天前
第 8 章 工作区与检出:unpack-trees 与并行 checkout
git
xing-xing1 天前
git 相关命令总结
git
A-刘晨阳1 天前
GitLab + ArgoCD 实现 Kubernetes GitOps 自动化部署
运维·人工智能·git·kubernetes·自动化·云计算·argocd
ControlRookie2 天前
SyncBridge:一个 CODESYS 工程与 AI 之间工程师级的同步工具
git·ai编程·codesys·工业软件·controlrookie
鬼手点金2 天前
opencode-性能优化建议
java·人工智能·git·自动化·nanogpt
网络毒刘2 天前
开源 Aider 工作流实战:Git 提交驱动的 AI 结对,与 Cursor 何时互补
git·ai编程·cursor·aider
HRTOS2 天前
HRTOS 4.0 将长期维护:为什么版本号不再频繁变化
经验分享·git·单片机·51单片机