如何更新或同步GitHub上的分叉仓库
技术背景
在开源项目的开发过程中,fork是一个常见的操作。当你fork了一个项目后,原项目可能会继续有新的提交。为了使自己的分叉仓库与原仓库保持同步,就需要进行更新或同步操作。这可以让你获取原仓库的最新代码,同时保留自己的修改。
实现步骤
方法一:使用命令行
- 添加远程仓库:在本地克隆的分叉仓库中,将原GitHub仓库添加为“远程仓库”。
1
| git remote add upstream https://github.com/whoever/whatever.git
|
- 获取远程分支:从上游仓库获取所有分支及其提交。
- 切换到主分支:确保你在主分支上。
- 合并或变基:
- 变基:如果你想让自己的提交在最新的上游提交之后,可以使用变基。
1
| git rebase upstream/main
|
- **合并**:如果你不想重写主分支的历史(例如,其他人可能已经克隆了你的仓库),可以使用合并。
- 推送到远程仓库:如果使用了变基,可能需要强制推送。
方法二:使用GitHub网页界面
- 打开你的分叉仓库。
- 点击“Pull Requests”。
- 点击“New Pull Request”。默认情况下,GitHub会比较原仓库和你的分叉仓库,如果没有做任何更改,应该没有可比较的内容。
- 如果看到“switching the base”链接,点击它;否则,手动将“base fork”下拉列表设置为你的分叉仓库,将“head fork”设置为上游仓库。现在GitHub会比较你的分叉仓库和原仓库,你应该能看到所有最新的更改。
- 创建拉取请求,并为拉取请求指定一个可预测的名称(例如,“Update from original”)。
- 滚动到“Merge pull request”,但先不要点击任何东西。
- 你有三个选项,但每个选项都会导致不太干净的提交历史:
- 默认选项将创建一个丑陋的合并提交。
- 如果你点击下拉列表并选择“Squash and merge”,所有中间提交将被压缩为一个。这通常不是你想要的。
- 如果你点击“Rebase and merge”,所有提交将与你一起进行,原始的拉取请求将链接到你的拉取请求,GitHub将显示“此分支比 <原始分叉> 领先X个提交,落后Y个提交”。
方法三:使用GitHub CLI
1
| gh repo sync owner/cli-fork
|
如果上游仓库的更改导致冲突,GitHub CLI无法同步。你可以设置-force
标志来覆盖目标分支。
核心代码
命令行同步代码示例
1 2 3 4 5 6 7 8 9 10
| 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同步代码示例
1
| gh repo sync owner/cli-fork
|
最佳实践
- 使用变基:为了使拉取请求尽可能干净,最好使用变基而不是合并。
- 使用单独的分支:避免直接在主分支上工作,而是在单独的分支上进行开发,这样可以保持主分支的干净,便于未来的合并。
- 定期同步:定期同步分叉仓库,以避免积累过多的更改,减少冲突的可能性。
常见问题
1. 为什么需要告诉Git原GitHub仓库的信息?
Git是一个分布式版本控制系统,与GitHub没有直接关联。当你在GitHub上创建分叉仓库并克隆它时,GitHub知道该仓库是一个分叉,但Git并不知情。因此,需要手动添加远程仓库信息。
2. 使用GitHub网页界面同步会导致提交历史混乱,如何解决?
建议使用命令行进行同步,因为命令行可以更好地控制提交历史,避免不必要的合并提交。
3. 同步后,GitHub上的分叉仓库仍然显示“落后X个提交”,怎么办?
同步操作只会更新本地仓库的副本,要更新GitHub上的分叉仓库,需要将本地的更改推送到GitHub。