Git速查手册

本节阅读量:

注意:凡是带 -f、 –force 或者 –hard 参数的命令操作,以及带删除性质的命令,都属于高危操作,可能会造成文件或者版本丢失,一定要确认清楚后果再执行

基础命令


仓库和系统配置

1
2
3
4
5
6
git config --global user.name  "xxxx"                # 配置新 commit 的用户名
git config --global user.email "xxxx@example.com"    # 配置新 commit 的邮箱
git config --global credential.helper  store         # 以文本的方式保存 http 凭证
git config -l                                        # 查看所有配置信息
git config --global --unset <config>                 # 删除配置
git remote set-url origin https://xxxxxxx.git        # 设置 origin 地址

仓库初始化 与 代码拉取

1
2
3
4
5
git init                       # 初始化本地版本库
git clone <url>                # 克隆仓库
git fetch origin               # 拉取远端分支(不影响当前分支)
git pull origin                # 拉取远端分支,并 merge 到当前分支
git pull origin --rebase       # 拉取远端分支,将当前分支 rebase 为远端分支

文件操作

1
2
3
4
5
6
git add .                        # 跟踪所有改动过的文件
git add <file>                   # 跟踪指定的文件
git rm <file>                    # 删除文件
git checkout <file> <commit>     # 将文件或者目录检出(覆盖)为指定版本。commit 可不传,默认表示当前版本
git checkout --force/-f <file>   # **高危** 效果同上,--force 或者 -f 代表强制操作
git clean                        # **高危** 清理工作区中的 untracked 文件,需要配合参数使用:-f 清理文件,-d 清理文件夹,-x 清理原因 .gitignore 被忽略的目录

提交操作

注意:以下操作可能产生版本的移动,除了「git commit」外,其他命令需要确保工作区和暂存区是干净的才能执行(确保用「git status」看,所有曾被提交过的文件,均没有修改),否则,可能轻则命令执行失败,重则导致文件的临时修改被误清理。

1
2
3
4
5
6
7
git commit –m "描述信息"         # 提交代码到本地仓库
git commit --amend             # 修改最后一次改动
git merge <branch_name>        # 将指定分支合并到当前分支
git rebase <branch_name>       # 将当前分支变基到指定分支上
git cherry-pick <commit>       # 拣选指定 commit
git reset --hard <commit>      # **高危** 将当前分支的所有的文件和提交历史都还原到指定 commit
git revert <commit>            # 在当前基础上涂改掉某个历史版本

查看仓库情况

1
2
3
4
5
6
git status                     # 查看文件提交状态
git log                        # 查看历史
git diff                       # 查看变更内容
git blame <file>               # 逐行查看文件最新行的变更历史
git reflog                     # 查看本地最近的几次版本变更操作
git remote –v                  # 查看当前远程仓库地址

ref 操作

分支、tag 对 git 来说,都统称为 ref

1
2
3
4
5
6
7
8
9
git checkout –b <branch_name>                    # 创建并切换分支
git checkout <name>                              # 切换指定分支(ref、tag 或者 commit)
git branch <branch_name>                         # 创建分支
git branch -d <branch_name>                      # **高危** 删除指定分支
git tag                                          # 查看本地的 tag
git tag <tag_name>  <commit_id>                  # 创建轻量型 tag
git tag <tag_name>  <commit_id> -n "备注信息"      # 创建附注型 tag
git show-ref                                     # 显示本地所有的 ref
git update-ref -d  <ref_name>                    # **高危** 删除指定 ref

代码推送

1
2
3
4
5
6
git push origin <local>:<ref_name>              # 将本地的版本(分支名、commit、tag)推动到远端 ref
git push origin :<ref_name>                     # **高危** 删除远端 ref
git push origin <ref_name> -d                   # **高危** 删除远端 ref
git push origin <ref_name> -f/--force           # **高危** 强制覆盖远端 ref
git push origin <ref_name> --force-with-lease   # **高危** 效果同上,但更安全一些:推送之前会先检查远端的目标分支commit跟本地下载的是否一致,不一致则会push失败。这时需要执行git fetch更新本地版本,fetch后最好人工确认下新版本要不要继续执行强制覆盖
git push --mirror                               # **高危** 将比较本地和远端的差异,推送成功后,远端版本库将与本地保持一致,使用不当可能导致大量分支历史丢失,只建议bare版本库同步时使用

复杂场景


问题排查与仓库维护相关

1
2
3
4
5
6
7
git fsck --full                                        # 仓库完整性检查
ssh -T -v git@xxxxx.git                                # 测试 ssh 连接,并打印交互信息(-v)
GIT_CURL_VERBOSE=1 git ls-remote https://xxxxxxx.git   # 查看远端分支,并打印 http 日志(GIT_CURL_VERBOSE=1)
cat ~/.gitconfig                                       # 查看本地配置
cat .git/config                                        # 查看当前仓库配置
git gc                                                 # **高危** 回收未被 ref 引用到的对象
git remote prune origin                                # 对比远端分支,删除掉本地旧的、有冲突的分支

分支合并的三种方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 普通合并
git checkout target_branch
git merge --no-ff source_branch

# 压缩合并
git checkout target_branch
git merge --squash source_branch
git commit

# 变基合并
git checkout source_branch --detach
git rebase target_branch
git branch target_branch HEAD -f
git checkout target_branch

初始化并关联远程仓库

1
2
3
4
5
6
cd existing_folder
git init
git remote add origin <url>
git add .
git commit -m "init"
git push -u origin

更多详细内容

请参考Git文档: https://git-scm.com/book/zh/v2