Git 是一款免费开源的分布式版本控制系统工具, 以下是我在日常或工作使用时总结的 Git 常用命令。
目录
- 基本概念
- 安装
- 配置 (git config / .gitconfig)
- 忽略文件 (.gitignore / .gitkeep)
- 仓库 (git clone / git init / git remote)
- 分支 (git branch / git checkout)
- 提交 (git add / git commit / git push)
- 查看 (git status / git log / git diff / git show)
- 拉取 (git pull / git fetch)
- 合并 (git merge)
- 撤销/回滚 (git reset)
- 解决冲突 (git reset)
- Tag (git tag)
- Stash (git stash)
基本概念
- 工作区/工作目录(Workspace/Working Directory): 就是你平时存放项目代码的目录。
- 暂存区(Stage/Index):用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息, 一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 仓库区/版本库(Repository/Git Directory):就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本。
- 远程仓库(Remote Directory):gitee.com。
一般文件 Git 操作流程:
- 通过
vim REDEME.md
更改工作区
文件内容。 - 通过
git add
命令将工作区
文件添加到暂存区(Index/Stage)
。 - 通过
git commmit
命令提交到仓库区
。 - 通过
git push
命令推送到远程仓库
。
安装
- Windows
- Mac:
brew install git
- Git 可视化工具 - 适用于 Mac & Windows 平台
- sourcetree 相比 fork 卡、中文菜单、Bug?
- fork
配置
Git 全局配置, 默认Git
配置信息存储在用户目录即:~/.gitconfig
文件中。vim ~/.gitconfig1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20git config --global user.name "codezm"
git config --global user.email "codezm@163.com"
# 配置 - 保存账号及密码至本地 ~/.git-credentials,仅第一次手动录入账号及密码
git config --global credential.helper store
# macOS
# git config --global credential.helper osxkeychain
# windows
# git config --global credential.helper wincred
# 密码更换
# git config --global --unset user.password
# 开启行尾结束符自动转换,默认值是:false,crlf (Windows默认模式) to *unix lf 模式。
git config --global core.autocrlf true
# 配置 - 全局忽略文件, 默认文件不存在自行新建文件即可
git config --global core.excludesfile ~/.gitignore
# git 使用外部工具合并冲突后避免生成多余的 .orig 备份文件
git config --global mergetool.keepBackup false
# 查看 Git 配置信息。
git config --list1
2
3
4
5
6
7
8
9
10
11
12
13[user]
name = codezm
email = codezm@163.com
[credential]
helper = store
[core]
excludesfile = ~/.gitignore
editor = vim
[mergetool]
keepBackup = false
[alias]
co = checkout
lg = log --graph --pretty=format:'%Cred%h%Creset - %C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
忽略文件
Git 全局忽略规则配置文件,应用于所有 Git 项目,配置文件路径可使用命令
git config core.excludesfile
查看 ––– 默认不存在需配置。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
35
36
37
38
39$ vim `git config core.excludesfile`
####################################
######## OS generated files ########
####################################
.DS_Store
.DS_Store?
*.swp
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
####################################
############# packages #############
####################################
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip
# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so
*.pyc
# Logs and databases #
######################
*.log
*.sqliteGit 忽略规则配置文件:
.gitignore
,在单个 Git 项目下创建仅适用于此项目。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22# 忽略项目中所有 log 文件夹(/runtime/log、/log):
log
# 忽略项目根路径下整个 runtime 文件夹:
/runtime/*
# 但排除 runtime 根文件夹下某个文件:
!/runtime/wechat-post-data.log
# 注意: 若想排除以下文件是无效的。
# !/runtime/pid/swoole/master.pid
# 解决方案,这也是 `忽略某个文件夹,但又不想忽略这个文件夹下的某个子目录`的解决方案。
!/runtime/pid
/runtime/pid/*
!/runtime/pid/swoole
/runtime/pid/swoole/*
!/runtime/pid/swoole/master.pid
# 检查 UI-Images.zip 文件被哪个忽略规则所匹配:
git check-ignore -v /tags/UI-Images.zip
# 忽略规则强制添加至 Git 版本库:
git add -f /tags/UI-Images.zip.gitkeep
文件的作用Git 默认是不允许提交一个空目录到版本库的,可以在空的文件夹里面建立一个
.gitkeep
文件,然后提交去即可。其实在Git
中.gitkeep
就是一个占位符。示例: 需要 Git 提交 Yaf -
views
空目录。仓库
基于远程项目克隆至本地
首先,gitee 创建远端「 remote 」仓库: git-demo,然后克隆至本地目录:
1
2
3cd ~
git clone https://gitee.com/codezm/git-demo.git git-demo
cd git-demo基于本地项目创建 git 仓库
1
2
3
4
5
6cd <project>
git init
git remote add origin https://gitee.com/codezm/git-demo.git
git add .
git commit -m 'First commit.'
git push origin master修改本地项目 git 仓库地址
1
2cd <project>
git remote set-url origin <origin-url>
分支
新 Git 项目默认 ( git clone ) 所在分支为: master
。
1 | # 查看本地所在分支,带 * 表示当前所在分支. |
注意: 本地分支删除时需要先切换至其他分支再操作要删除的分支。
提交
1 | # 编辑工作区项目代码. |
查看
查看哪些文件改动了?「
git add
前查看 」1
git status
工作区文件. 「 git 文件差异对比 」
1
2
3
4git diff
# 对比某一文件差异
# git diff <file-name>暂存区文件:
git add
. 「 git 文件差异对比 」1
2
3
4git diff --cached
# 对比某一文件差异
git diff --cached <file-name>版本库文件:
git commit
. 「 git 文件差异对比 」1
2
3
4
5
6
7
8
9# 查看此 <COMMIT-ID> 所有文件更改详情.
git show <COMMIT-ID>
# 示例-仅查看指定文件: git show a09ce4377cd292 README.md
# 示例-使用某次COMMIT文件内容: git show 0cc28f7194a19b3303c2cf:README.md
# 对比两次 <COMMIT-ID> 的文件更改详情.
# git diff <COMMIT-ID>...<COMMIT-ID> README.md
# 对比两次 <COMMIT-ID> 涉及的所有文件名
# git diff <COMMIT-ID>...<COMMIT-ID> --name-only修改了哪些文件?「
git commit
后查看 」1
2
3
4
5
6
7
8
9
10git log --stat
# git show <COMMIT-ID> --name-only
# 展示最后一次提交修改的文件
# git log --stat -n 1
# 查看<文件>commit历史, 展示 <commit-id> <comment-message>
# git log --oneline <filename>
# 查看某个文件的历史改动
# git blame <filename>拉取
git fetch 是将远程主机的最新内容(所有远程仓库的 branch、tag)拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
git pull 则是将远程主机的最新内容拉下来后直接合并,即:
git pull = git fetch + git merge
。1
2
3
4git pull origin/master
# git fetch
# git merge origin/master
合并
1 | git checkout dev |
撤销/回滚
1 | # 非 Git 项目管理文件撤销「 删除 」, 即: 不在 git 版本控制下的新增文件 |
冲突解决
分支 hanlu、kakaguo 同时修改 README.md
文件.
1 | git checkout hanlu |
Tag
打标签、项目版本管理.
1 | # 创建 Tag |
Stash - 贮藏
适用场景: 临时合并他人分支存在 - 同时更改相同文件、分支可能存在冲突。
1 | git stash |
注意: git stash pop
如果存在冲突文件将导致 drop
失败。
结语
- 每次
git push
前,先拉取下git pull origin master
/git pull origin dev
代码。 - 仅merge部分文件:
git rebase -i
。 - 仅stash部分文件:
git stash -p
。 - 批量还原: git status | grep “修改” | awk ‘{print $2}’ | grep -v “git” | xargs git checkout –
- 批量删除: git status | grep “/“ | grep -v “origin/master” | xargs rm -rf