Part1 Git和GitHub
整个课程的内容比较丰富,并不是直接从基于python的web框架开始,而是从介绍一些相关工具开始,使整个开发的过程更加便捷高效,而这正是我原本在学习过程中从来没有体验到的。因此第一部分关于Git的内容,一定推荐给需要团队协作的朋友们使用。
1 Git安装和GitHub注册
这里不多啰嗦,简单来说Git是一个开源的分布式版本控制工具,总体有以下四个重要用途:
- keep track of the codes (持续跟进代码)
- synchronize codes between different people(同步合作的代码)
- test changes to codes without losing the original(不丢失源码的情况下测试新的特性)
- revert back old versions of codes(代码的回退)
而关于GitHub,众所周知一个什么都可以放的云平台(滑稽),可以算是一个云端的代码仓库吧!而且不仅可以存放自己的代码,上面还有着千千万万别人造的轮子等待你的探索。
1.1 Git的安装
关于Git的下载及安装,会发现官网的源太慢了,因此可以从国内的镜像(for windows)去下载,下载好以后,一路默认设置安装即可,没有什么特别需要注意的内容。
安装完成以后,在命令行或者软件自带的Git Bash中输入:git version
,看到版本号就宣告成功。
1.2 GitHub相关内容
注册方面就不再多说了,登官网去整就行了。
主要谈一下怎么把Git和Github关联起来:
- 本地设置Git的user name和email
命令行输入git config --global user.name "替换字段"
和git config --global user.email "替换字段(邮箱)"
完成设置 - 本地生成SSH密钥
在命令行输入ssh-keygen -t rsa -C "替换字段(邮箱)"
,会在命令行当前所在的目录下生成一个.ssh
的文件夹,找到里面的id_rsa.pub
文件(这里注意会有两个同名文件,通过后缀来区分),然后把这个文件里的内容复制下来。 - GitHub中添加SSH密钥
登录GitHub以后,在头像下找到setting
,然后在左边菜单栏中找到SSH and GPG keys
,随后点击右上角的New SSH key
进行SSH密钥的添加 - 验证连接
命令行下输入ssh -T git@github.com
,出现如下结果便是成功(注意这里别输成自己的邮箱号,否则会出现port 22
的相关错误)
1.3 Git的常见命令
Git的命令很多,这里主要捡常用的来说:
-
git clone <url>
克隆代码仓库
这个命令之管用,相信不用我赘述。以前没有用Git的时候,我都是手动到Github上去下载代码,现在只需要代码仓库的链接就可以轻松把代码copy下来。注意这里下载的代码依旧是放到命令行的目录之下。 -
git init <repository_name>
代码仓库的初始化
用于新项目的创建,和clone相当于两个不同的开始方式。 -
git add <filename>
将文件添加到仓库
注意这里的添加真的仅仅只是添加而已,此时该文件尚未同步,所以接下来就是下一步。 -
git commit -m "some information"
提交文件到仓库并添加注释
这里的some information是替换字段,主要用于自己区分每次add的文件的区别,可以用于记录自己的大致的修改内容。 -
git push
上传到GitHub
这步进行完以后,就可以再GitHub上看到自己上传的代码了。 -
git pull
从GitHub上拉取并整合代码
这里和clone最大的区别在于会整合你本地仓库的代码,并且如果和本地代码出现去别的时候会提醒"merge conflicts"的错误,并且给出云端文件和本地文件的对比。将文件重新修改好以后重新add、commit才算完成整合(有需要也可以push到GitHub上) -
git status
查看代码仓库状态
主要用于当前的一些状态的指示,同时也会给出一些下一步的操作说明. -
git log
查看当前分支的记录
在这里记录了当前分支的每次提交内容,每次提交都有唯一的commit编号,这个编号将在代码回退中起到十分重要的作用。注意,当log记录比较多的时候,左下角会出现一个冒号,可能导致无法退出的问题,按q
就行了 -
git reset --hard <commit id>(origin/master)
回退到相应版本/到从网上clone时的版本
注意这里是两条指令,另外这里的commit id就是上步中提到的每次提交以后唯一的commit编号。 -
git branch (<branch_name>)
查看/创建新的分支
如果在团队合作的情况或者需要在保留原始版本且需要测试新功能的情况时,我们往往需要创建分支。Git就像一条正在施工的水渠,每提交一次代码,就相当于往前多挖了一段,而且每挖一次都会有个旗杆插在那里当标志。而分支的创建就像在某个节点挖出了两条水渠,一条是原始版本(默认为master),另外一条则是那个新创建的分支。 -
git checkout <branch_name>
转移到相应的分支
该命令用于在不同分支下工作,而且这些分支相互独立,不会相互影响。
1.4 一个简单的例子
结合课程里给到的一些内容,以及我自己实现的时候发现的一些坑,在这里展示给大家。
1. 代码仓库的创建
主要两种方法:1)直接从GitHub上创建一个新的仓库,然后直接clone下来用 ;2)自己本地新建一个仓库,再去GitHub上创建一个仓库,然后绑定。第二种方法相对复杂一些,本着研究的心态,这里用第二种方法举个例子:
D:\pycharm\code>git init newrepo
D:\pycharm\code\newrepo>git remote add newrepo https://github.com/miniyang9/newrepo.git
上面的newrepo和那个链接分别是新建仓库的名称,以及GitHub上建的仓库的链接(两边的仓库名最好一致,方便识别)。执行完成以后,可以在D:\pycharm\code
下找到新建的newrepo
,打开以后可以看到里面只有一个.git
文件夹。
2.添加代码与上传GitHub
首先,我们在仓库中创建一个名为version1.txt
的文件,在其中输入:
this is the first version
a = 1
b = 2
c = 3
随后分别使用git add
和git commit
命令,此时可以看到1 file changed, 4 insertions(+)
,说明文件已经提交成功。利用git log
命令,可以进一步查看此时的文件唯一的commit编号。同时可以看到HEAD->master
字样,说明当前的分支处在master
的分支之下,也就是默认的主分支。
一般,如果我们是通过clone建立的仓库,此时只需要git push
就可以把代码上传到GitHub上面了,但是如果是跟上面流程走的话,需要输入:
git push --set-upstream newrepo master
得到如下的反馈就是上传成功了,此时已经可以在github上看到上传的代码了。
3.代码整合和统一
想象此时是多人合作完成某个项目,某人在处理完一段代码以后,将新的内容上传到了GitHub,此时意味着云端的代码已经和我们本地的代码出现一些差异了。因此,我们如果想继续处理并上传的话,只需要git pull
即可同步代码。注意,在这里,要指出如果是方法2创建的仓库很简单,如上操作即可同步;但是如果是方法1克隆的仓库的话,此时往往需要解决一些merge conflicts
,这里不再赘述,会在下面的代码分支汇合部分再提到。
在这里简单举个例子,在GitHub的网页中找到version1.txt
文件,并在线随便修改内容,保存以后在本地命令行使用git pull
命令,就会发现本地的version1.txt
文件已经和云端的文件相统一了。
同理,使用git log
可以看到从云端pull下来的commit编号,以及注释的Update version1.txt
。
4.分支的创建
在创建分支之前,输入git branch
可以看到当前的工作处在那个分支之上(默认用HEAD来指示),然后我们通过git branch newbranch
来创建一个新的分支newbranch。之后的过程中,就可以使用git checkout newbranch
在两个分支之间切换。
此时,我们将HEAD移到newbranch的分支上,然后打开newrepo/version1.txt
,并修改其中的内容,比如:
this is the version for testing
a = 100
b = 200
c = 300
然后使用git add
和git commit
将该文件提交,通过git log
可以看到新的commit编号已经生成。
随后,首先我们再次打开version1.txt确认修改内容,然后利用git cheakout master
将分支转移到主分支上,然后再次打开version1.txt。Surprise mo**er fu**er!代码居然还原到了master分支上的样子(嘿嘿嘿,我第一次成功的时候确实惊了,原谅我”少见多怪”)利用git log
可以看到主分支上只有两条记录,分别是之前的version1.txt
和Update version1.txt
。到这里,分支创建和它的作用讲的差不多了。
5.分支的汇合
分支创建可以说是为了在不影响源码的情况下,测试新的代码。那么,一旦代码测试完毕以后,就涉及到整合代码的问题了。因此,我们假设newbranch
的代码就是我们测试好了以后的代码,那么我们如何将它与master
汇合起来呢?
首先我们需要把分支移到master
下,然后使用git merge newbranch
就可以汇合了,通过git log
我们可以看到新的a testing version1.1
已经被添加到主分支上了。
这里提一句,其实pull在某种程度上也是一种merge(相当于fetch+merge),只不过pull处理的分支是云端的分支和本地分支,而merge是在处理本地的分支之间的问题而已。
6.关于merge conflicts
如果在创建完分支以后,分别修改master
和newbranch
中的version1.txt
,比如,master
下的version1.txt
修改为:
this is the version for testing
a = 100
b = 200
c = 300
d = 400
newbranch
下的version1.txt
修改为:
this is the version for testing
a = 1
b = 2
c = 3
此时,我们使用git merge
命令就会出现merge conflict
的错误提示。
同时,我们打开文件,会看到这样的形式:
this is the version for testing
<<<<<<< HEAD
a = 100
b = 200
c = 300
d = 400
=======
a = 1
b = 2
c = 3
>>>>>>> newbranch
这里<<<<<<
到=====
之间的内容是原本master
中的,而======
到>>>>>>>
则是newbranch
中的,此时我们需要做的就是自行删除不需要的部分,然后重新保存,再通过git add
和git commit
的命令重新去提交就行了。