为什么学习git
在科研的道路上我们会不可避免的接触到GitHub并会对它产生依赖。虽然说“代码搬运工”这个词并不好听,但是我仍觉得在GitHub上找寻开源的代码并在其基础上改进,对我们的科研进度会有大大的提升,所以我始终觉得这是个利大于弊的事。
但是Git的作用并不只是让大家分享自己的代码,它还是一个非常强力版本控制器。最近在用Latex撰写论文的时候,老师就让我用git来share我的latex文档。一开始我觉得这相当麻烦,明明有更方便的overleaf可以使用,完全没必要使用git,但是没办法,老师的话我哪敢不听。另一方面,之前在git上一直只使用过几个简单的命令,比如git clone之类的,更多的是直接在网页上点击按钮,学习使用git其实也是我一直想做但是懒得做的事情。
这篇文章也是为了记录、分享一下自己学习git的历程,希望大家不吝指教。
如果这篇文章有帮到你,可以收藏、关注、帮我点一下我的github的star
什么是Git
GitHub是一个基于git的代码托管平台,Git是目前世界上最先进的分布式版本控制系统。
要学习使用git,我们需要首先了解git的基本结构(参考——木子曰——史上最简单Git入门教程):
Workspace:工作区
Index / Stage:暂存区
Repository:仓库区(或本地仓库)
Remote:远程仓库
我的理解(可能不准确):
Remote理解为GitHub中托管的代码仓库
Repository和Index都可以理解为本地仓库,它们都保存在一个隐藏文件夹.git
中
workspace就是我们电脑直接可见的本地目录
简单、常用的Git命令
从github下载代码的操作流程:
如果我们需要下载他人的开源代码,可以直接复制Clone or download
中的url
,然后通过git clone url
下载。对于我们自己的代码,如果我们需要下载其他contributor贡献的代码,我们可以通过git pull
更新我们的代码。
上传代码至github的操作流程:
如果已有本地已有一个git clone
得到的Repository,可以直接在对应的目录下,进行下面的操作:
1.通常在上传代码之前,我们需要先使用git pull
确保他人的工作不会被我们覆盖。
2.我们平时本地的改动也就是workspace的改动,通过git add
命令可以把本地改动存到Index中
3.通过git commit -m "write some comment"
命令可以把本地改动提交到Repository中
4.最后我们就可以通过git push
来更新我们在Remote中的代码。
如果没有Repository:
1.通常我们可以在Github的网站上创建一个空的Repository,再通过git clone url
把这个仓库克隆下来,然后把我们的代码复制到这个目录。再执行上述流程。
2.或者,我们可以通过git init
来新建一个仓库,然后在Github的上创建一个空的Repository,通过git remote add origin url
命令来将本地仓库与远程仓库Remote联系起来。再执行上述流程。
分支、合并、处理冲突
但是通常我们在多人合作的时候,不会直接用上述的流程:
比如A同学和B同学为了实现不同的功能,都在main.cpp中修改了代码,A同学先修改完代码,并上传了代码到Remote。过了一会儿B同学也改完了代码,git add
和git commit
不会受到影响,但是git push
的时候就会提示冲突。
我们通常会使用git branch
来解决这种多人合作容易出现的问题,这会使得我们的工作更加有条理。即A同学通过git branch A
创建一个A
分支,B同学通过git branch B
创建一个B
分支,两人在不同的分支同时进行改进,修改完成后再把两个分支合并到master
分支上。
一个简单的在新分支工作的流程:
# 创建新分支
git branch new_branch
git checkout new_branch
# woring....
working on new_branch......
# woring....
# 提交新分支上的代码
git add .
git commit -m "new_branch done"
# 把new_branch合并到master
git checkout master
git merge new_branch
有时候,在多人合作的时候我们会遇到冲突,git无法执行快速合并(上述操作流程就是一个快速合并),此时我们只需要手动解决冲突即可:(此处参考廖雪峰,可点击链接查看更完整的解释)
1.通过git status
可以查看冲突的文件
2.查看冲突的文件,git会用<<<<<<<
,=======
,>>>>>>>
标记出不同分支上的内容,方便我们查看。选择需要保留的代码,然后通过git add
和git commit
重新提交即可。
查看修改
另外我们经常使用git diff
命令来查看修改。
1.git diff
比较的是工作目录(Working tree)和暂存区域快照(index)之间的差异。
2.git diff --staged
查看已经暂存起来的文件(staged)和上次提交时的快照之间(HEAD)的差异
3.git diff HEAD
·比较工作区与最新本地版本库的差异
4.git diff dev origin/dev
比较本地分支dev
和远程仓库的dev
仓库的差异
更多git diff
命令可以查看https://www.cnblogs.com/opensmarty/p/11044706.html
Pull Request
Pull Request 是什么?Pull Request 是一种通知机制。你修改了他人的代码,将你的修改通知原来的作者,希望他合并你的修改,这就是 Pull Request,本文将简称为PR。
在接触PR之前,我和别人交流代码都是通过截图的方法,然后把图片发到微信或者QQ,这样会使得聊天记录非常杂乱,他人很难高效的进行回复,而且很难再次找到这个截图。
PR非常适合contributors之间进行代码,使用也相对简单:
比如我们新建了一个分支,并且完成了相应的修改。我们希望把自己的修改合并到master分支上,就可以在新分支上点击按钮New pull request
,这样就可以发起一个PR。
然后我们将
base
选为我们希望合并的分支(通常是master
),compare
选择为我们的新分支new_branch
,就可以完成create pull request
。创建好一个PR后,所有在new_branch
上的修改,都可以被看到,别人能够高效的对你的代码进行评论,你也可以高效的回复。
下图是PR的界面,比如我改了part/methodology.tex中的两行代码,就会在网页中显示diff,并且别人可以直接在改动处进行评论,帮助检查代码: