序言
我们先说明几个概念:
-
原始库:项目原始repository
-
远程库:从原始库fork得到的成员远程库
-
本地库:git clone到本地目录下的库
-
工作区:即本地库对应的本地文件
-
暂存区:git add file将文件添加到暂存区,下图中index
-
版本库:即远程库,git commit -m “notes” file将文件从暂存区添加到版本库
注:代码的各工作区域详解 http://www.jianshu.com/p/898e766d22e1
各工作区域关系如下图所示:
- git fetch:将远程版本同步到本地版本,不会merge到本地副本(个人理解:这个副本就是工作区)
- git pull:远程库覆盖本地工作区(个人理解:同步远程库有而本地库和本地工作区没有的内容,原有内容不覆盖)
- 在实际使用中,git fetch更安全,因为在merge前,我们可以先查看更新情况,再决定是否要合并。
保持远程库与原始库的同步,以下是基本操作步骤
推荐参考:http://www.linuxdiyf.com/linux/23074.html
1. 配置原始库
- 进入从远程库clone下来的本地项目目录,查看自己的远程库路径
git remote -v
- 配置原始库的路径(最初的项目路径)
git remote add upstream 原始库url
//如果添加了不想要的路径,可通过命令删除:git remote remove <name>
- 再次查看远程库路径
git remote -v
2. 与原始库同步
2.1 方法1:推荐
- 同步原始库的信息到本地(此时已可以从本地访问原始库的master分支)
git remote update upstream
- 获取原始库对应分支
git fetch upstream
- 切换到远程库master分支(如果有其他开发分支的话)
git checkout master
- 原始库与远程库同步(本地库内容不会丢失)
git merge upstream/master
-
如果遇到merge冲突(自动合并失败,需要手动合并),按以下步骤解决
-
可先冲突文件逐个添加
-
或者查找冲突位置
- git diff
-
然后冲突解决
- 可参考http://blog.csdn.net/afeionepiece/article/details/45695411
-
最后再进行fetch和merge操作,会提示更新完成
- git fetch upstream
- git checkout master
- git merge upstream/master
-
-
本地库修改后可通过:git push推送本地库到远程库
git push origin master
2.2 方法2:不推荐
- 同步原始库的信息到本地
git remote update upstream
- 切换到远程master分支
git checkout master
- rebase衍合操作
git rebase upstream/master
- 推送本地库到远程库
git push origin master
方法2评价
- 方法2:
-
使用该方法有一个大前提:
- 如果本地库分支的commit已经提交到远程库中,就不要对该分支进行rebase衍合操作。
-
rebase操作可参考:
- rebase为何可能导致commit丢失:http://gitbook.liuhui998.com/4_2.html
-
rebase衍合的问题:
- 在进行衍合的时候,实际上抛弃了一些现存的提交对象而创造了一些类似但不同的新的提交对象。如果你把原来分支中的提交对象发布出去,并且其他人更新下载后在其基础上开展工作,而稍后你又用 git rebase 抛弃这些提交对象,把新的重演后的提交对象发布出去的话,你的合作者就不得不重新合并他们的工作,这样当你再次从他们那里获取内容时,提交历史就会变得一团糟。
-
rebase导致commit丢失如何解决
-
http://blog.csdn.net/w_xue/article/details/10975719
-
http://ju.outofmemory.cn/entry/149508
-
-
2017.07.08