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

‍

相关推荐
不老刘16 小时前
Antigravity 的 New Worktree 模式:给 AI 代理一个安全的“平行工位”
人工智能·git·ai编程·antigravity
光谱SpectrAI16 小时前
Windows 也中招:Git Bash 和 Node 仍信任泄露的 eMudhra 证书
git
YIN_尹17 小时前
【git原理与使用】git初识与安装
大数据·git·elasticsearch
Leo_Mr21 小时前
Vue3 项目配置 Git 提交规范(企业通用方案:husky + commitlint + cz-git + lint-staged)
git
jyOverQ1 天前
Git rebase 和 merge 有什么区别?什么时候该用哪个?
git
晗夜未央1 天前
跨仓库 Skill 换台电脑就失效?用 Git remote 校验项目
人工智能·git·python
Lsetea1 天前
Git访问HTTPS证书不受信任:用URL级sslCAInfo限定私有CA范围
git·https·开发工具·ssl证书·ca证书
এ慕ོ冬℘゜2 天前
Git 基础入门|和 SVN 对比 + 四大区域 + 常用命令详解
git·svn
DevLoom_2 天前
macOS 命令行 curl/git 报 SSL 证书错误?eMudhra 事件完整修复指南
git·macos·ssl
keyipatience2 天前
Git学习(4)Git分布式优势与实战配置全解析
git·学习