Git
git 可分为 工作区(working dir) 和 git仓库(repository)
而git仓库又分为 暂存区(staging area) 和 提交区(commits)
git 每次提交追踪文件变化,而不是重复存储,所以占用空间小
branch 是分支
head 是目前所在的位置,detach head 是不从属于提交,独立的头
当签出到分支时,head为分支的最新提交
当签出到某个具体提交时,为 detach head
常用命令汇总
为了使命令更加语义化,更面向某个方面,更多使用新的指令,如
- 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
还原文件
还原文件主要是
- 工作区文件还原为 head 状态
- 暂存区文件还原到 工作区
管理暂存区文件
- 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 | head
n]..[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的不同
变基
原理:将要合并的分支中的当前分支更新
当前分支和要合并的分支一般是由同一个commit分出来的(m.2),变基会先应用要合并的分支的每个更改
然后以要合并的分支的最新提交作为基点,逐一应用 当前分支之后所做的更改
只能在本地分支进行这样的操作,因为变基会影响历史记录
- git rebase [branch name] 将当前分支变基到某分支
- git rebase --continue 继续变基
- git rebase --skip 跳过此次rebase操作
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:其他修改,如构建流程、依赖管理