0%

常用git命令总结

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相同
  • 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:开启lfs

    • git 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>即可。