git 命令及客户端的详细使用

Dev

git教程:廖雪峰的git教程git教程

Git与SVN的区别

  • git是分布式版本控制系统,SVN是集中式版本控制系统。详见: 集中式vs分布式
  • git把内容按元数据方式存储,而SVN是按文件。
  • git版本库可以离线查看所有log,可以离线提交,而SVN不可以。
  • ……更多区别详见: Svn与Git的区别

操作流程

SVN

  1. update(将远程版本库代码更新到本地)
  2. commit(将本地代码提交到远程版本库)

git

  1. commit(将本地代码提交到远程版本库)
  2. fetch(将远程版本库的改动下载到本地(未合并))
  3. merge(合并两个分支(本地、远程))
  4. push(将最新的版本库同步到远程服务器)

显而易见:SVN的操作简单明了,git学习成本比SVN高一点。但是由于git是分布式的,所以不需要联网就可以将代码改动立即提交。提交到本地版本库之后,本地和远程的版本就不一样了,因此需要fetch、merge、push来同步版本库。

那么这点区别有什么意义呢?将代码提交到版本库里就有了记录,就可以查询可以恢复,相当于游戏的存档,而与远程服务器的交互因为需要网络,就有很大的不稳定因素,可能会失败,相当于游戏的打BOSS。SVN是将存档和打BOSS绑定到了一起,要打了BOSS后才可以存档进度;而git由于版本库在本地,所以随时随地可以存档,并且要求打BOSS前必须存档。

使用git最大的感触就是安全(故障率低、易恢复)、速度快

开始使用

git clone 克隆版本库

1
2
3
git clone https://github.com/xaoxuu/AXKit.git
# 或者
git clone https://github.com/xaoxuu/AXKit.git AXKit

git ignore 配置

要忽略某些文件的改动需要配置.gitignore文件:

1
2
3
4
5
6
7
8
9
10
11
12
# 这是macOS文件夹属性的隐藏文件,不需要同步到git
.DS_Store

# 某个文件夹不想要同步到git
/public
/node_modules

# 某个文件不想要同步到git
test.txt

# 通配符
._*

日常操作

add

1
2
# 把所有改动添加到版本库
git add --all

commit

1
2
git commit -m 'message'
# 注意,如果message没有空格的话,可以不加引号,言简意赅又节省时间。

pull/push

1
2
3
4
5
6
7
8
# 更新所有分支
git fetch

# 将dev分支合并到当前分支
git merge dev

# 将更新后的本地分支同步到远程
git push origin

代码冲突

我一般使用Tower客户端操作,pull之后有冲突的文件会列出来。建议使用一个比较好的编辑器如 Atom ,有冲突的部分会用两种颜色高亮。

版本回退

如果冲突文件没有妥善解决就提交到版本库导致严重后果,或者需要看到某个历史时刻的代码,都可以使用:

1
2
git log
# 查看提交记录

然后copy某个commit id,

1
2
3
4
5
git reset [commit id]
# 默认是soft,回到某个commit,而当前的代码依然在,处于未commit的状态。

git reset --hard [commit id]
# 彻底回到某个commit,完全回到那个时刻的状态。

版本迭代

分支branch

查看当前所有分支

1
git branch

新建并切换到新的分支dev

1
git checkout -b dev

仅仅切换到dev分支

1
git checkout dev

dev分支push到远程

1
git push origin dev

删除分支(dev)

1
2
3
4
5
6
7
8
# 删除本地分支
git branch -d dev

# 删除远程分支
# 方法一:将空白分支覆盖到远程dev分支
git push origin :dev
# 方法二:执行删除命令
git push origin --delete dev

标签tag

标签本质上和分支一样,适用于分支的操作也同样适用于标签,有区别的是:

查看所有tag

1
git tag

把当前HEAD打个tag(名为:1.0)

1
2
3
git tag 1.0
# 也可以添加备注信息,如同commit
git tag 1.0 -m 'message'

切换到某个tag(1.0)

1
git checkout 1.0

push到远程

1
2
3
4
# push所有未push的tag
git push --tags
# push指定的tag
git push origin 1.0

删除tag(1.0)

1
2
3
4
5
6
7
8
# 删除本地tag
git tag -d 1.0

# 删除远程tag
# 方法一:将空白tag覆盖到远程tag
git push origin :1.0
# 方法二:执行删除命令
git push origin --delete 1.0

客户端

Stash功能

  • save:将当前未commit的代码保存到stash,并且回到上次commit的状态。
  • apply:应用某个stash的代码。

Git-Flow功能

自动化管理功能,例如准备开发2.0版本的时候:
点击Start Release,客户端会自动新建一个release分支。

准备增加一个新特性的时候:
点击Start Feature,客户端会新建一个feature分支。

需要修复bug的时候:
点击Start Hotfix,客户端会新建一个fix分支。

当修复完bug,点击Finish Hotfix的时候,客户端会自动把fix分支合并到创建它的分支,并且创建一个tag。
当一个新特性开发完成,点击Finish Feature的时候,客户端会自动把feature分支合并到创建它的分支,并且创建一个tag。
当一个新版本开发完成,点击Finish Release的时候,客户端会自动把release分支合并到创建它的分支,并且创建一个tag。

相关下载

git环境

git客户端

代码编辑器

  • Atom (开源免费,功能强大,支持插件)
  • Sublime Text (收费)
git