Part1 Git和GitHub

整个课程的内容比较丰富,并不是直接从基于python的web框架开始,而是从介绍一些相关工具开始,使整个开发的过程更加便捷高效,而这正是我原本在学习过程中从来没有体验到的。因此第一部分关于Git的内容,一定推荐给需要团队协作的朋友们使用。

1 Git安装和GitHub注册

这里不多啰嗦,简单来说Git是一个开源的分布式版本控制工具,总体有以下四个重要用途:

  1. keep track of the codes (持续跟进代码)
  2. synchronize codes between different people(同步合作的代码)
  3. test changes to codes without losing the original(不丢失源码的情况下测试新的特性)
  4. revert back old versions of codes(代码的回退)

而关于GitHub,众所周知一个什么都可以放的云平台(滑稽),可以算是一个云端的代码仓库吧!而且不仅可以存放自己的代码,上面还有着千千万万别人造的轮子等待你的探索。

1.1 Git的安装

关于Git的下载及安装,会发现官网的源太慢了,因此可以从国内的镜像(for windows)去下载,下载好以后,一路默认设置安装即可,没有什么特别需要注意的内容。

安装完成以后,在命令行或者软件自带的Git Bash中输入:git version,看到版本号就宣告成功。

python Git Bash Here 执行命令_上传

1.2 GitHub相关内容

注册方面就不再多说了,登官网去整就行了。
主要谈一下怎么把Git和Github关联起来:

  1. 本地设置Git的user name和email
    命令行输入git config --global user.name "替换字段"git config --global user.email "替换字段(邮箱)"完成设置
  2. 本地生成SSH密钥
    在命令行输入ssh-keygen -t rsa -C "替换字段(邮箱)",会在命令行当前所在的目录下生成一个.ssh的文件夹,找到里面的id_rsa.pub文件(这里注意会有两个同名文件,通过后缀来区分),然后把这个文件里的内容复制下来。
  3. GitHub中添加SSH密钥
    登录GitHub以后,在头像下找到setting,然后在左边菜单栏中找到SSH and GPG keys,随后点击右上角的New SSH key进行SSH密钥的添加
  4. 验证连接
    命令行下输入ssh -T git@github.com,出现如下结果便是成功(注意这里别输成自己的邮箱号,否则会出现port 22的相关错误)
1.3 Git的常见命令

Git的命令很多,这里主要捡常用的来说:

  1. git clone <url>克隆代码仓库
    这个命令之管用,相信不用我赘述。以前没有用Git的时候,我都是手动到Github上去下载代码,现在只需要代码仓库的链接就可以轻松把代码copy下来。注意这里下载的代码依旧是放到命令行的目录之下。
  2. git init <repository_name>代码仓库的初始化
    用于新项目的创建,和clone相当于两个不同的开始方式。
  3. git add <filename>将文件添加到仓库
    注意这里的添加真的仅仅只是添加而已,此时该文件尚未同步,所以接下来就是下一步。
  4. git commit -m "some information"提交文件到仓库并添加注释
    这里的some information是替换字段,主要用于自己区分每次add的文件的区别,可以用于记录自己的大致的修改内容。
  5. git push上传到GitHub
    这步进行完以后,就可以再GitHub上看到自己上传的代码了。
  6. git pull从GitHub上拉取并整合代码
    这里和clone最大的区别在于会整合你本地仓库的代码,并且如果和本地代码出现去别的时候会提醒"merge conflicts"的错误,并且给出云端文件和本地文件的对比。将文件重新修改好以后重新add、commit才算完成整合(有需要也可以push到GitHub上)
  7. git status查看代码仓库状态
    主要用于当前的一些状态的指示,同时也会给出一些下一步的操作说明.
  8. git log查看当前分支的记录
    在这里记录了当前分支的每次提交内容,每次提交都有唯一的commit编号,这个编号将在代码回退中起到十分重要的作用。注意,当log记录比较多的时候,左下角会出现一个冒号,可能导致无法退出的问题,按q就行了
  9. git reset --hard <commit id>(origin/master)回退到相应版本/到从网上clone时的版本
    注意这里是两条指令,另外这里的commit id就是上步中提到的每次提交以后唯一的commit编号。
  10. git branch (<branch_name>)查看/创建新的分支
    如果在团队合作的情况或者需要在保留原始版本且需要测试新功能的情况时,我们往往需要创建分支。Git就像一条正在施工的水渠,每提交一次代码,就相当于往前多挖了一段,而且每挖一次都会有个旗杆插在那里当标志。而分支的创建就像在某个节点挖出了两条水渠,一条是原始版本(默认为master),另外一条则是那个新创建的分支。
  11. 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 addgit commit命令,此时可以看到1 file changed, 4 insertions(+),说明文件已经提交成功。利用git log命令,可以进一步查看此时的文件唯一的commit编号。同时可以看到HEAD->master字样,说明当前的分支处在master的分支之下,也就是默认的主分支。

python Git Bash Here 执行命令_web_02


一般,如果我们是通过clone建立的仓库,此时只需要git push就可以把代码上传到GitHub上面了,但是如果是跟上面流程走的话,需要输入:

git push --set-upstream newrepo master

得到如下的反馈就是上传成功了,此时已经可以在github上看到上传的代码了。

python Git Bash Here 执行命令_git_03

3.代码整合和统一

想象此时是多人合作完成某个项目,某人在处理完一段代码以后,将新的内容上传到了GitHub,此时意味着云端的代码已经和我们本地的代码出现一些差异了。因此,我们如果想继续处理并上传的话,只需要git pull即可同步代码。注意,在这里,要指出如果是方法2创建的仓库很简单,如上操作即可同步;但是如果是方法1克隆的仓库的话,此时往往需要解决一些merge conflicts,这里不再赘述,会在下面的代码分支汇合部分再提到。

在这里简单举个例子,在GitHub的网页中找到version1.txt文件,并在线随便修改内容,保存以后在本地命令行使用git pull命令,就会发现本地的version1.txt文件已经和云端的文件相统一了。

同理,使用git log可以看到从云端pull下来的commit编号,以及注释的Update version1.txt

python Git Bash Here 执行命令_上传_04

4.分支的创建

在创建分支之前,输入git branch可以看到当前的工作处在那个分支之上(默认用HEAD来指示),然后我们通过git branch newbranch来创建一个新的分支newbranch。之后的过程中,就可以使用git checkout newbranch在两个分支之间切换。

python Git Bash Here 执行命令_命令行_05


此时,我们将HEAD移到newbranch的分支上,然后打开newrepo/version1.txt,并修改其中的内容,比如:

this is the version for testing
a = 100
b = 200
c = 300

然后使用git addgit commit将该文件提交,通过git log可以看到新的commit编号已经生成。

python Git Bash Here 执行命令_web_06


随后,首先我们再次打开version1.txt确认修改内容,然后利用git cheakout master将分支转移到主分支上,然后再次打开version1.txt。Surprise mo**er fu**er!代码居然还原到了master分支上的样子(嘿嘿嘿,我第一次成功的时候确实惊了,原谅我”少见多怪”)利用git log可以看到主分支上只有两条记录,分别是之前的version1.txtUpdate version1.txt。到这里,分支创建和它的作用讲的差不多了。

5.分支的汇合

分支创建可以说是为了在不影响源码的情况下,测试新的代码。那么,一旦代码测试完毕以后,就涉及到整合代码的问题了。因此,我们假设newbranch的代码就是我们测试好了以后的代码,那么我们如何将它与master汇合起来呢?

首先我们需要把分支移到master下,然后使用git merge newbranch就可以汇合了,通过git log我们可以看到新的a testing version1.1已经被添加到主分支上了。

python Git Bash Here 执行命令_python_07


这里提一句,其实pull在某种程度上也是一种merge(相当于fetch+merge),只不过pull处理的分支是云端的分支和本地分支,而merge是在处理本地的分支之间的问题而已。

6.关于merge conflicts

如果在创建完分支以后,分别修改masternewbranch中的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的错误提示。

python Git Bash Here 执行命令_上传_08


同时,我们打开文件,会看到这样的形式:

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 addgit commit的命令重新去提交就行了。