Git的一些总结

现代的团队开发离不开Git这样的团队协作工具,公司搭建了Gitlab服务器,每天的工作也是不断在 git addgit commitgit pullgit push …… 回头看看,发现每天只是机械的敲着命令,没有思考也没有总结,那现在就开始总结吧。

Git是什么?

Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Git是一个自由开源的分布式版本控制系统,旨在快速、高效地处理从小型到大型项目的任何事情。

以上是Git官网的自白(如翻译有误请斧正),实质是版本控制(Wiki另见)系统,特性是快速、高效。

为什么要用Git?

工具是意识的延展,Git-Flow展现了Git的灵魂。一个好的协作流程可以节省大量的沟通成本,而影响一个团队效率的根本就是(各种方式的)沟通。

Git解决的问题

  • 版本控制
    • 协同合作
    • 正确地版本存储
    • 恢复之前的版本
    • 了解发生了什么
    • 备份
  • 代码同步
  • 分支管理

与SVN的比较

参考SVN和GIT在日常使用中的明显差异

基本用法

我在日常工作中使用最多的命令就是:

1
2
3
4
5
6
7
$ git status
$ git diff
$ git add .
$ git commit -m "message"
$ git pull
# resolve conflict
$ git push

虽然是天天使用,但是并没有真正去了解每行命令,而且我把这写命令写到了一个shell脚本中,连”见面”的机会都没有了……下面就重新认识一下它们。

Git常用命令流程图

git status :显示有变化的文件

git diff :显示工作区和暂存区的差异

1
2
3
4
5
6
7
8
9
10
11
# 显示指定文件在暂存区与上个commit之间的差异
$ git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD
# 显示两次提交之间的差异
$ git diff [first-commit] [second-commit]
# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

git add :增加文件到暂存区

1
2
3
4
5
6
7
8
9
10
11
12
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录及其子目录(文件)到暂存区
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

git commit :提交暂存区到仓库区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 提交暂存区全部文件到仓库区,并附上提交信息
$ git commit -m [message]
# 提交暂存区指定文件到仓库区,并附上提交信息
$ git commit [file1] [file2] ... -m [message]
# 直接提交工作区自上次commit之后的变化到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 覆盖上次commit
# 如果文件没有变化,则用来修改上次commit的提交信息
$ git commit --amend -m [message]
# 覆盖上次commit指定文件的变化
$ git commit --amend [file1] [file2] ...

git pull :拉取远程仓库的变化,并与本地分支合并

1
$ git pull [remote] [branch]

git push :推送本地分支变化到远程仓库

1
2
3
4
5
6
7
8
# 上传本地指定的分支到远程仓库
$ git push [remote] [branch]
# 强行推送当前分支到远程仓库,覆盖远程仓库(慎用)
$ git push [remote] --force
# 推送所有分支到远程仓库
$ git push [remote] --all

进阶用法

我最近也是在实践Git-Flow和更多Git命令,所以这个部分就推荐一些参考博客吧。

Git配置

用户信息配置

Git配置分为了全局的配置和项目范围的配置,全局配置使用的比较多的就是设置全局用户和邮箱:

1
2
$ git config --global user.name "your_name"
$ git config --global user.email "your_email"

但是由于自己有Github账号,也有公司Gitlab的账号,所以全局配置的用户名和邮箱不能满足不同账号提交时的用户信息。为了解决这个问题,我取消了全局的用户和邮箱的配置:

1
2
$ git config --global --unset user.name
$ git config --global --unset user.email

而是在每个项目中配置改项目的用户信息:

1
2
3
4
$ cd /path/to/your/project # 进入具体项目的文件夹
$ git init # 初始化项目(.git目录存在则不需要)
$ git config user.name "your_name"
$ git config user.name "your_email"

执行以上命令后,进入项目的 .git 文件夹,查看 config 文件会发现多了[user] 项:

1
2
3
4
5
6
7
8
9
10
[branch "master"]
remote = origin
merge = refs/heads/master
[branch ...]
remote = ...
merge = ...
...
[user]
name = your_name
email = your_email

这样配置之后,不同范围的项目用户信息就不会互相干扰了。

SSH配置

修改Git全局配置文件

除了用户信息之外,不同项目的SSH Key也是不同的,接下来就介绍怎么给不同项目配置不同的SSH Key。

在用户目录下找到 .ssh 文件夹,找到 .ssh 文件夹下的 config 文件,没有就新建一个,在其中添加如下配置:

1
2
3
4
5
6
7
8
9
10
11
12
# Github
Host github # 给这个项目的服务器取个名,随意
HostName github.com # 项目的服务器名
User A # 项目服务器上注册的用户名
IdentityFile ~/.ssh/github/id_rsa # 该项目 SSH Key 所在路径
# Gitlab 其他服务器的配置,同上
Host mc
HostName mcltd.com
Port 1334 # 服务器端口号
User B
IdentityFile ~/.ssh/mc/id_rsa

生成SSH Key命令如下:

1
$ ssh-keygen -C "your_email" -t rsa
使配置生效

在具体项目的 .git 目录下找到 config 文件,做如下修改:

1
2
3
4
5
...
[remote "origin"]
url = git@github:A/project.git
fetch = +refs/heads/*:refs/remotes/origin/*
...

使用全局配置中的 Host 替换真实的服务器地址,这样Git才能识别。

结语

这次的总结只是将常用的操作梳理了一下,对常用的Git命令加深了了解。除此之外,Git还有很多概念和思想需要继续学习,今后的工作中,实践结合思考,加深对Git的理解,也继续把所得的收获分享给大家。