clone 仓库相关
git clone仓库有两种形式,一种是以ssh协议的形式,另外一种是以https协议的形式。使用ssh协议的形式时,需要将ssh公钥上传到github或者gitlab。使用https协议需要在clone的时候输入github或者gitlab的账号和密码。
git clone [-b <branch name>] <repository url>
- -b 执行需要拉取的分支,不指定则拉取master分支
git clone https://<username>:<password>@<repository url>
- 在使用https协议拉取仓库的时候,直接在url中指定账户和密码,@作为分割符,如果账户或者密码中含有“@”符,则需要将其替换为“%40”
工作区、暂存区状态相关
git status
- 查看工作区和暂存区的文件状态
git add <filename>
- 将工作区的某个文件添加到暂存区
git add .
- 将工作区全部文件添加到暂存区
git commit -m"[commit message]"
- 提交暂存区的文件修改到本地仓库
git rm <filename>
- 取消对文件的追踪
提交历史相关
git log --graph --pretty=oneline --abbrev-commit [filename]
- 查看当前分支的提交历史
- —graph:以图表的新式
- —pretty=oneline:只显示commit信息,不显示提交作者和时间等其他信息
- —abbrev-commit:commit id以简写的形式展示
- filename: 可选项,只显示某个文件的提交历史
git reflog
- 查看操作记录,借助该命令可以取消版本回退。
git reset [--soft|--mixed|--hard] HEAD^
- 将当前分支的提交回退到上一个提交
- —soft:当前提交修改会保存到暂存区,并且当前工作区和暂存区的修改也会保留
- —mix:当前提交的修改会保存到工作区,并且当前暂存区的修改都会移到工作区
- —hard: 丢弃当前提交的修改,并且丢弃当前工作区和暂存区的修改
- --mix是默认的选项
- 一个快速清除当前暂存区和工作区的命令:
git add . && git reset --hard HEAD
。注意没有”^”,否则就回退到了上个提交
git reset [--soft|--mixed|--hard] HEAD~<number>
- 回退当前分支提交到上number个版本
git reset [--soft|--mixed|--hard] HEAD <commit id>
- 回退当前分支提交到指定的commit id
git checkout <commit id> <filename>
- 只将某个文件回退到某个版本
分支相关
git branch
- 查看本地有哪些分支
git branch <branch name>
- 创建分支,但是目前仍然位于当前分支
git branch <branch name> <commit id>
- 基于commit id创建分支,目前仍位于当前分支
git checkout -b <branch name>
- 创建并切换分支
git checkout -b <branch name> <commit id>
- 基于某个commit id创建并切换分支
git checkout <branch name>
- 切换分支,如果本地没有对应分支但是远程仓库有,则将对应的远程分支拉取到本地并切换到对应分支
git branch -d <branch name>
- 删除分支,如果分支有提交但是没有合入其他分支,会报错
git branch -D <branch name>
- 强制删除某个分支
git checkout -f <branch name>
- 强行切换到某个分支,如果当前工作区和暂存区有内容,将丢弃这些内容
合并相关
git merge <branch name>
- 将branch name对应的分支合并到当前分支
- 如果合并有冲突,需要手动解决冲突(到有冲突的文件进行编辑)后,执行add和commit
远程仓库相关
git remote add origin <remote repository url>
- 关联远程仓库
git remote remove origin
- 取消关联远程仓库
git push origin <branch>
- 将本地分支的commit推送到到远程分支
git push --force-with-lease origin <branch>
- 以最小强制更新的手段,将本地分支推送到远程分支
- 尽量不要强制推送远程分支,尤其是其他人开发的分支
git push origin --delete <branch>
- 删除远程分支
子模块相关
git submodule add <repository> <dir>
- 添加子模块,子模块的链接为url,添加到相对于当前目录的dir目录下
git submodule init
- 读取本地子模块配置文件
git submodule update
- 拉取子模块
git submoduel update <submodule dir path>
- 拉取指定的子模块
git clone --recurse-submodules
- 拉取带有子模块的仓库时,同时也拉取子模块
tag相关
git tag
- 查看所有的标签
git tag <tag name>
- 创建一个轻量标签,轻量标签建议在创建临时标签时使用
git tag -a <tag name> -m <tag message>
- 创建一个附注标签,正式标签使用
git show <tag name>
- 查看标签信息和与之对应的提交信息
git push origin <tag name>
- 将标签推送到远程仓库
git tag -d <tag name>
- 删除本地标签
git push origin --delete <tag name>
- 删除远程标签
rebase相关
git rebase <branch name>
- 将当前分支rebase到branch name对应的分支
git rebase -i HEAD~<num>
- 将当前提交和当前提交前的共num个提交合并为
git rebase --abort
- rebase 有冲突时,取消rebase
git rebase --continue
- rebase 冲击解决后,继续执行rebase操作
stash 相关
stash 通常用于当前在一个分支有代码的更新放在工作区或者暂存区,但是需要临时去处理其他分支的代码,又不行在当前分支进行提交操作,那么可以先将当前分支中工作区和暂存区的代码stash起来,之后再pop回来。
git stash save <message>
- 将当前工作区和暂存区的修改保存到其他地方,并将当前工作区和暂存区清空
git stash list
- 查看stash 的列表
git stash pop [index | stash_id]
- 如果不传index或者stash id参数,将stash列表的最后一个stash恢复到工作区和暂存区,并将该stash从stash list中删除
- stash list的存储结构是一个栈结构,最后stash的stash id最小,也最新被pop出来
- 如果传入index或者stash id参数,则将其对应的stash恢复到工作去和暂存区,并将该stash从stash list中删除
git stash apply [index | stash_id]
- 除了不删除对应的stash外,其他 和
git stash pop
相同
- 除了不删除对应的stash外,其他 和
git stash drop [stash id]
- 删除一个存储进度
git stash clear
- 清除stash list
特殊文件
.gitignore
- 记录git应该不对哪些文件进行跟踪的配置
.gitmoduels
- 记录子模块信息的文件
.gitattributes
- git-lfs应该处理的文件信息
.gitlab-ci.yml
- gitlab ci配置文件
其他
git-lfs
git大文件处理工具
git lfs install
:开启lfsgit lfs track *.zip
:将zip文件作为lfs文件管理GIT_LFS_SKIP_SMUDGE=1 git xxx
:此次操作不会去下载lfs文件
- 分离头指针
- 当前HEAD指针所指向的commit没有和任何分支关联,这种情况一般出现在直接从某个commit checkout出来的情况(即执行了
git checkout <commit id>
)。如果在分离头指针进行了代码修改并提交后,再切换到其他分支,那么这个提交就会丢失,活都白干了。正确做法是为该分离的头指针创建branch进行关联,这时执行git checkout -b <branch>
即可。
- 当前HEAD指针所指向的commit没有和任何分支关联,这种情况一般出现在直接从某个commit checkout出来的情况(即执行了