github中fork分支和pullrequest的最佳实践
github中fork分支和pullrequest的最佳实践#
最近在参与一个国外的github开源项目,遇到自己fork了源库,一段时间之后,源库已经更新了一些内容,这样,自己fork的版本就落后于源库了。那怎么才能与源库保持同步呢?
youbute上一个教学视频讲得非常清楚:
https://www.youtube.com/watch?v=M7ZYkjOWr6g
我这里用文件记录一下,方便以后参阅和查找:
首先,假设有一个远程的repository:
https://github.com/ensime/ensime-server.git
- 我们需要在界面上,点击右上角的“Fork”,复制一个仓库到自己的github账号下。
- 然后,把自己账户下到远程仓库复制到本地:
git clone https://github.com/yangwen0228/ensime-server.git git remote add upstream https://github.com/ensime/ensime-server.git git remote -v
=>
origin https://github.com/yangwen0228/ensime-server.git (fetch) origin https://github.com/yangwen0228/ensime-server.git (push) upstream https://github.com/ensime/ensime-server.git (fetch) upstream https://github.com/ensime/ensime-server.git (push)
- pull request
毕竟,我们fork仓库就是需要做贡献。这时,我们就要做本地checkout一个新到分支,然后在新到分支里面做修改,保持fork到自己github仓库的主分支永远只用于与upstream的仓库进行同步,任何修改都只是在自己新开的临时分支中进行,进行pull request时也使用临时分支,这样当upstream中有冲突时,只需要使用本地主分支与upstream分支进行rebase同步。这样,本地的主分支永远与upstream的主分支是同步的。而此时,再把临时分支和本地主分支进行一个rebase同步,将conflict修改好,再push。
这个过程细化一下是这样的(我这里master主分支是2.0,一般情况下,默认是master):
- 检查当前的分支:
git branch
=>
* 2.0
- 创建一个新的临时分支:
git checkout -b dev git branch
=>
2.0 * dev
- 修改代码,修改完之后,需要把变化commit到这个分支里面
git status git add . git commit -m "#122: some changes."
- 将临时分支上传到github:
git push origin dev
- 在github上进行pull request
如果一切顺利,那么到这里,远程到maintainer接受了你的pull request。那么,只需要使用本地主分支与upstream分支进行rebase同步,然后删除本地的dev分支即可。
git push origin --delete dev # 删除github上的dev分支 git branch -D dev # 删除本地dev分支 git checkout 2.0 git pull --rebase upstream 2.0 git push
- 如果分支提交之后,远程upstream的分支进行了修改,这是最麻烦的。
git checkout 2.0 git pull --rebase upstream 2.0 git checkout dev git rebase 2.0
这时rebase后,有可能会有冲突,就需要手动把conflict修复掉。然后,
git add . git rebase --continue
- 再将从upstream同步后的内存更新到github上:
git push --force
由于github上的commit顺序与本地不同,如果直接push需要merge,那就整个乱了。所以,需要使用–force直接覆盖掉github的。
- 检查当前的分支:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端