Git简明教程

git

Git是什么

Git 是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。 Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。Git 是根据GNU通用公共许可证版本2的条款分发的自由/免费软件,安装参见:http://git-scm.com/

GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。

Git本身完全可以做到版本控制,但其所有内容以及版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。使用场景:

无GitHub:在本地 .git 文件夹内维护历时文件 有GitHub:在本地 .git 文件夹内维护历时文件,同时也将历时文件托管在远程仓库

安装好Git的第一件事

初次使用Git前,在命令行输入第一条Git命令

1
2
$ git config --global user.name "你的名字"
$ git config --global user.email "你的Email"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

注意git config命令的–global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

创建属于自己的Git仓库

你需要在某个你喜欢的地方创建一个目录,在此目录下运行Git命令

1
git init

这样你就已经初始化了一个新的Git仓库,初始化后,会在当前目录自动创建 .git 文件夹,该文件是Git中最重要的文件夹,Git相关文件以及版本都将保存在该文件夹中,如果你没有看到它,没有关系,因为它怕你不小心伤害它,开启了隐藏属性。

在仓库中放文件时,先看一下其工作流程

Git的工作流程一般是这样的

  • 在工作目录中添加,修改文件
  • 将需要进行版本管理的文件放入暂存区域
  • 将暂存区域的文件提交到Git仓库

Git管理文件的三种状态

  • 已修改(modified)
  • 已暂存(staged)
  • 已提交(committed)

你的本地仓库有 Git 维护的三棵“树”组成,这是 Git 的核心框架。

这三棵树分别是:工作目录、暂存区和 Git 仓库

img

工作目录(Working Directory)即存放项目代码的地方。

暂存区(Stage)用于临时存放你的改动,事实上它只是一个文件,保存即将提交的文件列表信息。

Git 仓库(Repository)就是安全存放数据的位置,这里边有你提交的所有版本的数据。其中,HEAD 指向最近一次放入仓库的版本

基本操作

项目添加到暂存区域

1
git add 文件名

项目提交到本地Git仓库

1
git commit -m '本次提交描述信息'

查看Git当前状态,如:哪些文件被修改过、那些文件还未提交到版本库等

1
git status

查看提交记录,即:历史版本记录

1
git log

Git版本回滚(Git的后悔药)

git reset 命令就是你的后悔药。它可以将当前的工作分支的HEAD定位到以前提交的任何版本中

git rest –mixed [commit]

1
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变(保留差异)

git rest –soft [commit]

1
保留回退差异到暂存区(工作区不变)

git rest –hard [commit]

1
2
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致(不保留差异)

reset命令回滚快照三部曲

1
2
3
4
- 回退的差异保留在暂存区,工作区不变(--soft)
- 回退的差异保留在工作区(--mixed,默认)
- 清空暂存区和工作区的差异(--hard)

修改最后一次提交

1
2
3
4
5
6
7
在实际开发中,你可能会遇到以下两种情景
- 情景一:版本刚commit到仓库,突然想起漏掉两个文件没有add

- 情景二:版本刚commit到仓库,突然想起版本说明写的不够全面

此时可以执行带 --amend 选项的commit 提交命令Git就会更正最近的一次提交

Git分支管理

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。

img

常规操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 列出所有本地分支
git branch

# 列出所有远程分支
git branch -r

# 新建一个分支,但依然停留在当前分支
git branch [branch-name]

# 新建一个分支,并切换到该分支
git checkout -b [branch]

# 新建一个分支,指向指定commit
git branch [branch] [commit]

# 切换到指定分支,并更新工作区
git checkout [branch-name]

# 切换到上一个分支
git checkout -

# 合并指定分支到当前分支
git merge [branch]

# 选择一个commit,合并进当前分支
git cherry-pick [commit]

# 删除分支
git branch -d [branch-name]

# 删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]

Git 标签管理

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

创建标签

1
2
3
4
5
git tag 标签名如(1.0.01b2d3c42ff
注:1b2d3c42ff 是你想要标记的提交 ID 的前 10 位字符。
使用如下命令获取提交 ID:
git log --decorate --oneline

指定标签信息

1
2
git tag -a 标签名 -m "第一个版本"

常规操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 列出所有tag
git tag

# 新建一个tag在当前commit
git tag [tag]

# 新建一个tag在指定commit
git tag [tag] [commit]

# 删除本地tag
git tag -d [tag]

# 删除远程tag
git push origin :refs/tags/[tagName]

# 提交指定tag
git push [remote] [tag]

# 提交所有tag
git push [remote] --tags

# 新建一个分支,指向某个tag
git checkout -b [branch] [tag]

Git服务器搭建

GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。 搭建Git服务器需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian,这样,通过几条简单的apt命令就可以完成安装。

假设你已经有sudo权限的用户账号

第一步,安装git

1
2
$ sudo apt-get install git

第二步,创建一个git用户,用来运行git服务

1
2
$ sudo adduser git

第三步,创建证书登录

收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。

第四步,初始化Git仓库

先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令:

1
2
$ sudo git init --bare sample.git

Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:

1
2
$ sudo chown -R git:git sample.git

第五步,禁用shell登录

出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:

1
2
git:x:1001:1001:,,,:/home/git:/bin/bash

改为:

1
2
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

1
2
3
4
$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

有关Git的深入学习可以参考官方网站以及Git大全 !

都看到这里了,不赏点银子吗^v^