玩转 Git

00. Git 操作一览

upload successful
术语翻译:

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:版本库、仓库(本地仓库)
  • Remote:远程仓库

补充说明:

上图不是太准确,在Remote 和 Repository 内部都还有个 Branch 的概念,单不太影响整体理解。

01. Git 配置

配置级别

1
2
3
--system # 系统级别
--global # 用户全局
--local # 单独一个项目

基本配置

1
2
3
git config --global user.name "xxxx" # 用户名
git config --global user.email "xxxx@xxx.com" # 邮箱
git config --global core.editor vim # 编辑器

设置别名

1
2
3
4
5
6
7
8
git config --global alias.st status
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.df diff
git config --global alias.unstage reset
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.last "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit -1 HEAD"

列出所有配置

1
2
git config -l
# git config 命令实际上就是在操作 .gitconfig 文件

02. Git 基本操作

初始化

1
2
git init
git init --bare # 初始化一个裸仓库

查看状态

1
git status

将工作区的修改提交到暂存区

1
2
git add .
git add <file>

将暂存区的内容提交到版本库

1
2
3
4
git commit .
git commit <file>
git commit -am # 相当于 git add + git commit 或 git rm + git commit
git commit --amend

查看提交记录

1
2
3
git log
git reflog
git reflog show master

撤销工作区修改

1
2
3
# 使用暂存区的内容状态去覆盖工作区的内容状态
git checkout <file>
git checkout .

回收站管理

1
2
3
4
5
git stash # 将工作区做的修改暂放到一个 git 回收站中(栈结构)
git stash list # 查看栈中所有记录
git stash apply <回收站记录编号> # 应用回收站记录编号对应的内容到工作区,如果不指定默认为栈顶,注意:恢复后内容还在回收站
git stash pop # 将回收站栈顶的内容恢复到工作区,并从栈中弹出
git stash clear # 清空回收站

撤销暂存区修改

1
2
3
4
5
# 其实是重置HEAD,将指定版本id的内容状态去覆盖暂存区
git reset <file> # 从暂存区恢复到工作区(不指定版本id,则默认为最后一次提交的版本id)
git reset .
git reset $id # 恢复到指定的提交版本,该$id之后的版本提交都恢复到工作区
git reset --hard $id # (任意门)恢复到指定的提交版本,该$id之后的版本提交全部会被抛弃,将不出现在工作区

撤销某次提交

1
2
3
# 提交的回滚操作,不影响其他的提交,会产生新的提交id
git revert <$id>
git revert HEAD

删除文件

1
2
3
rm + git commit -am
git rm + git commit
git rm --cached <file> #从暂存区移除该文件,git将不再跟踪该文件的变更,但仍在工作区内,可添加入 .gitignore

比较差异

1
2
3
4
5
git diff
git diff <file>#比较工作区与暂存区文件的差异
git diff --cached # 比较暂存区和版本库差异
git diff <$id1><$id2># 比较两次提交之间的差异
git diff <branch1>..<branch2># 在两个分支之间比较

Tag

1
2
3
4
5
6
7
8
9
10
# 列出 tag
git tag
# 打 tag
git tag -a <tag_name> -m "xxx" <commit_id>
# 查看 tag
git show <tag_name>
# 删除本地 tag
git tag -d <tag_name>
# 推送本地 tag 到远程仓库
git push origin <tag_name>

03. Git 分支操作

创建分支

1
git branch <branch_name>

查看分支

1
2
3
git branch
git branch -r
git branch -a

切换分支

1
2
git checkout <branch_name> # 切换分支
git checkout -b <branch_name> # 创建分支并切换

删除分支

1
2
3
git branch -d <branch_name> # 删除分支
git branch -D <branch_name> # 强制删除分支
git push origin :<branch-name> # 删除远程分支(前提是先在本地删除该分支),原理是把一个空分支push到server上,相当于删除该分支

分支重衍

1
2
git rebase <base_branch> <branch>
git rebase -i

04. Git 远程操作

克隆

1
2
git clone <URL>
git clone --bare <URL> # 克隆出一个裸仓库

查看远程仓库名字和URL

1
git remote -v

查看远程服务器仓库状态

1
git remote show <repo_name>

添加远程仓库

1
git remote add <repo_name> <URL>

修改远程仓库URL

1
git remote set-url <repo_name> <URL>

删除远程仓库

1
git remote rm <repo_name>

创建本地分支指向对应远程仓库的分支

1
2
git checkout -b <branch_name> origin/<branch_name>
# 新版本,可直接使用 git checkout <branch_name>

从远程仓库拉取分支并合并

1
2
3
4
5
git fetch <repo_name> <branch_name>
git merge <branch_name>
git pull <repo_name> <branch_name>
# git pull = git fetch + git merge

往远程仓库推送分支

1
2
3
4
5
6
git push # push所有分支
git push origin master # 将本地主分支推到远程主分支
git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch># 创建远程分支, origin是远程仓库名
git push origin <local_branch>:<remote_branch># 创建远程分支
git push origin :<remote_branch># 先删除本地分支(git br -d <branch>),再执行该 push 命令删除远程分支

05. Git Submodule

(详见《Git Submodule 使用教程》)