网站首页 > 基础教程 正文
技术背景
在开源项目中,派生(Fork)仓库是常见的操作。当从原始仓库派生一个副本到自己的账户下后,原始仓库可能会持续更新。为了使自己派生的仓库与原始仓库保持同步,就需要进行更新或同步操作。
实现步骤
命令行方式
- 添加原始仓库为远程仓库:在本地克隆的派生仓库中,添加原始GitHub仓库作为“远程”仓库。
git remote add upstream https://github.com/whoever/whatever.git
- 获取上游仓库的所有分支:从上游仓库获取所有分支及其提交。
git fetch upstream
- 切换到主分支:确保当前在主分支上。
git checkout main
- 重写主分支:将自己的提交重放在上游主分支之上。
git rebase upstream/main
如果不想重写主分支的历史,可以使用git merge upstream/main。
- 强制推送(可选):如果进行了变基操作,首次推送到自己的派生仓库时可能需要强制推送。
git push -f origin main
GitHub网页界面方式
- 打开GitHub上的派生仓库。
- 点击“Pull Requests”。
- 点击“New Pull Request”。默认情况下,GitHub会比较原始仓库和派生仓库,如果没有更改则没有可比较的内容。
- 如果看到“switching the base”链接,点击它;否则,手动将“base fork”下拉菜单设置为自己的派生仓库,“head fork”设置为上游仓库。此时应该能看到所有最新更改。
- 点击“Create pull request”,并为拉取请求指定一个可预测的名称(例如Update from original)。
- 滚动到“Merge pull request”,但先不要点击。
GitHub CLI方式
使用gh repo sync子命令并提供派生仓库名称作为参数来更新远程派生仓库。
gh repo sync owner/cli-fork
如果上游仓库的更改导致冲突,GitHub CLI无法同步。可以设置-force标志来覆盖目标分支。
核心代码
命令行完整示例
# 添加远程仓库
git remote add upstream https://github.com/whoever/whatever.git
# 获取上游仓库分支
git fetch upstream
# 切换到主分支
git checkout main
# 重写主分支
git rebase upstream/main
# 强制推送(可选)
git push -f origin main
GitHub CLI示例
gh repo sync owner/cli-fork
最佳实践
- 定期同步:定期同步派生仓库,以保持与上游仓库的最新状态。
- 使用变基:如果希望拉取请求尽可能干净,建议使用git rebase而不是git merge。
- 处理冲突:在同步过程中,如果出现冲突,应仔细解决冲突并提交合并。
常见问题
- 提交历史混乱:使用GitHub网页界面同步可能会导致提交历史混乱。建议使用命令行方式。
- 强制推送问题:强制推送(git push -f)会覆盖远程仓库的历史,应谨慎使用。
- 冲突解决:当上游仓库的更改与本地更改冲突时,需要手动解决冲突。可以使用git status查看冲突文件,然后编辑文件并使用git add和git commit提交解决方案。
猜你喜欢
- 2025-06-13 iOS项目的持续集成与管理(ios项目的持续集成与管理是什么)
- 2025-06-13 Git常用操作总结(git各种操作)
- 2025-06-13 Git 从入门到放不下(git小白入门)
- 2025-06-13 Git 常用命令总结(git的常见命令)
- 2025-06-13 在游戏中学习git操作(二)(git 小游戏)
- 2025-06-13 Git Submodule子模块功能,你使用过吗?
- 2025-06-13 Git使用的奇技淫巧(git的使用超详细版教程)
- 2025-06-13 解决git中的detached问题(git checkout detach)
- 2025-06-13 新一代编程神器 Codex 登场,你的专属 AI 软件工程师来了!
- 2025-06-13 在游戏中学习git操作(六)(github游戏项目)
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- queryselectorall (63)
- location.search (79)
- bootstrap教程 (74)
- deletesql (62)
- linuxgzip (68)
- 字符串连接 (73)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)