常用 git 指令整理

238 阅读7分钟

Git

git 可分为 工作区(working dir) 和 git仓库(repository)

而git仓库又分为 暂存区(staging area) 和 提交区(commits)

git 每次提交追踪文件变化,而不是重复存储,所以占用空间小

branch 是分支

head 是目前所在的位置,detach head 是不从属于提交,独立的头

当签出到分支时,head为分支的最新提交

当签出到某个具体提交时,为 detach head

git指令解析

常用命令汇总

为了使命令更加语义化,更面向某个方面,更多使用新的指令,如

  • switch 切换分支,创建新分支
  • restore 恢复工作区文件、暂存区文件

配置、帮助相关

  • git --version 查看版本
  • git help [command] 查看某命令的帮助
  • git config --list 列出所有配置
  • git config [如user.name] 查看某项配置

常规指令

  • git init 初始化仓库
  • git status 查看 git 状态
  • git log 查看 git 日志
  • git add . 添加所有文件到暂存区
  • git commit -m "[message]" 提交,附带提交信息
  • git commit -am "[message]" 添加所有文件到暂存区并提交 = git add . + git commit -m ""
  • git checkout [commit id | branch name] 签出到某个提交或某个分支
  • git branch 查看分支
  • git branch [branch name] 创建分支 若分支名已存在则切换分支
  • git branch [-d | -D] 删除分支, d 为正常删除,D 为强制删除,无论分支是否被合并
  • git branch -m [old branch name] [new branch name] 重命名分支
  • git checkout -b [branch name] 创建分支并立即签出
  • git switch -c [branch name] 如上
  • git merge [branch name] 合并某分支
  • git reflog 更详细的git操作历史,可找回丢失的commit

还原文件

还原文件主要是

  1. 工作区文件还原为 head 状态
  2. 暂存区文件还原到 工作区

管理暂存区文件

  • git add [file] 添加某文件到暂存区
  • git ls-files 查看暂存区文件
  • git rm [file] 从暂存区删除文件

还原不在暂存区的文件

  • git checkout [file name] 将当前分支的某文件还原为 head 状态
  • git checkout . 全部文件还原为 head 状态
  • git restore [file] 用于代替上两行指令
  • git restore . 等效于 git checkout .

删除未被追踪的文件

  • git clean [-d | -dn | -df]

    • -d 删除未被追踪的文件和文件夹
    • -n 只列出,不删除
    • -f 强制删除

将暂存区的文件还原到工作区

  • git reset [file] 将某个暂存区文件移出暂存区,覆盖当前工作区的该文件
  • git restore --staged [file] 等效于上

回退分支

reset 的本质:移动 head,以及它指向的branch

会删除之前的 commit,推送时可能需要强制推送

  • git reset --soft head~1 回退分支 1个提交

    将提交删除,并保持暂存区的文件状态,分支回退之后的改动合并到回退前的暂存区

  • git reset head~1 回退分支 1个提交

    将提交删除,并删除暂存区的状态,也就是说,分支回退之后的改动全部合并到工作目录,暂存区的文件也会合并至 unstaged

  • git reset --hard head~1 回退分支 1个提交

    删除staged和unstaged的状态,也就是说,回到刚提交回退的那条commit时的状态

revert :反向操作,新建用于回滚的commit

  • git revert [-n] [commit hash| head~n] 回滚某个commit [-n] 是不提交,保存到 staged

  • git revert [-n] [commit hash | headn]..[commit hash| headn] 将两个commit 间的所有更改回滚,并且前一项时间更早

    如 git revert -n head~2..head 是回退前1、2个更改

暂存更改 stash

使用 git stash,灵活使用常用的两个参数

-u | --include-untracked 包含untracked文件

-k |--keep-index 不包含staged文件

  • git stash list 列出暂存
  • git stash 或 git stash push -m "" 压入暂存,可附带信息
  • git stash apply [index] 应用某个暂存
  • git stash pop [index] 应用并删除该暂存
  • git stash drop [index] 删除某个暂存
  • git stash clear 删除所有暂存
  • git stash -u -k 暂存除了staged文件以外的所有修改,可以用于划分多次commit

合并分支

fast-forward

如果当前分支和要合并的分支相比,没有额外的提交,那么合并只需要将 要合并的分支的head移至当前分支即可,不需要额外的commit

non fast-forward (recursive merge)

含额外提交,需要创建一个新的 merge commit

  • git merge --squash [branch name] 将要合并的分支所做的更改合并为一个未提交的commit
  • git merge --no-ff [branchName] 强制 non fast-forward 合并

合并产生冲突

  • git merge --abort 合并产生冲突时,取消合并
  • git log --merge 查看两个合并的commit
  • git diff 查看两个commit的不同

变基

git rebase 教程

原理:将要合并的分支中的当前分支更新

当前分支和要合并的分支一般是由同一个commit分出来的(m.2),变基会先应用要合并的分支的每个更改

然后以要合并的分支的最新提交作为基点,逐一应用 当前分支之后所做的更改

只能在本地分支进行这样的操作,因为变基会影响历史记录

  • git rebase [branch name] 将当前分支变基到某分支
  • git rebase --continue 继续变基
  • git rebase --skip 跳过此次rebase操作

使用 rebase 合并多次commit

git rebase -i [commit hash | head~n] 进入交互式变基

然后在编辑界面中保留第一个commit,修改 commit 信息

然后将后方的 commit 合并

pick:保留该commit(缩写:p)

reword:保留该commit,但修改该commit的注释(缩写:r)

edit:保留该commit, 但要停下来修改该提交(不仅仅修改注释)(缩写:e)

squash:将该commit和前一个commit合并(缩写:s)

fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)

exec:执行shell命令(缩写:x)

drop:我要丢弃该commit(缩写:d)

打标签

  • git tag 列出 tag
  • git tag [tag name] [branch name] 轻量设置tag
  • git tag -a [tag name] [commit id] -m "" 将 commit设为tag,并含tag注释
  • git show [tag name] 展示tagName对应的commit
  • git checkout [tag name] 签出到某tag,detach head 模式
  • git tag -d [tagName] 删除tag

标签默认不会传输到remote repo,需要使用

  • git push [repo name] [tag name] 提交某标签
  • git push [repo name] --tags 提交所有不存在的标签

远程协作

  • git remote 列出远程仓库
  • git ls-remote [repo name] 展示远程仓库的所有分支
  • git remote add [repo name(别名)] [URL] 添加某个远程库
  • git remote rm [repo name] 删除某个远程库
  • git remote show [repo name] 展示远程库详情
  • git branch -a 列出所有分支,包括 remote tracking branch
  • git branch -r 列出 remote tracking branch
  • git branch [-v -vv] 更详细的分支说明, -v 显示最新提交注释,-vv 显示 local tracking branch 对应的 remote tracking branch
  • git branch --track [branch name] [remote tracking branch name] 创建 local tracking branch,使本地分支追踪某 remote branch
  • git branch --delete --remotes [branch name] 删除 remote tracking branch

有了 local tracking branch 后,该分支就对应某个remote tracking branch 也对应remote branch 就可以直接执行git pull / git push了

  • git fetch [repo name] 拉取远程仓库,创建 remote tracking branch
  • git clone [URL] 克隆某仓库
  • git push [repo name] [branch name] 推送
  • git push -u [repo name] [branch name] 推送,同时将该分支设置为 local tracking branch (set upstream)
  • git push [repoName] --delete [branchName] 删除 remote branch,并删除该 remote tracking branch
  • git push --force 强制推送

当目前所在的分支为local tracking branch 时,可以直接使用

  • git push
  • git pull

其他

常用 commit message type

  • feat:新特性
  • fix:修复问题
  • docs:文档修改
  • style:代码格式修改
  • refactor:代码重构
  • build:构造工具或外部依赖的改动
  • revert:回退
  • test:测试用例修改
  • pref:提高性能的改动
  • ci:与持续集成服务有关的改动
  • chore:其他修改,如构建流程、依赖管理