Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/106153902


本地库(Git仓库)可以管理远程库(GitHub),一般地操作有pull, clone 和pull 操作,在实际协作开发项目是一般会有两种情况:

第一种是团队之间互相认识,共同开发项目。这样可以建立私人项目或者公开项目,然后邀请项目成员共同开发,这样其他人将看不到团队的项目。
例如:如下图所示,开发者A在GitHub上新建仓库,接着新建一个分支然后邀请团队成员开发者B在这个分支上提交代码。开发者B在本地库写好的项目代码推送到远程库的分支上,然后可以发送请求给开发者A,要求审核代码并合并分支,开发者A可以将代码拉取下来查看。如果觉得代码可以,那么直接合并代码即可,如果觉得代码不可以,要求开发者B进行修改知道合格为止。

第二种是开源的项目,全网都可以看到,任何开发者都可以对你的项目提出建议和修改,达到共同开发的目的。
例如:如下图所示,开发者A在GitHub上新建仓库,然后开发者C在GitHub上无意间看到了这个仓库,觉得挺好就Fork该仓库,于是开发者C就会出现该仓库。开发者C将这个仓库拉取(pull)本地库进行改进然后推送(push)到自己的远程库上,此时开发者A的仓库不会变化。
如果开发者C想要将自己的代码合并到开发者仓库中就要提出请求,然后开发者A进行审核,如果通过开发者A觉得可以就进行合并。

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


以上两种情况和GitHub协同开发基本类似,不同的是本地库和远程库之间需要进行拉取(pull)和推送(push)操作,pull和push操作也是本地库管理远程库的关键。下面就简单介绍本地库文件推送(push)到远程库、远程库文件拉取(pull)到本地库等基本操作。




1 本地库和远程库

本地库就是开发者将文件提交到Git仓库,此时Git仓库文件还在本地电脑。通过Git仓库可以管理GitHub远程仓库,例如Git仓库可以推送到GitHub仓库上,共享到社区,其他开发者可以看到这个仓库,然后可以提出Bug和改进建议达到共同开发的目的。


(1) 建立本地库

开发者A新建develop_A文件夹,然后通过git命令初始化,接着新建test_hello.cpp文件提交到本地库。如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作



(2) 建立远程库

开发者A在GitHub上新建一个项目(teamwork), 如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


如下图所示,复制teamwork仓库地址:https://github.com/luohuayouyi666/teamwork.git

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作




2 本地库管理远程库的基本操作

2.1 本地库推送(push)到远程库(GitHub)


本地库推送到远程库命令格式为:git push origin分支名


现在开发者A将本地库推送到GitHub仓库上, 由前面的操作可知,teamwork仓库的地址为:
https://github.com/luohuayouyi666/teamwork.git

由于地址太长不太好操作,可以用一个简单的名称(别名origin)代替复较长的地址,
起别名的命令为格式为:git remote add origin 远程库地址

例如:git remote add origin https://github.com/luohuayouyi666/teamwork.git 如下图所示,还可以通过命令:git remote -v 查看当前的别名 判断新名称(别名)是否更新成功。


Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


注意:
更改远程地址别名命令:git remote add origin GitHub仓库地址
删除本地指定的远程地址别名命令:git remote remove origin


例如使用命令:git push origin master 表示将本地库master分支下文件推送到远程库
执行命令后,如下图所示,推送报错,是因为远程库一个README.md文件在本地库没有,此时需要将远程库README.md拉取(pull)到本地库(更新),然后再推送到远程库。


Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


网上查询的解决办法,执行命令:git pull origin master --allow-unrelated-histories 结果如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


接下来将本地库推送到远程库,结果如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


此时刷新网页,查看GitHub仓库有没有更新文件,如下图所示,文件成功的从本地库提交到远程库。

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作



2.2 远程库克隆(clone)到本地库


远程库克隆(clone)到本地库命令格式为:git clone 远程仓库地址

任何开发者都可以将GitHub上的开源的项目克隆到本地仓库。例如,前面操作的远程仓库有了两个文件,如下图所示:


Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


下面新建文件夹test_clone文件夹,使用命令:git clone 远程仓库地址 将远程仓库文件下载下来,如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


远程库克隆到本地库的效果:

  1. 完整的把远程库下载到本地库;
  2. 初始化本地库;

2.3 远程库拉取(pull)到本地库


远程库拉取(pull)到本地库命令格式为: git pull origin master ,origin为远程库地址的别名。

将远程库文件更新到本地库,本地工作区文件将会更新,如果本地有和远程库同名的文件,将会强制更新本地库文件。

例如新建test_pull文件,新建123.txt文件,然后提交到本地库,如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


将远程库地址更改别名(git remote add origin 远程库地址),然后执行命令:git pull origin master

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


此时发现,pull失败,因为本地库有和远程库不相同的文件,此时可以通过命令:git pull origin master --allow-unrelated-histories 强制拉取(pull)

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


下面将本地库文件全部推送到远程库,命令为:git push origin master ,结果如下图所示

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


此时刷新网页,查看GitHub仓库中123.txt文件成功的从本地库提交到远程库,如下图所示:

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


假设在GitHub仓库中更改文件内容,此时本地库内容没有变,现在然后从将远程库拉取(pull)到本地库,看看会不会强制更新本地库文件内容。

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


由上图可以看出,远程库123.txt文件被修改,此时将远程库拉取到本地库,执行命令:git pull origin master ,结果如下图所示,本地库123.txt文件被更新了。

Git学习笔记(6): 本地库管理远程库(GitHub)——push, clone, pull操作


当然也可以通过命令: git fetch origin master 将远程库文件抓取到本地库缓存区,此时本地库和工作区文件并没有被合并,
通过命令:git checkout origin/master 切换到本地库缓存的分支上,然后通过命令: cat 文件名 来查看文件内容

接下来可以将缓存区分支文件和本地库文件进行合并,通过命令:git checkout master切换到本地库分支上,然后再将缓存区的分支合并到本地库:命令为:git merge origin/master

注: pull操作相当于 fetch + merge 操作。关于git pull命令和git fetch命令的区别可以参见博客

  1. git fetch和git pull之间的区别
  2. git pull 和 git fetch的区别?



3 团队协作开发和跨团队协作开发(开源项目)

团队协作开发和跨团队协作开发(开源项目)可以参考之前的博客:GitHub协作开发项目

其实重点是远程仓库和本地仓库之间的推送(push)操作和拉取(pull)操作,因为在这个过程中可能出现远程库文件和本地库文件不相同,这是需要自己去判断。具体的问题在实际操作中可能会遇到,等遇到了这些问题在更新自己的笔记。






参考资料

[1] https://www.bilibili.com/video/BV1pW411A7a5?p=36
[2] https://www.cnblogs.com/wbl001/p/11495110.html
[3] https://www.zhihu.com/question/38305012
[4] https://blog.csdn.net/a19881029/article/details/42245955
[5] https://blog.csdn.net/yangfengjueqi/article/details/82849826?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-8
[6] https://www.cnblogs.com/xiaocai-ios/p/7779741.html