一、GIT常用命令字典

Git

# git config 配置

  • git config --global user.name 'hello' 设置全局用户名hello
  • git config --global user.email 'hello@zuoyebang.com' 设置全局邮箱hello@zuoyebang.com
  • git config user.name 查看配置中的配置项(用户名)
  • git config user.email 查看配置中的配置项(邮箱)
  • git config --global core.editor emacs 配置默认的文本编辑器
  • git config --global merge.tool vimdiff 配置比较工具用来解决冲突
  • git config --list 列出Git可以在该处找到的所有的设置
  • git config -–add site.name hello 默认是添加在 local配置中的新配置项
  • git config [--local | --global | --system] –unset site.name 删除配置项中的site.name配置值
  • git config --global alias.别名 命令 给命令设置别名,例如给git status 设置别名为s,git config --global alias.s status

# git help 显示有关Git的帮助信息

  • git --help 在git窗口查看命令
  • git help config/git config --help/git --help config 查看git config如何使用
  • git help git/git --help git 显示git手册页
  • git help help/git --help help 查看help命令如何使用

# git init 初始化

  • git init 创建一个空的Git仓库或重新初始化一个现有仓库

# git add 将文件内容添加到暂存区

  • git add <path> 把path中的文件或者目录添加到暂存区
  • git add ./git add */git add -A 把所有的修改都添加到暂存区中
  • git add -u <path>
  • git add -i

# git clone 将存储库克隆到新目录中

  • git clone <版本库的网址>
  • git clone <版本库的网址> <本地目录名>
  • git clone --bare
  • git clone -l
  • git clone -s
  • git clone -n
  • git clone --reference
  • git clone -o jQuery https://github.com/jquery/jquery.git 克隆远程主机到本地,并将远程主机重命名为jQuery,默认是origin
  • git clone --recursive git@github.com:rbind/yihui.git 克隆库的时候要初始化子模块,加 --recursive 参数

# git status 查看状态

  • git status 显示工作目录和暂存区的状态
  • git status -uno

# git diff 显示提交和工作树等之间的更改

  • git diff 是查看working tree与暂存区文件的差异
  • git diff <file> 比较某文件和暂存区文件差异
  • git diff --cached/git diff --staged/ 比较暂存区和上次commit的HEAD的差异
  • git diff HEAD 显示工作版本(Working tree)和上次commit的HEAD的差异
  • git diff HEAD^ HEAD 比较上次提交和上上次提交的差异
  • git diff HEAD -- ./lib 显示当前目录下的lib目录和上次提交之间的差别(更准确的说是在当前分支下)
  • git diff commitID1 commitID2比较两个历史版本之间的差异
  • git diff topic 比较当前分支与topic分支的差别
  • git diff topic dev /git diff topic..dev 在dev和topic两个分支之间比较变更
  • git diff --stat 仅仅比较统计信息(简单结果)

# git commit 提交

  • git commit 将暂存区中的文件、描述、更改用户、日志消息一起提交到存储库
  • git commit -a/git commit --all 将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。(建议一般不要使用-a参数)
  • git commit -m 'message' /git commit --message 'message' 简要说明提交的信息
  • git commit --amend 追加提交,它可以在不增加一个新的commit-id的情况下将新修改的代码追加到前一次的commit-id中
  • git commit -v 查看要提交的内容与版本库中的比较,然后进行提交

# git reset 将当前HEAD复位到指定状态,用于撤消之前的一些操作

  • git reset 将暂存区里的所有文件恢复到工作树中
  • git reset <path> 将暂存区里的指定文件恢复到工作树中
  • git reset -- README.md 将暂存区的单独一个文件恢复到工作树中。
  • git reset --soft HEAD^ commit之后取消本地提交,回到没有提交之前的暂存区中。
  • git reset --hard commit_id
  • git reset --hard HEAD~3 永久删除最后几个提交
  • git reset --hard ORIG_HEAD 执行git pull完后,发现这次拉取下来的修改不满意,想要回滚到git pull之前的状态,并清空本地没有加入暂存区的内容。
  • git reset --merge ORIG_HEAD 执行git pull完后,发现这次拉取下来的修改不满意,想要回滚到git pull之前的状态,可以避免在回滚时清除工作区,保留暂存区和工作树的内容。
  • git reset --soft
  • git reset --keep start

# git rm 从工作区和暂存区中删除文件

  • git rm test.txt 删除test.txt文件,并把它从git仓库管理系统中删除,需要执行git commit才能真正提交到git 仓库
  • git rm -r mydir 删除mydir文件夹,并把它从git的仓库管理系统中删除
  • git rm --cache test.txt 从暂存区中移除test.txt文件,对文件本身不进行改变。
  • git rm -f 取消rm操作

# git mv 移动或重命名文件,目录或符号链接

  • git mv <source> <destination> 例如:git mv test.txt mydir 将test.txt文件移动到mydir目录下
  • git mv test.txt test1.txt 将test.txt文件重命名为test1.txt

此操作必须要在暂存区或者文件commit之后才能进行rename,此时不需要再git add, 否则会报错
fatal: not under version control, source=home/test.txt, destination=home/test1.txt )

  • git mv -f
  • git mv -k

# git branch 列出,创建或删除分支

  • git branch 查看本地分支和当前分支
  • git branch test 新建test分支(还在当前分支中)
  • git branch -a 查看本地分支和远程分支
  • git branch -r 查看远程分支
  • git branch -m test test1 修改本地分支名称
  • git branch -d test 删除本地分支
  • git branch -D test 强制删除本地test分支,有时候-d的时候回提示没有完全合并
  • git branch --set-upstream dev origin/test 将本地dev分支与远程主机的test分支建立追踪关系

Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。比如,在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。

# git checkout 切换分支或恢复工作树文件

  • git checkout dev 切换新分支(没有commit的文件会跟随新分支切换)
  • git checkout -b hello 创建并切换到新分支hello
  • git checkout -B hello 强制创建并切换到新分支,如果当前目录有这个分支,进行覆盖操作
  • git checkout [commitID] 切换到某一个提交版本的分支
  • git checkout --detach hello 切换到hello分支的最后一次提交的commitID版本的分支
  • git checkout --orphan <branch>
  • git checkout --merge <branch>
  • git checkout -p <branch>
  • git checkout <tagName> 切换到tagName标签的分支中

# git merge 将两个或两个以上的开发历史加入(合并)一起

  • git merge hello 合并hello分支到当前分支

Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。这种合并看不出来曾经做过合并。

  • git merge hello1 hello2 合并hello1和hello2分支的东西到当前分支,多个分支合并。
  • git merge --abort 放弃合并
  • git merge --continue 合并继续,这个命令后是修改合并生成的commit信息
  • git merge -s ours obsolete
  • git merge --no-ff -m "merge with no-ff" dev 普通模式合并,合并后历史上有分支,能看出来曾经做过合并,表示禁用Fast forward,准备合并dev分支,因为要创建一个新的commit,所以加上-m参数,把commit的表述写进去

# git mergetool 运行合并冲突解决工具来解决合并冲突

  • git mergetool git设置 mergetool 可视化工具。可以设置BeyondCompare,DiffMerge等作为git的比较和合并的可视化工具,方便操作。

# git log 显示提交日志信息

  • git log 显示提交日志信息
  • git log --no-merges 显示整个提交历史记录,但跳过合并记录
  • git log dev home 显示home子目录中的任何文件的所有提交
  • git log --graph 可以看到分支合并图
  • git log -3 查看最近三次提交
  • git log --author=csf 查看csf作者的提交记录
  • git log --after={2019-03-01}/git log --since={2019-03-01} 查看2018-03-01日之后的提交记录,包括当前日期
  • git log --until={2019-03-01}/git log --before={2019-03-01} 查看2018-03-01日之前的提交记录,不包括当前日期
  • git log --until={2019-03-07} --after={2019-03-05} 查看2018-03-05到2018-03-06两天的提交记录
  • git log commitID 查看包含commitID之前的历史记录
  • *git log commitID1 commitID2 查询commit1与commit2之间的记录,包括commit1和commit2
  • *git log commitID1..commitID2 查询commit1与commit2之间的记录,不包括commit1
  • git log HEAD^ HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
  • git log HEAD~2 HEAD~2代表倒数第二次提交
  • git log --pretty=oneline 按指定格式显示日志信息(显示一行,可选项有:oneline,short,medium,full,fuller,email,raw以及format:,默认为medium)
  • git log --pretty=oneline --abbrev-commit 按指定格式显示日志信息,显示一行,commitID使用7位数
  • git log --pretty=format:"%an %ae %ad %cn %ce %cd %cr %s" --graph 自定义格式图文形式输出

选项说明
%H —— 提交对象(commit)的完整哈希字串
%h —— 提交对象的简短哈希字串
%T —— 树对象(tree)的完整哈希字串
%t —— 树对象的简短哈希字串
%P —— 父对象(parent)的完整哈希字串
%p —— 父对象的简短哈希字串
%an —— 作者(author)的名字
%ae —— 作者的电子邮件地址
%ad —— 作者修订日期(可以用 -date= 选项定制格式)
%ar —— 作者修订日期,按多久以前的方式显示
%cn —— 提交者(committer)的名字
%ce —— 提交者的电子邮件地址
%cd —— 提交日期
%cr —— 提交日期,按多久以前的方式显示
%s —— 提交说明

# git stash 将更改储藏在脏工作目录中

  • git stash/git stash save 将更改储藏在脏工作目录中(只是会将git跟踪的文件(unstaged changes)和暂存区中的文件(staged changes)进行修改)
  • git stash -u 将更改储藏在脏工作目录中(git跟踪的文件(unstaged changes)、暂存区中的文件(staged changes)、工作目录中的新文件(untracked files))
  • git stash -a/git stash --all 将当前目录的所有文件都进行储藏(git跟踪的文件(unstaged changes)、暂存区中的文件(staged changes)、工作目录中的新文件(untracked files)、被忽略的文件(ignored files))
  • git stash list 查看现有的储藏
  • git stash apply 应用最新一次储藏的内容,不删除赃工作目录
  • git stash apply stash@{2} 应用指定储藏版本的内容
  • git stash apply --index
  • git stash drop stash@{0} 删除指定储藏版本的内容,之后的名称1会变成从0开始
  • git stash pop 应用最新一次储藏版本的内容,并将其从堆栈中移走,此时运行git stash list将没有这个储藏的记录
  • git stash show/git stash show stash@{0} 查看最新一个stash的diff统计信息
  • git stash show -p/git stash show -p stash@{0} 查看最新一个stash的展开diff
  • git stash clear 删除所有缓存的stash
  • git stash branch testNew 从stash创建分支,如果成功,将会丢弃储藏。

如果你储藏了一些工作,暂时不去理会,然后继续在你储藏工作的分支上工作,你在重新应用工作时可能会碰到一些问题。如果尝试应用的变更是针对一个你那之后修改过的文件,你会碰到一个归并冲突并且必须去化解它。如果你想用更方便的方法来重新检验你储藏的变更,你可以运行 git stash branch,这会创建一个新的分支,检出你储藏工作时的所处的提交,重新应用你的工作,如果成功,将会丢弃储藏。这是一个很棒的捷径来恢复储藏的工作然后在新的分支上继续当时的工作。

# git tag 创建,列出,删除或验证使用GPG签名的标签对象

为什么有commit还要有tag?因为每次记commitID很复杂,直接找commit对应的有意义的tag,就很好找了。

  • git tag/git tag -l/git tag -l <tagName> 查看所有标签、查看指定标签
  • git tag <name> 当前分支的最新HEAD打新标签
  • git tag <name> <commitID> 给对应的某个commitID打标签
  • git tag <name>-light 创建轻量标签
  • git tag -a <name> -m "message" 创建带有说明的标签,即注释标签,用-a指定标签名,-m指定说明文字
  • git tag -d <name> 删除本地标签
  • git tag start ?

# git remote 管理远程主机

  • git remote 列出所有远程主机
  • git remote -v 查看远程主机的网址
  • git remote show <主机名> 查看主机的详细信息
  • git remote add <主机名> <网址> 添加远程主机
  • git remote rm <主机名> 删除远程主机
  • git remote rename <原主机名> <新主机名> 重命名远程主机

# git fetch 从另一个存储库下载对象和引用

通常是将远程主机的版本库有了新的commit的时候,将这些更新取回本地,这个命令通常用来查看其他人的进程,因为它取回的代码对本地的开发代码没有影响。
可以使用git merge和git rebase命令,在本地分支合并远程分支。
这个命令主要是在合并之前可以看看有哪些地方进行了修改

  • git fetch <远程主机名> 将远程主机的更新全部取回本地,默认是所有分支的更新
  • git fetch <远程主机名><分支名> 取回远程主机中的特定分支的更新(git fetch origin dev)
  • *git fetch origin branch1:branch2

首先执行上面的fetch操作,使用远程branch1分支在本地创建branch2(但不会切换到该分支),如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,如果本地存在branch2分支, 并且是`fast forward', 则自动合并两个分支, 否则, 会阻止以上操作.

git fetch origin :branch2 等价于: git fetch origin master:branch2

# git pull 从另一个存储库或本地分支获取并集成(整合)

取回远程主机某个分支的更新,再与本地的指定分支合并,它的完整格式稍稍有点复杂。
默认模式下,git pull 是git fetch 和git merge FETCH_HEAD的缩写

  • git pull <远程主机名> 将远程主机的全部分支取回并与本地分支合并,如果当前分支和远程分支有追踪关系,git pull就可以省略远程分支名。

  • git pull <远程主机名><远程分支名> 将远程主机的某一个分支取回和本地当前分支合并

  • git pull <远程主机名><远程分支名>:<本地分支名> 将远程的某一分支取回和本地某一分支进行合并(git pull dev:test)

  • git pull --rebase <远程主机名><远程分支名>:<本地分支名> 将远程某一分支取回和本地某个分支进行rebase合并,不写默认是merge

  • *git pull -p 如果远程主机删除了某个分支,就会在本地删除远程已经删除的分支 (等同git fetch --prune origin → git fetch -p)

# git push 将本地分支的更新,推送到远程主机

  • git push 如果远程主机和当先分支有追踪关系,那么主机名可以忽略,默认是将所有的分支都取回
  • git push <远程主机名><远程分支名>:<本地分支名> 将本地某一分支推送到远程主机的某一分支上

git push origin 如果远程主机和当先分支有追踪关系,将本地当前分支推送到origin远程主机的对应分支
git push origin test 将本地的当前分支推送到远程主机的test分支,如果test分支不存在,则会被新建
git push origin test:test1 将本地的test分支推送到origin远程主机的test1分支上

  • git push <远程主机名> --delete <远程分支名> / git push <远程主机名> :<远程分支名> 删除远程某一分支(第二种相当于推送一个空的本地分支到远程分支,也是删除远程分支的)

git push origin --delete test /git push origin :test 删除远程test分支

  • git push --all origin 将所有本地分支都推送到origin远程主机(当远程主机的版本bii本地版本更新的时候,推送时git会报错,要求先在本地做git pull合并差异)
  • git push --force origin/git push -f origin 将本地分支强推送到origin远程主机,结果导致在远程主机产生一个”非直进式”的合并(non-fast-forward merge)。除非你很确定要这样做,否则应该尽量避免使用–-force选项。
  • git push -f origin dev:student 将本地的dev分支强覆盖origin远程主机的远程student分支
  • git push -u origin master 如果当前分支与多个主机存在追踪关系,使用-u指定一个默认主机,这样就可以不加任何参数的使用git push(这个是指定了origin主机的master为默认选项)
  • git push origin <tagName> 推送某个标签到远程分支
  • git push origin --tags 一次性推送全部尚未推送到远程的本地标签
  • git push origin :<tagname> / git push origin :refs/tags/<tagname> 删除一个远程标签

# git submodule 初始化,更新或检查子模块

  • git submodule add http://github.com/chaconinc/DbConnector 添加一个名为 “DbConnector” 的库。默认情况下,子模块会将子项目放到一个与仓库同名的目录中,如果你想要放到其他地方,看下面。
  • git submodule add <版本库的网址> <本地目录名> 把某版本库添加到本地的某个目录中。
  • git submodule update --init --recursive 已经克隆了主库但没初始化子模块
  • git submodule update --recursive --remote 已经克隆并初始化子模块,而需要从子模块的源更新这个子模块.更新之后主库的,git 差异中会显示新的 SHA 码,把这个差异选中提交即可。
  • git submodule 查看子模块
  • git submodule update 更新项目内子模块到最新版本
  • git submodule update --remote 更新子模块为远程项目的最新版本
  • git submodule init 初始化子模块

# git show 用于显示各种类型的对象

  • git show tagName 看到说明文字

# git shortlog 汇总git日志输出

  • git shortlog 汇总每个人的commit记录,进行简单输出
  • git shortlog -s 参数省略每次 commit 的注释,仅仅返回一个简单的统计。
  • git shortlog -n 参数按照 commit 数量从多到少的顺利对用户进行排序
  • git shortlog -sn/git shortlog -s -n 按照commit的数量从多到少进行排序,并简单的统计数量。
  • git shortlog -2 查看最近两次的commit记录

# git describe 显示离当前提交最近的标签

该命令查找从提交可访问的最新标记。如果标签指向提交,则只显示标签。
否则,它将标记 名称与标记对象之上的其他提交数量 以及 最近提交的缩写对象名称后缀

  • git describe 如果最新一次提交没有注释标签,那么会显示

fatal: No annotated tags can describe 'daa38004d76012c77029727096b9e4ef724030a7'.
However, there were unannotated tags: try --tags.

  • git describe --tags 显示离当前提交最近的标签,不限于只是注释标签, 如果tag之后没有提交,就只显示名字,如果之后有提交,就显示下面的

merge1this-1-g84a2cd7说明:

"最新一次tagName""打tagName以来有两次提交commit""最新一个g+commitID" ,g表示git
如果之后没有提交,后面两个参数不会写。

  • git describe --all
  • git describe --contains
  • git describe --always

# git rebase 合并分支

这部分的内容,可以参考之前的文章 包你学会git rebase (opens new window)

  • git rebase 将合并分支合并到当前分支,并将当前分支的代码合并到后面,获取干净整洁的班版本树
  • git rebase --continue git遇到冲突会停下要求解决冲突,冲突解决完之后会继续应用(apply)余下的补丁
  • git rebase --skip 跳过当前合并的冲突,进入下一个提交的diff
  • git rebase --abort 任何时候都可以用这个命令终止rebase操作,分支会回到rebase开始的状态

# git reflog GIT操作历史记录

一般用于维护和数据恢复。当你在一个仓库下工作时,你的每一步操作都会记录下来,包括checkout,rebase,merge,commit操作。所以这个也是一个很好的回滚方式。

  • git reflog / git reflog show 显示所有的git操作历史记录

  • git reflog dev 显示在dev分支上面的操作历史记录 git reset --hard git@{1} 回滚到那个位置

  • git reflog --date=local | grep merge1 根据本地时间查看merge1分支的git操作记录

  • git reflog delete HEAD@{1} 删除对应步骤的git操作历史记录

# git cherry-pick 摘樱桃模式

  • git cherry-pick commitID 可以选择某个分支的一个或几个commit合并到另一个分支上。

假设有一个稳定版本,现在要升级版本,如果将两个版本的分支合并,那么会造成版本混乱,不利于维护,一般会将要增加的功能单独提交一个分支,然后增加到新版本上,就可以使用cherry-pick了。

记住cherry-pick是一个本地操作。假如你在pull代码之后有人又提交了代码,那么需要先pull代码,再进行cherry-pick

更新时间: 2021-09-15 12:03