00. Git 操作一览 术语翻译:
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 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 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 使用教程》)