Git 简易教程

一个好早就写了出来的教材,代某位大佬发表

版本控制

为什么要进行版本控制? 最简单的例子,当我们用文字处理软件工作时(如Word)需要进行修改,而有时候又不确定修改的内容是不是需要的,因此会产生许多个文件,如图:

每一个文件都是在之前的文件基础上进行微小的修改,久而久之,不但文件冗杂,而且还不清楚修改的内容是什么,是一种很杂乱的方式。

而版本控制就是解决这一问题——通过记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

采取版本控制后,你可以将文件还原到之前的状态,比较各状态之间的细节从而查出是修改了哪个地方,找出哪里出了问题。甚至你可以随意删改项目中的文件,照样可以恢复到之前的样子,因而增加了容错率,提供了更多可能性。

版本控制有三种,第一种是本地式版本控制,也就是在本地的硬盘上用数据库记录历代文件;第二种是集中式版本控制,通过一个服务器,多个用户连接到服务器进行文件的记录。
而第三种是我们着重介绍的分布式版本控制,它将前两种结合起来,在本地和服务器都建立数据库,每次工作时从服务器克隆(clone)下来,同时又与服务器交互,从而兼顾协同性和安全性。

我们所说的git就是一个分布式版本控制软件,GitHub就是一个git的托管服务。

git本地操作

git设计简单,是完全分布式,允许成千上万个并行开发的分支(Branch),有能力管理超大规模的项目,是目前首选的版本控制软件。

一、工作流程

git的三个工作区域,对应着三种状态:

git 工作流程如下:

  1. 在工作目录中修改文件。(modified)

  2. 暂存文件,将文件的快照放入暂存区域。(staged)

  3. 提交更新,找到暂存区域的文件,将快照永久性存储到 git 仓库目录。(committed)

这是最基本的流程,需要时刻记住。

二、安装git

Git 官方网站下载对应自己电脑的版本,按照指引进行安装。

三、git使用知识

首先我们需要在本地创建一个仓库,用于存放历代版本。

1.命令行中运用cd指令进入项目的目录,输入

    $ git init

这将创建一个名为.git的隐藏子目录。

2.git status:查看哪些文件处于什么状态

    $ git status
    On branch master
    nothing to commit, working directory clean
   (创建git仓库后目录下没有文件时的情况)  

创建一个文件(test)后再使用git status命令,将会看到一个新的提示

    $ git status
    On branch master
    Your branch is up-to-date with 'origin/master'.
    Untracked files:
    (use "git add <file>..." to include in what will be committed)

        test

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

    (新建的“test”文件出现在Untracked files下)

3.git add:跟踪文件
运行

    $ git add test

此时再运行git status,会看到test文件已被跟踪,处于暂存状态(staged),显示Changes to be committed

    $ 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)

        test

4.git commit:提交更新至仓库

先用git status命令确定暂存区域准备妥当,
再运行$git commit -m ”提交信息”(提交信息指本次提交的说明,类似于注释)

$ git commit -m "first"
[master 5e43df6] first
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test 

此时会显示提交成功的信息。

5.git diff:显示尚未暂存的改动(并不是所有改动)

6.git rm test:删除暂存区域中的文件test

7.git log:查看提交历史

$ git log
commit 5e43df6b6d003ea70444ee3125456fd75b066803
Author: *** <****@gmail.com>
Date:   Thu Mar 16 19:37:52 2017 +0800

first

commit 1c83e2a07f0279ea510e2a323fada53166c3c657
Author: *** <****@gmail.com>
Date:   Thu Mar 16 19:16:26 2017 +0800

test  

8.版本回退

在git log命令中我们可以看到类似5e43…6803的一大串字符,那就是版本号(commit id)我们可以用 git reset命令回退到之前任何一个版本:

 $ git reset --hard 1c83e2a0
   HEAD is now at 1c83e2a test

(版本号不必补全,Git会自动去查找)

以上就是git的本地基本操作,包括创建一个仓库,更改、暂存和提交,查看仓库的提交历史,版本回退。

分支

分支是把工作从主线上分离开来,以免影响开发主线。在不同的分支上你可以尝试各种各样的增删改,实现不同的设想。而git的分支模型是它最突出的特点,也是git脱颖而出的原因。

一、分支概念

在版本回退里,你可以回溯到之前的任意版本,而这些版本都是处于一条时间线上,这条时间线就是一个分支。
默认的分支为master分支,本身可以看做一个指针,HEAD指针则指向master指针,如图:

每次提交都会多出一个节点,指针也随之移动。
当我们创建新的分支时,也就创建了一个新的指针,我们通过命令将HEAD指针移到新指针上:

新提交一次后,新指针向前移动,master指针不变,这就产生了分支:
我们可以将两条分支合并,之后可以删掉新分支。

这样就完成了分支的合并。

二、分支使用

1.git branch:查看当前所有分支

$ git branch
* master

(*标示当前分支,默认处于master分支)

2.git branch testing : 创建testing分支

$ git branch testing

此时创建了testing分支,运行git branch命令验证

$git branch    
* master
testing

3.git checkout testing: 切换到testing分支

$ git checkout testing
Switched to branch 'testing'

此时主分支位于testing,运行git branch命令验证

$ git branch
  master
* testing

4.git merge testing:将master分支和testing分支合并
(假设处于master分支)

$ git merge testing
Already up-to-date.

如果在两个不同的分支中,对同一个文件的同一个部分进行了不同的修改,则会产生冲突从而无法合并,只能手动解决后再合并。

5.git branch -d删除分支

$ git branch -d testing
Deleted branch testing (was 1c83e2a).  

使用GitHub

GitHub 是最大的 Git 版本库托管商,尽管这不是 Git 开源项目的直接部分,但如果想要专业地使用 Git,你将不可避免地与 GitHub 打交道。

创建帐户及配置

1.访问https://github.com进行注册

2.SSH访问:

$ cd ~/.ssh
$ ls
 id_rsa		id_rsa.pub	known_hosts  

寻找到id_rsa命名的文件,.pub文件是公钥,另一个是私钥。

如果找不到,可以运行如下命令创建它们

 $ ssh-keygen  

进入github的帐户设置,点击左侧的SSH and GPG keys,将~/.ssh/id_rsa.pub公钥文件的内容粘贴到文本区,然后点击"Add key"

SSH访问配置成功

创建、维护和管理你自己的项目。

1.点击页面右上角的+号,点击New repository按钮

Respository name是必填项目,而其余都是选填项,可以默认。
点击Create respository按钮 ,即创建了一个新的仓库
这时候可以将项目分享给其他人,通过HTTP和SSH的形式。

2.对仓库进行操作,使本地和github同步

     $ git remote add origin     **********(仓库地址)   
    (添加远程仓库至本地)
   
     $ git pull --rebase origin master    
    (更新远程更新到本地)

     $ git push -u origin master  
    (将本地仓库和远程仓库合并)

在今后的项目工作中就是用以上命令同步本地和Github,需要记住。

3.克隆仓库
我们可以将远程仓库的内容克隆到本地

 $ git clone git@github.com:Liuwt1997/github-photo.git
Cloning into 'github-photo'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), 196.28 KiB | 67.00 KiB/s, done.
Checking connectivity... done.

此时远程仓库的文件全部克隆至本地。

4.添加合作者
点击边栏的 “Settings” 链接,然后从左侧菜单中选择 “Collaborators” 。 然后,在输入框中填写用户名,点击 “Add collaborator.” 此时可以给予他们提交的权限。

5.Fork按钮可以将他人项目派生下来,在你的空间中创建一个完全属于你的项目副本。

如何对项目做出贡献呢?

  1. 将派生出的副本克隆到本地

  2. 创建出名称有意义的分支

  3. 修改代码

  4. 检查改动

  5. 将改动提交到分支中

  6. 将新分支推送到 GitHub 的副本中

现在到 GitHub 上查看之前的项目副本,可以看到 GitHub 提示我们有新的分支,并且显示了一个大大的绿色按钮让我们可以检查我们的改动,并给源项目创建合并请求。

如果你点击了那个绿色按钮,就会看到一个新页面,在这里我们可以对改动填写标题和描述,让项目的拥有者考虑一下我们的改动。通常花点时间来编写个清晰有用的描述是个不错的主意,这能让作者明白为什么这个改动可以给他的项目带来好处,并且让他接受合并请求。

以上就是简单的Github的使用方法。

参考资料:

  1. https://git-scm.com/book/zh/v2
  2. 廖雪峰git教程