语法格式描述
本文采用BNF语法格式描述规范描述命令行的语法,BNF语法格式的元字符及其含义如下:
[ ]
:可选内容;
< >
:必须给出内容;
{ }
:可重复0至无数次的内容;
a|b|c
:多选一;
…
:可以有多个;
备注:关于BNF的详细内容可参考《语法格式描述规范BNF和ABNF》
git config
配置 Git 的相关参数。
Git 一共有3个配置文件:
1. 仓库级的配置文件:在仓库的 .git/.gitconfig
,该配置文件只对所在的仓库有效。
2. 全局配置文件:Mac 系统在 ~/.gitconfig
,Windows 系统在 C:Users<用户名>.gitconfig
。
3. 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git
)的 etc
文件夹中的 gitconfig
# 查看配置信息 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -l # 查看当前生效的配置信息 $ git config -l # 编辑配置文件 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> -e # 添加配置项 # --local:仓库级,--global:全局级,--system:系统级 $ git config <--local | --global | --system> --add <name> <value> # 获取配置项 $ git config <--local | --global | --system> --get <name> # 删除配置项 $ git config <--local | --global | --system> --unset <name> # 配置提交记录中的用户信息 $ git config --global user.name <用户名> $ git config --global user.email <邮箱地址> # 更改Git缓存区的大小 # 如果提交的内容较大,默认缓存较小,提交会失败 # 缓存大小单位:B,例如:524288000(500MB) $ git config --global http.postBuffer <缓存大小> # 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态 $ git config --global color.ui true # 配置可以缓存密码,默认缓存时间15分钟 $ git config --global credential.helper cache # 配置密码的缓存时间 # 缓存时间单位:秒 $ git config --global credential.helper 'cache --timeout=<缓存时间>' # 配置长期存储密码 $ git config --global credential.helper store
git clone
从远程仓库克隆一个版本库到本地。
# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下 $ git clone <远程仓库的网址> # 指定本地仓库的目录 $ git clone <远程仓库的网址> <本地目录> # -b 指定要克隆的分支,默认是master分支 $ git clone <远程仓库的网址> -b <分支名称> [本地目录]
git init
初始化项目所在目录,初始化后会在当前目录下出现一个名为 .git 的目录。
# 初始化本地仓库,在当前目录下生成 .git 文件夹
$ git init
git status
查看本地仓库的状态。
# 查看本地仓库的状态 $ git status # 以简短模式查看本地仓库的状态 # 会显示两列,第一列是文件的状态,第二列是对应的文件 # 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中 $ git status -s
git remote
操作远程库。
# 列出已经存在的远程仓库 $ git remote # 列出远程仓库的详细信息,在别名后面列出URL地址 $ git remote -v $ git remote --verbose # 添加远程仓库 $ git remote add <远程仓库的别名> <远程仓库的URL地址> # 修改远程仓库的别名 $ git remote rename <原远程仓库的别名> <新的别名> # 删除指定名称的远程仓库 $ git remote remove <远程仓库的别名> # 修改远程仓库的 URL 地址 $ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
git branch
操作 Git 的分支命令。# 列出本地的所有分支,当前所在分支以 "*" 标出$ git branch
# 列出本地的所有分支并显示当前所在分支,当前所在分支以 "*" 标出 $ git branch -v
# 查看远程仓库的全部分支
$ git branch -r
# 查看本地仓库和远程仓库的全部分支
$ git branch -a
# 查看远程分支与本地分支的跟踪关系
$ git branch -vv
# 创建新分支,新的分支基于上一次提交建立
$ git branch <分支名>
# 修改分支名称 # 如果不指定原分支名称则为当前所在分支 $ git branch -m [<原分支名称>] <新的分支名称> # 强制修改分支名称 $ git branch -M [<原分支名称>] <新的分支名称> # 删除指定的本地分支 注意事项:删除某个分支时,不能在在这个分支上,应该在其他分支上 $ git branch -d <分支名称> # 强制删除指定的本地分支 $ git branch -D <分支名称>
git checkout
检出命令,用于创建、切换分支等。
# 切换到已存在的指定分支 $ git checkout <分支名称> # 创建并切换到指定的分支,保留所有的提交记录 # 等同于 "git branch" 和 "git checkout" 两个命令合并 $ git checkout -b <分支名称> # 创建并切换到指定的分支,删除所有的提交记录 $ git checkout --orphan <分支名称> # 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响 $ git checkout <文件路径>
# 本地仓库没有某仓库,将远程仓库的分支拷贝创建到本地仓库
$ git checkout -b <分支名称>
git cherry-pick
把已经提交的记录合并到当前分支。
# 把已经提交的记录合并到当前分支
$ git cherry-pick <commit ID>
git add
把要提交的文件的信息添加到暂存区中。当使用 git commit 时,将依据暂存区中的内容来进行文件的提交。
# 把指定的文件添加到暂存区中 $ git add <文件> # 添加所有修改、已删除的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]
# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]
# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]
git commit
将暂存区中的文件提交到本地仓库中。
# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息
$ git commit # 把暂存区中的文件提交到本地仓库中并添加描述信息 $ git commit -m "<提交的描述信息>" # 把所有修改、已删除的文件提交到本地仓库中 # 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u" $ git commit -a -m "<提交的描述信息>" # 修改上次提交的描述信息 $ git commit --amend
git fetch
从远程仓库获取最新的版本到本地的 tmp 分支上。
该命令执行后,不会将拉取的分支的最新代码合并到当前分支,仅仅是拉取/下载下来到本地仓库中
# 把远程仓库的分支最新版本推送到本地仓库的指定分支;如果本地指定分支存在,则会创建并更新一个名字“远程仓库别名/本地分支名”分支,更新里面内容是远程分支的内容,此分支无法使用branch -v 查看带;如果本地分支不存在,则创建一个新的“本地分支”名,里面内容是远程分支的内容,此分支无法使用branch -v 查看带
$ git fetch <远程仓库的别名> <远程分支名>:<本地分支名>
# 省略了远程分支名的情况下,把远程仓库的分支最新版本推送到本地仓库的指定分支;如果本地指定分支存在,则会创建并更新一个名字“远程仓库别名/本地分支名”分支,更新里面内容是远程仓库的默认分支的内容,此分支无法使用branch -v 查看带;如果本地分支不存在,则创建一个新的“本地分支”名,里面内容是
远程仓库的默认分支的内容,此分支无法使用branch -v 查看。
$ git fetch <远程仓库的别名> :<本地分支名>
# 如果本地分支被省略,会创建并更新一个名字是“远程仓库别名/远程分支名”分支,分支内容是远程分支的内容,此分支无法使用branch -v 查看;
$ git fetch <远程仓库别名> <远程分支>
# 如果本地分支被省略,会创建并更新一个名字是“远程仓库别名/远程默认分支名”分支,分支内容是远程默认分支名分支的内容,此分支无法使用branch -v 查看;
$ git fetch <远程仓库别名>
# 如果只用git fetch ,则会将远程仓库中全部分支都创建对应名称为‘远程仓库名、对应分支名’的分支,对其分支内容是对应远程分支的内容
$ git fetch
* 注意:尽量使用完整的方式进行git fetch,其他的不建议使用。
git merge
合并分支。
# 把指定的分支合并到当前所在的分支下
$ git merge <分支名称>
git diff
比较版本之间的差异。
# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改 $ git diff # 比较暂存区中的文件和上次提交时的差异 $ git diff --cached $ git diff --staged # 比较当前文件和上次提交时的差异 $ git diff HEAD # 查看从指定的版本之后改动的内容 $ git diff <commit ID> # 比较两个分支之间的差异 $ git diff <分支名称> <分支名称> # 查看两个分支分开后各自的改动内容 $ git diff <分支名称>...<分支名称>
git pull
从远程仓库获取最新版本并合并到本地。
首先会执行 git fetch
,然后执行 git merge
,把获取的分支的 HEAD 合并到当前分支。
# 把远程仓库的分支最新版本推送到本地仓库的指定分支
$ git pull <远程仓库的别名> <远程分支名>:<本地分支名>
# 如果本地分支被省略,如上则表示将远程分支更新到与之存在追踪关系的本地分支(通常两者同名),如果该存在追踪关系的本地分支不存在,则会被新建
$ git pull <远程仓库别名> <远程分支>
# 如果省略远程分支名,则表示删除指定的本地分支,因为这等同于更新一个空的远程分支到本地分支,等同于 git branch origin --delete master
$ git pull <远程仓库别名> : <本地分支>
# 如果当前本地分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
$ git pull <远程仓库别名>
# 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git pull,可以使用git branch -r ,查看远程的分支名
$ git pull
* 注意:尽量使用完整的方式进行pull
git fetch + git merge 合并代码
使用git fetch + git merge 实现从远程仓库获取最新代码并合并的一般流程
# 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支;
$ git fetch origin master:temp
# 比较本地代码与刚刚从远程下载下来的代码的区别;当前在本地分支master时
$ git diff temp
# 合并temp分支到本地的master分支;当前在本地分支master时
$ git merge temp
# 如果不想保留temp分支,删除;
$ git branch -d temp
git push
把本地仓库的提交推送到远程仓库。
# 把本地仓库的分支推送到远程仓库的指定分支 $ git push <远程仓库的别名> <本地分支名>:<远程分支名>
# 如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
$ git push <远程仓库别名> <本地分支>
# 如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
$ git push <远程仓库别名> : <远程分支>
# 如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
$ git push <远程仓库别名>
# 如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名
$ git push
# 删除指定的远程仓库的分支 $ git push <远程仓库的别名> :<远程分支名> $ git push <远程仓库的别名> --delete <远程分支名>
# 将本地的新建的分支推送到远程仓库
$ git push --set-upstream <远程仓库别名> <新建分支>
* 注意:尽量使用完整的方式进行push
git log
显示提交的记录。
# 打印所有的提交记录 $ git log # 打印从第一次提交到指定的提交的记录 $ git log <commit ID> # 打印指定数量的最新提交的记录 $ git log -<指定的数量>
# 打印全部的简化的提交记录,只有“哈希值”和“提交时描述信息
”
$ git log --pretty=oneline
# 打印全部的简化的提交记录,只有“部分哈希值”和“提交时描述信息
”
$ git log --oneline
git reflog
可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git log则是看不出来被删除的commitid,用git reflog则可以看到被删除的commitid,恢复到被删除的那个版本。
git log则是看不出来跳到指定版本需要几步,用git reflog则可以看到跳转到指定版本需要几步
# 查看所有分支的所有操作记录
$ git reflog
git reset
还原提交记录。
# 通过 commit ID跳转到指定commit ID的版本
$ git reset --hard <commit ID>
# 使用^符号后退一个或多个版本
$ git reset --hard HEAD^
$ git reset --hard HEAD^3
# 使用~符号前进一个或多个版本
$ git reset --hard HEAD~
$ git reset --hard HEAD~3
# 使用git reset --hard 返回版本修改的是暂存区文件和工作区文件
# 使用git reset --mixed 返回版本修改的是暂存区文件
# 使用git reset --soft 不会修改本地区和暂存区的文件,仅仅是在本地库移动 HEAD指针
# 基本上用 hard就足够了,mixed、soft、keep基本上用不着
git revert
生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。
# 生成一个新的提交来撤销某次提交
$ git revert <commit ID>
git tag
操作标签的命令。
# 打印所有的标签 $ git tag # 添加轻量标签,指向提交对象的引用,可以指定之前的提交记录 $ git tag <标签名称> [<commit ID>] # 添加带有描述信息的附注标签,可以指定之前的提交记录 $ git tag -a <标签名称> -m <标签描述信息> [<commit ID>] # 切换到指定的标签 $ git checkout <标签名称> # 查看标签的信息 $ git show <标签名称> # 删除指定的标签 $ git tag -d <标签名称> # 将指定的标签提交到远程仓库 $ git push <远程仓库的别名> <标签名称> # 将本地所有的标签全部提交到远程仓库 $ git push <远程仓库的别名> –tags
git mv
重命名文件或者文件夹。
# 重命名指定的文件或者文件夹
$ git mv <源文件/文件夹> <目标文件/文件夹>
git rm
删除文件或者文件夹。
# 移除跟踪指定的文件,并从本地仓库的文件夹中删除 $ git rm <文件路径> # 移除跟踪指定的文件夹,并从本地仓库的文件夹中删除 $ git rm -r <文件夹路径> # 移除跟踪指定的文件,在本地仓库的文件夹中保留该文件
# 即是 ‘git add 文件’的逆向操作 $ git rm --cached <文件>
# 移除跟踪指定的文件夹,在本地仓库的文件夹中保留该文件夹
# 即是 ‘git add 文件夹’的逆向操作 $ git rm --cached -r <文件夹>
$ git rm -r --cached <文件夹>
# 删除之前先看看会删除哪些东西,并不会有实际的影响。
$ git rm -n <文件>
# 强制删除 一般不用
$ git rm -f <文件>
Git操作场景示例
1. 删除掉本地不存在的远程分支
多人合作开发时,如果远程的分支被其他开发删除掉,在本地执行 git branch --all
依然会显示该远程分支,可使用下列的命令进行删除:
# 使用 pull 命令,添加 -p 参数 $ git pull -p # 等同于下面的命令 $ git fetch -p $ git fetch --prune origin
转载链接:https://www.jianshu.com/p/93318220cdce