如何优雅的让fork后的仓库与原仓库同步

https://github.com/selfteaching/the-craft-of-selfteaching/issues/67

http://www.qtcn.org/bbs/simple/?t53628.html

最常见的问题,当你fork了一个仓库以后,原仓库的代码又被修改了,这时候能平台并不会帮你自动同步代码到你fork以后的仓库。这时候你提交代码,提交合并请求时的版本就和原仓库的不一致了。这时候有什么好的办法解决问题呢?

最简单粗暴地方法就是:

删除自己的仓库,重新fork一个仓库

事先把自己修改的代码保存好,然后删掉fork的仓库,接着重新fork一份原仓库,这时候再把fork的仓库克隆到本地,代码修改以后再提交。

这可是大招哦,不能一上来就用了。要在最后实在没办法的情况下使用,我们还有更加优雅的办法。另外说一下,如果原仓库已经整合了很多合并代码的请求,并且代码和你的相差很大的情况下,建议使用这种简单粗暴的方法,很省事。

接下来我们来讲一下优雅的方式是什么样子的,在此之前,你最好搞明白git pullgit merge的区别和联系。


更新代码并合并

  1. 进入本地仓库的目录
  2. 使用命令git remote -v查看远程仓库的地址,以及是否关联原代码仓库
D:\Project\study>git remote -v
origin  https://github.com/fxiaoyu97/Study-Log.git (fetch)
origin  https://github.com/fxiaoyu97/Study-Log.git (push)

如上所示,如果只关联了一个仓库地址,表示还没有关联原仓库地址,这时候我们需要设置一下,这个关联设置一次就好。

  1. 添加原仓库的关联:git remote add upstream https://github.com/selfteaching/the-craft-of-selfteaching.git ,这样就可以把原仓库设置为你的upstream仓库。命令执行后完全没有任何返回信息,我们可以执行命令git remote -v查看一下。
D:\Project\study>git remote -v
origin  https://github.com/fxiaoyu97/study.git (fetch)
origin  https://github.com/fxiaoyu97/study.git (push)
upstream  https://github.com/calos/study.git (fetch)
upstream  https://github.com/calos/study.git (push)
  1. 执行命令git status检查本地是否有未提交的修改,如果存在的话,先把未提交的修改从本地仓库推送到自己的远程仓库,最后再执行git status检查一下本地文件的状态。
git add -A
git commit -m "提交说明"
git push origin master
git status

注意:这一步可以避免出现文本冲突的情况,但是如果你本地仓库的修改不是很重要,建议还原的到未修改以前的样子。

  1. 获取原仓库的更新内容:git fetch upstream
D:\Project\study>git fetch upstream
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), 608 bytes | 26.00 KiB/s, done.
From https://github.com/fxiaoyu97/study
   44a5a2d..8da9cb5  master     -> upstream/master
  1. 切换到master分支:git checkout master
  2. 合并原仓库的内容到本地master分支:git merge upstream/master,如果遇到冲突就在本地解决冲突。
  3. 把本地仓库的内容推送到自己的仓库:git push

如果远程原仓库的历史commit被修改整理过,而自己在没有同步远程原仓库的情况下有新的PR需求请求,可以有两个方案处理:

  1. fork最新的远程仓库,重新提交。
    1. 备份自己的改动
    2. 删除自己的fork的仓库,重新fork远程原仓库
    3. 将最新改动的应用到新fork的仓库,然后提交PR
  2. 强制同步远程主仓库的所有提交,处理冲突,再次提交
    1. 备份自己的改动
    2. 添加远程远仓库为自己本地仓库的一个upstream,试用一下命令强制同步git fetch upstrem && git reset --hard upstrem/master && git clean -f -d
    3. 将自己的改动应用到强制同步过来的分支,如果使用的其他分支备份,可以使用rebase命令合并过来,如果有冲突,处理冲突
    4. 检查自己的commit是否正确合理,无问题则可重新提交PR

posted @ 2021-06-11 16:04  卡洛小豆  阅读(3638)  评论(0编辑  收藏  举报