Git与GitHub的使用

(一)认识Git与GitHub

Git的诞生

Linus Torvalds在1991年创建了开源系统Linux,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!然后,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了。

于是,Linus Torvalds花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!

Git介绍

Git是一个开源的分布式版本控制系统,用以有效、高速地处理从很小到非常大的项目版本管理。相比CVS、SVN等版本控制工具,Git无疑更加优秀,功能更加强大,在项目版本管理中被越来越多的人广泛的使用。但 Git 相对来说比较难学。

使用Git来管理项目有两种方式:

  • 一种是本地部署Git版本管理系统。

  • 另一种是通过在线代码托管。

本地部署Git版本管理系统,需要自己来搭建环境,但项目的提交与更新速度快,更适合较为封闭的项目;使用在线托管最大的好处是在有网络的情况下可以随时随地提交自己的代码,但项目是公开的,当然也可以创建私有项目,大多属于付费服务。

GitHub

GitHub就是基于Git的在线代码托管平台。

GitHub为当前最流行的开源项目托管平台,数以万计优秀的开源项目被托管在GitHub上面。随着越来越多的应用程序转移到云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。对于普通开发人员来讲,其在GitHub上托管的项目已经成为了他的一张个人名片。许多优秀的互联网公司在招聘开发人员时都希望对方能提供个人的GitHub地址。当然,GitHub作为一个开源软件的大宝库,学习和使用它,也会为我们的日常开发带来许多便利。

测试为什么学习Git ?

  • 工作需要

我们工作中需要对项目代码进行管理,我的工作中就先后使用了SVN和Git对项目的版本进行管理。所以,这是测试人员必备技能。

  • 学习需要

你工作中所使用的编程语言的第三方库,大量都在GitHub上面托管,要想安装这些库就会用到Git;另外一些主流的Selenium、Appium开源项目也都是在GitHub上进行维护。

  • 个人名片

将你自己工作中的一些项目和代码放到GitHub上面进行管理。这无疑是对个人能力最好的展示。

(二)GitHub注册与Git安装

注册GitHub


GitHub官方地址:https://github.com。

在浏览器中打开GitHub网址,通过首页进行注册,如下图所示。

安装Git


Git官方下载地址:http://git-scm.com/download/。

Git支持多平台(Mac OS X/Windows/Linux/Solaris),读者可根据自己的平台选择相应的版本下载。

Linux 各版本下安装Git:

  Debian/Ubuntu $ apt-get install git-core

  Fedora $ yum install git

  Gentoo $ emerge --ask --verbose dev-vcs/git

  Arch Linux $ pacman -S git

下载并安装完成后,我们通常在Mac OSX及Linux平台下用终端工具(Terminal)来使用Git,而在Windows平台下用Git Bash工具,如下图所示。

建立链接


本地Git与GitHub服务器之间保持通信时,我们使用SSH key认证方式来保证通信安全,所以在使用GitHub前你必须先建创自已的SSH key。 我们后续操作以Windows为例,打开Git Bash,如下图所示。

ssh创建方法:https://jingyan.baidu.com/article/09ea3ede7026ddc0afde3942.html

(1)进入 SSH 目录。

fnngj@FNNGJ-PC ~
$ cd ~/.ssh

fnngj@FNNGJ-PC ~/.ssh
$ pwd
/c/Users/fnngj/.ssh

(2)生成新的 SSH 秘钥。

如果你已经有了一个秘钥(默认秘钥位置~/.ssh/id_rsa文件存在。)

fnngj@FNNGJ-PC ~/.ssh
$ ssh-keygen -t rsa -C "fnngj@126.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/fnngj/.ssh/id_rsa):  --回车
Enter passphrase (empty for no passphrase):        --回车
Enter same passphrase again:            --回车
Your identification has been saved in /c/Users/fnngj/.ssh/id_rsa.
Your public key has been saved in /c/Users/fnngj/.ssh/id_rsa.pub.
The key fingerprint is:
78:51:9b:2c:6c:fb:74:0b:6b:b9:c4:23:8f:5e:10:6b fnngj@126.com
The key's randomart image is:
+--[ RSA 2048]----+
|          .         |
|       . o o       |
|        * +         |
|       o *          |
|      . E o .      |
|       o = = .     |
|        . X .      |
|         B o        |
|       .o o         |
+-----------------+

fnngj@FNNGJ-PC ~/.ssh
$ ls
id_rsa  id_rsa.pub

查看目录下会生成两个问题,id_rsa 是私钥,id_rsa.pub 是公钥。记住千万不要把私钥文件id_rsa 透露给任何人。

(3)添加 SSH 公钥到 GitHub。

用文本工具打开公钥文件 ~/.ssh/id_rsa.pub ,复制里面的所有内容到剪贴板,如下图所示。

登录GitHub,单击右上角个人头像→Settings→SSH Keys→Add SSH Keys ,在 Title 文本框中输入任意字符,在 Key文本框粘贴刚才复制的公钥字符串,单击“Add key”按钮完成操作,如下图所示。

(4)测试连接。

以上步骤完成后,你就可以通过以下命令来测试是否可以连接 GitHub服务器了。

fnngj@FNNGJ-PC ~/.ssh
$ ssh -T git@github.com
The authenticity of host 'github.com (192.30.252.129)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.252.129' (RSA) to the list of know
n hosts.
Hi defnngj! You've successfully authenticated, but GitHub does not provide shell
 access.

(三)Git提交代码到GitHub

GitHub创建项目


在GitHub选择并创建一个项目。首先,登录 GitHub,单击页面右上角加号“+” ,选择“New repository” 选项。

填写项目名称及描述,默认项目为“Public”,如果想创建“Private”项目,GitHub需要收费。最后单击“Create repository”完成项目的创建,如下图所示。

项目名称为:project-name

创建完一个项目之后,GitHub会提示我们如何提交项目到它上面。

Quick setup — if you’ve done this kind of thing before
HTTPS  https://github.com/defnngj/project-name.git
SSH    git@github.com:defnngj/project-name.git

…or create a new repository on the command line

echo # project-name >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:defnngj/project-name.git
git push -u origin master

…or push an existing repository from the command line

git remote add origin git@github.com:defnngj/project-name.git
git push -u origin master

…or import code from another repository

You can initialize this repository with code from a Subversion, Mercurial, or TFS project.

第一次提交代码到GitHub


首先进行初始化配置:设置仓库人员的用户名和邮箱地址,这一步必不可少。

fnngj@FNNGJ-PC /d/project-name (master)
$ git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test_case.py

nothing added to commit but untracked files present (use "git add" to track)

在本地创建一个 “project-name” 项目,与GitHub上创建的项目名 保持一致。

为了练习,我们在项目下创建一个test_case.py文件。

fnngj@FNNGJ-PC /d/project-name
$ ls

test_case.py

“ls” 为Linux命令,用于查看当前目录下的文件及文件夹。

fnngj@FNNGJ-PC /d/project-name (master)
$ git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test_case.py

nothing added to commit but untracked files present (use "git add" to track)

“git init” 命令用于对当前目录进行初始化,使当前的project-name目录交由Git进行管理。

fnngj@FNNGJ-PC /d/project-name (master)
$ git status

On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        test_case.py

nothing added to commit but untracked files present (use "git add" to track)

“git status” 命令用于查看当前项目下所有文件的状态。

status 是指本地的状态,显示的是本地工作空间与本地仓库之间的差异

你新建的文件、修改但没提交(commit)的文件,都显示在这里,提交之后就是空的了

pull/push 是本地仓库与远端仓库的同步操作,up-to-date 说明本地仓库与远端仓库是同步的
关于“git status”说明:

 

我们可以看到当前处于master(主)分支,罗列了当前目录下的文件(test_case.py),并且提示未对当前目录下的文件进行跟踪(跟踪文件增、删、改的状态);并告诉我们可以通过 “git add” 命令对文件进行跟踪。

fnngj@FNNGJ-PC /d/project-name (master)
$ git add .

fnngj@FNNGJ-PC /d/project-name (master)
$ git status

On branch master

Initial commit

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)

        new file:   test_case.py

“git add” 命令可以对指定文件添加跟踪。如果后面跟空格加点号“.”,则表示对当前目录下的所有文件进行跟踪。

再次通过 “git status” 命令查看当前Git仓库的信息。

fnngj@FNNGJ-PC /d/project-name (master)
$ git commit -m "first commit file"

[master (root-commit) 9b4b839] first commit file
 1 file changed, 9 insertions(+)
 create mode 100644 test_case.py

“git commit” 命令将文件(git add 进行管理的文件)提交到本地仓库。-m 参数对本次的提交加以描述。一般提交的描述必不可少,从而方便追溯每次提交都做了哪些修改。

准备工作已经完成,下面提交代码到GitHub。这里GitHub提供了两种链接方式:HTTPS和SSH,提交的地址有所不同,请查看前面GitHub提示信息。

fnngj@FNNGJ-PC /d/project-name (master)
$ git remote add origin git@github.com:defnngj/project-name.git

fnngj@FNNGJ-PC /d/project-name (master)
$ git push -u origin master

Warning: Permanently added the RSA host key for IP address '192.30.252.128' to t
he list of known hosts.
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 354 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:defnngj/project-name.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.
  • git remote add origin git@github.com:defnngj/project-name.git”

如果是第一次提交项目,这一句非常重要,它会将本地的项目与远程的仓库之间建立连接。这里选择SSH协议方式进行连接。

  • “git push -u origin master ”

将本地的项目提交到远程仓库中。

GitHub查看提交代码


现在访问GitHub就看到我们提交的项目了,如下图所示。

(四)Git克隆与更新代码

克隆项目


我们除了可以向GitHub上提交项目外,更多的时候是我们到上面克隆(下载)优秀的开源项目来用,当然也可以将使用过程中发现的bug,通过建立分支的方式提交给项目的原作者。 我们现在的场景是在家将项目提交到了GitHub上,现在来到公司,需要将GitHub上的项目克隆到本地,那么对于公司的电脑来说,同样需要与GitHub建立连接。

首先,下载安装Git。

其次,通过Git生成本地公钥,并且将公钥添加到GitHub中。

最后,设置仓库人员的用户名和邮箱地址。

具体操作请参考前面的章节。当一切都设置完成后,就可以从GitHub上克隆项目到本地了。我们同样以Windows系统为例,打开Git Bash。

Company@MININT-IQVJFIT /d/my_test
$  git clone git@github.com:defnngj/project-name.git

Cloning into 'project-name'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
Checking connectivity... done.

Company@MININT-IQVJFIT /d/my_test
$ cd project-name/

Company@MININT-IQVJFIT /d/my_test/project-name (master)
$ ls

test_case.py

“git clone” 命令用于克隆GitHub上的项目到本地。通过“cd”命令进入项目目录,查看项目文件。

另外,我们也可以直接通过http链接克隆项目:

$  git clone https://github.com/defnngj/project-name

更新项目


这次更新我们项目做了较大的变更,创建文件的文件与文件夹,并且删除了原有文件。

Company@MININT-IQVJFIT /d/my_test/project-name (master)
$ git status

On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    test_case.py

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        126login.py
        baidu.py
        package/
        po_login.py
        test_case/

no changes added to commit (use "git add" and/or "git commit -a")

通过“git status” 命令查看当前变更。通过变更信息可以看出,删除了test_case.py文件。这个删除只是在项目目录下进行删除,Git对此文件留有记忆,所以要通过 “git rm” 命令将其删除。

Company@MININT-IQVJFIT /d/my_test/project-name (master)
$ git rm test_case.py
rm 'test_case.py'

如果删除的是文件同样用此命令,例如,“git rm test_case/”。

如果删除的文件名带空格,则需要通过双引号将文件名引起来,例如,“git rm “test case.py” ”。

Company@MININT-IQVJFIT /d/my_test/project-name (master)
$ git add .

Meizu@MININT-IQVJFIT /d/my_test/project-name (master)
$ git status

On branch master
Your branch is up-to-date with 'origin/master'.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   126login.py
        new file:   baidu.py
        new file:   package/__init__.py
        new file:   package/location.py
        new file:   po_login.py
        deleted:    test_case.py
        new file:   test_case/126login.py
        new file:   test_case/allpage/__init__.py
        new file:   test_case/allpage/base.py
        new file:   test_case/allpage/login_page.py


Company@MININT-IQVJFIT /d/my_test/project-name (master)
$ git commit -m "update project"

[master 0e8eece] update project
 10 files changed, 377 insertions(+), 9 deletions(-)
 create mode 100644 126login.py
 create mode 100644 baidu.py
 create mode 100644 package/__init__.py
 create mode 100644 package/location.py
 create mode 100644 po_login.py
 delete mode 100644 test_case.py
 create mode 100644 test_case/126login.py
 create mode 100644 test_case/allpage/__init__.py
 create mode 100644 test_case/allpage/base.py
 create mode 100644 test_case/allpage/login_page.py

Company@MININT-IQVJFIT /d/my_test/project-name (master)
$ git push origin master

Warning: Permanently added the RSA host key for IP address '192.30.252.128' to t
he list of known hosts.
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (13/13), 3.41 KiB | 0 bytes/s, done.
Total 13 (delta 2), reused 0 (delta 0)
To git@github.com:defnngj/project-name.git
   9b4b839..0e8eece  master -> master

“git add” 命令对当前目录下的文件添加跟踪。

“git commit” 命令将添加文件提交到本地仓库。

“git push” 将本地项目提交到远程仓库GitHub。

除第一次下载项目需要通过 “git clone” 将项目克隆到本地外,后续再使用 “git pull” 命令时会直接将更新拉取到本地。

fnngj@FNNGJ-PC /d/project-name
$ git pull origin master

Warning: Permanently added the RSA host key for IP address '192.30.252.131' to t
he list of known hosts.
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (10/10), done.
remote: Total 13 (delta 2), reused 13 (delta 2), pack-reused 0
Unpacking objects: 100% (13/13), done.
From github.com:defnngj/project-name
 * branch            master     -> FETCH_HEAD
   9b4b839..0e8eece  master     -> origin/master
Updating 9b4b839..0e8eece
Fast-forward
 126login.py                     |  28 +++++++++++
 baidu.py                        |  18 +++++++
 package/__init__.py             |   0
 package/location.py             |  81 +++++++++++++++++++++++++++++++
 po_login.py                     | 103 ++++++++++++++++++++++++++++++++++++++++
 test_case.py                    |   9 ----
 test_case/126login.py           |  44 +++++++++++++++++
 test_case/allpage/__init__.py   |   0
 test_case/allpage/base.py       |  47 ++++++++++++++++++
 test_case/allpage/login_page.py |  56 ++++++++++++++++++++++
 10 files changed, 377 insertions(+), 9 deletions(-)
 create mode 100644 126login.py
 create mode 100644 baidu.py
 create mode 100644 package/__init__.py
 create mode 100644 package/location.py
 create mode 100644 po_login.py
 delete mode 100644 test_case.py
 create mode 100644 test_case/126login.py
 create mode 100644 test_case/allpage/__init__.py
 create mode 100644 test_case/allpage/base.py
 create mode 100644 test_case/allpage/login_page.py

(附录)Git本地的仓库仓库组成

Git官方文档:https://git-scm.com/book/zh/v2

Git廖雪峰文档:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000

git其实是是一个不用网络的仓库(本地仓库),你也可以把数据pushgithub上(远程仓库)。

你现在的pullpush都是本地版本库和远程仓库之间的数据交互。

在你的本地仓库,其实是由两部分组成:

  1. 工作区 (Working Directory) //看得见的
  2. 版本库 (Repository) //看不见的
    • 暂存区(Stage)
    • 分支 (branch)

版本库包含暂存区和分支

流程:

初次提交:

- 通过git add 将文件 工作区 ---》暂存区 (本地)

- 通过git commit 将文件 暂存区 ---》分支 (本地)

- 通过git push 将文件 分支 ---》远程库 (github)

提交改动:

- 通过git commit将文件 暂存区 ---》分支 (本地)

- 通过git push 将文件 分支 ---》远程库 (github)

pull&push

- 通过git pull 将文件 远程库 ---》分支 (本地)

- 通过git push 将文件 分支 ---》远程库 (github)

而上面的两个操作是需要有改动,有差异才能执行。

所以会提示暂存区和远程库的内容一致。

posted @ 2018-07-09 13:58  XIaoming·zhou  阅读(825)  评论(1编辑  收藏  举报