1. 安装
Git 是跨平台的 可以下载安装 GitForWindows ,安装后将其添加到系统的Path即可。
在Linux下可以直接用命令行安装即可,主流的发行版本默认是自带的。
1.1 配置项
除了安装之外,需要配置一下
1
2
3
4
5
6
|
git config --global user.email=yweiyun@163.com
git config --global user.name=aresyang
git config --global core.editor=vim
#彩色的 git 输出
git config color.ui true
git config format.pretty oneline
|
如上命令会在 ~/.gitconfig 生成配置文件
1
2
3
4
5
6
|
cat ~/.gitconfig
[user]
email = yweiyun@163.com
name = aresyang
[core]
editor = vim
|
当前也可以将生成的配置文件拷贝到$HOME下,用于系统迁移。
还可以使用命令查看
1
2
3
|
git config --list
# 查看帮助
git help config
|
1.2 免登陆配置
通过如下命令生成公钥和私钥
1
|
ssh-keygen -t rsa -C "aresyang@gmail.com"
|
至于 $HOME/.ssh目录下,然后配置 config,可以为多个站点配置不同的用户名&授权sshkey,需要注意权限问题
1
2
3
4
5
|
cat ~/.ssh/config
Host github.com
HostName github.com
User westfly
IdentityFile ~/.ssh/westfly.rsa
|
2. 简介
2.1 基本命令
如下基本命令遵循建立、下载、修改、推送各个阶段
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
# 初始化一个空的repo
git init
# clone 一个库 http协议 # 如果是 private_repo 可能需要输入用户名&密码
git clone https://github.com/westfly/mssh.git
# 用ssh认证的方式clone,请确认有权限
git clone git@github.com:westfly/mssh.git
# 重命令为mymssh目录
git clone git@github.com:westfly/mssh.git mymssh
# 添加
git add README.md
# 查看当前状态(如果有修改会列出文件名)
git status
git commit -m "add README of Repo" README.md
# 推送到 remote
git push origin master:master
|
2.2 分支操作
分支的概念是为了多版本开发引入的,可以有多个branch,Git提供合并到主干(master)的功能。

如下是branches的一些命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# 如果没有则新建名为dev的branches
git branches dev
# 切换到dev branche,需要确认当前 branch 所有修改已经提交
git checkout dev
# 创建dev分支,并切换到dev分支
git checkout -b dev
# 与远程建立联系
git branch --set-upstream-to=origin/master master
# 删除本地 dev 分支
git branch -d dev
git branch -D dev # 强制删除
# 重命名分支
git branch -m newdev
|
2.3 工作目录
工作目录其实是一个本地的修改镜像,当用户提交后,推修改本地的Index,最后一次提交的记录被称为HEAD

2.4 更新和合并
1
2
3
4
|
#从remote的branch拉取最新的修改
git pull
# 合并
git merge
|
git pull & git merge 都会将remote & local的改动进行合并。
如果合并失败,则需要根据提示解决conflicts。
如果涉及到不同branch的合并,需要用到rebase命令
1
2
3
4
5
6
|
# 从 master 分支 rebase 修改到当前分支
git pull --rebase origin master:master
# 解决完冲突继续rebase
git rebase --continue
# 如果没有修改(或者解决冲突后是平的)则 --skip 掉即可
git rebase --skip
|
如果是fork第三方的仓库,为了跟原作者的repo通过,可以通过如下方式
1
2
3
|
git remote add upstream https://github.com/sogou/workflow
git fetch upstream
git merge upstream/master
|
2.5 Diff 和 Patch
Git 提供了两种补丁方案,一是用git diff生成的UNIX标准补丁.diff文件,二是git format-patch生成的Git专用.patch 文件。.diff文件只是记录文件改变的内容,不带有commit记录信息,多个commit可以合并成一个diff文件。.patch文件带有记录文件改变的内容,也带有commit记录信息,每个commit对应一个patch文件。
1
2
3
4
5
|
git diff
git diff commit_id1 commit_id2 > function.diff
#检查能否合并
git apply --check function.diff
git apply function.diff
|
2.6 撤销与恢复
1
2
3
4
5
|
git reset # 将已经add过的改回"Changed but not updated"状态
git reset file # 只撤销某个文件的add.
git reset --soft #
git reset --hard #
git reset HEAD^ # 将本地仓库的最近一个提交版本干掉. 最好不要干掉已经push出去的提交.
|
3. 标签
标签类似于svn的tag,提供一个发布的节点命名,可以是一个功能特性或BugFix等。
1
2
3
4
5
6
7
8
|
# 查看当前所有Tag
git tag
# 只list出有v1.8前缀的Tag
git tag -l 'v1.8.*'
# 新增tagv1.4
git tag -a v1.4 -m "v1.4 fix stringstream performance"
# 删除Tag
git tag -d v1.4
|
一般gitlab会提供WebUI,也可以在界面上操作,比较方便。
4. 杂项
4.1 添加gitignore文件
1
|
echo "*.d" > .gitignore #忽略编译生成的deps文件
|
业界 gitignore 文件可以从 https://www.gitignore.io/ 上查看并下载,如下是C++的一个示例
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
|
### C++ ###
# Prerequisites
*.d
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
|
4.2 历史记录
1
2
3
4
5
6
7
8
|
# 查看 当前branch的提交记录
git log
# 只看某一个人的提交记录:
git log --author=aresyang
# 一个压缩后的每一条提交记录只占一行的输出
git log --pretty=oneline
# 查看有哪些文件修改
git log --name-status
|
4.2 跨Repo合并更新
针对第三方库的情况,合并原Repo的Feature更新,如下是更新 https://github.com/chen3feng/toft 的方式,upstream 的名称可以修改。
1
2
3
4
|
git remote add upstream https://github.com/chen3feng/toft
git fetch upstream
git pull --rebase upstream master:master
git push orignal master:master
|
参考
git速查笔记
git - 简明指南