git config
配置 Git 的相关参数。
Git 一共有3个配置文件:
- 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。
- 全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:Users<用户名>.gitconfig。
- 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig。
# 查看配置信息
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -l
代码语言:txt复制# 查看当前生效的配置信息
$ git config -l
代码语言:txt复制# 编辑配置文件
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -e
代码语言:txt复制# 添加配置项
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> --add <name> <value>
代码语言:txt复制# 获取配置项
$ git config <--local | --global | --system> --get <name>
代码语言:txt复制# 删除配置项
$ git config <--local | --global | --system> --unset <name>
代码语言:txt复制# 配置提交记录中的用户信息
$ git config --global user.name <用户名>
$ git config --global user.email <邮箱地址>
代码语言:txt复制# 更改Git缓存区的大小
# 如果提交的内容较大,默认缓存较小,提交会失败
# 缓存大小单位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <缓存大小>
代码语言:txt复制# 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态
$ git config --global color.ui true
代码语言:txt复制# 配置可以缓存密码,默认缓存时间15分钟
$ git config --global credential.helper cache
代码语言:txt复制# 配置密码的缓存时间
# 缓存时间单位:秒
$ git config --global credential.helper 'cache --timeout=<缓存时间>'
代码语言:txt复制# 配置长期存储密码
$ git config --global credential.helper store
git clone
从远程仓库克隆一个版本库到本地。
代码语言:txt复制# 默认在当前目录下创建和版本库名相同的文件夹并下载版本到该文件夹下
$ git clone <远程仓库的网址>
代码语言:txt复制# 指定本地仓库的目录
$ git clone <远程仓库的网址> <本地目录>
代码语言:txt复制# -b 指定要克隆的分支,默认是master分支
$ git clone <远程仓库的网址> -b <分支名称> <本地目录>
git init
初始化项目所在目录,初始化后会在当前目录下出现一个名为 .git 的目录。
代码语言:txt复制# 初始化本地仓库,在当前目录下生成 .git 文件夹
$ git init
git status
查看本地仓库的状态。
代码语言:txt复制# 查看本地仓库的状态
$ git status
代码语言:txt复制# 以简短模式查看本地仓库的状态
# 会显示两列,第一列是文件的状态,第二列是对应的文件
# 文件状态:A 新增,M 修改,D 删除,?? 未添加到Git中
$ git status -s
git remote
操作远程库。
代码语言:txt复制# 列出已经存在的远程仓库
$ git remote
代码语言:txt复制# 列出远程仓库的详细信息,在别名后面列出URL地址
$ git remote -v
$ git remote --verbose
代码语言:txt复制# 添加远程仓库
$ git remote add <远程仓库的别名> <远程仓库的URL地址>
代码语言:txt复制# 修改远程仓库的别名
$ git remote rename <原远程仓库的别名> <新的别名>
代码语言:txt复制# 删除指定名称的远程仓库
$ git remote remove <远程仓库的别名>
代码语言:txt复制# 修改远程仓库的 URL 地址
$ git remote set-url <远程仓库的别名> <新的远程仓库URL地址>
git branch
操作 Git 的分支命令。
代码语言:txt复制# 列出本地的所有分支,当前所在分支以 "*" 标出
$ git branch
代码语言:txt复制# 列出本地的所有分支并显示最后一次提交,当前所在分支以 "*" 标出
$ git branch -v
代码语言:txt复制# 创建新分支,新的分支基于上一次提交建立
$ git branch <分支名>
代码语言:txt复制# 修改分支名称
# 如果不指定原分支名称则为当前所在分支
$ git branch -m [<原分支名称>] <新的分支名称>
# 强制修改分支名称
$ git branch -M [<原分支名称>] <新的分支名称>
代码语言:txt复制# 删除指定的本地分支
$ git branch -d <分支名称>
# 强制删除指定的本地分支
$ git branch -D <分支名称>
git checkout
检出命令,用于创建、切换分支等。
代码语言:txt复制# 切换到已存在的指定分支
$ git checkout <分支名称>
代码语言:txt复制# 创建并切换到指定的分支,保留所有的提交记录
# 等同于 "git branch" 和 "git checkout" 两个命令合并
$ git checkout -b <分支名称>
代码语言:txt复制# 创建并切换到指定的分支,删除所有的提交记录
$ git checkout --orphan <分支名称>
代码语言:txt复制# 替换掉本地的改动,新增的文件和已经添加到暂存区的内容不受影响
$ git checkout <文件路径>
git cherry-pick
把已经提交的记录合并到当前分支。
代码语言:txt复制# 把已经提交的记录合并到当前分支
$ git cherry-pick <commit ID>
git add
把要提交的文件的信息添加到暂存区中。当使用 git commit 时,将依据暂存区中的内容来进行文件的提交。
代码语言:txt复制# 把指定的文件添加到暂存区中
$ git add <文件路径>
代码语言:txt复制# 添加所有修改、已删除的文件到暂存区中
$ git add -u [<文件路径>]
$ git add --update [<文件路径>]
代码语言:txt复制# 添加所有修改、已删除、新增的文件到暂存区中,省略 <文件路径> 即为当前目录
$ git add -A [<文件路径>]
$ git add --all [<文件路径>]
代码语言:txt复制# 查看所有修改、已删除但没有提交的文件,进入一个子命令系统
$ git add -i [<文件路径>]
$ git add --interactive [<文件路径>]
git commit
将暂存区中的文件提交到本地仓库中。
代码语言:txt复制# 把暂存区中的文件提交到本地仓库,调用文本编辑器输入该次提交的描述信息
$ git commit
代码语言:txt复制# 把暂存区中的文件提交到本地仓库中并添加描述信息
$ git commit -m "<提交的描述信息>"
代码语言:txt复制# 把所有修改、已删除的文件提交到本地仓库中
# 不包括未被版本库跟踪的文件,等同于先调用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"
代码语言:txt复制# 修改上次提交的描述信息
$ git commit --amend
git fetch
从远程仓库获取最新的版本到本地的 tmp 分支上。
代码语言:txt复制# 将远程仓库所有分支的最新版本全部取回到本地
$ git fetch <远程仓库的别名>
代码语言:txt复制# 将远程仓库指定分支的最新版本取回到本地
$ git fetch <远程主机名> <分支名>
git merge
合并分支。
代码语言:txt复制# 把指定的分支合并到当前所在的分支下
$ git merge <分支名称>
git diff
比较版本之间的差异。
代码语言:txt复制# 比较当前文件和暂存区中文件的差异,显示没有暂存起来的更改
$ git diff
代码语言:txt复制# 比较暂存区中的文件和上次提交时的差异
$ git diff --cached
$ git diff --staged
代码语言:txt复制# 比较当前文件和上次提交时的差异
$ git diff HEAD
代码语言:txt复制# 查看从指定的版本之后改动的内容
$ git diff <commit ID>
代码语言:txt复制# 比较两个分支之间的差异
$ git diff <分支名称> <分支名称>
代码语言:txt复制# 查看两个分支分开后各自的改动内容
$ git diff <分支名称>...<分支名称>
git pull
从远程仓库获取最新版本并合并到本地。
首先会执行 git fetch,然后执行 git merge,把获取的分支的 HEAD 合并到当前分支。
代码语言:txt复制# 从远程仓库获取最新版本。
$ git pull
git push
把本地仓库的提交推送到远程仓库。
代码语言:txt复制# 把本地仓库的分支推送到远程仓库的指定分支
$ git push <远程仓库的别名> <本地分支名>:<远程分支名>
代码语言:txt复制# 删除指定的远程仓库的分支
$ git push <远程仓库的别名> :<远程分支名>
$ git push <远程仓库的别名> --delete <远程分支名>
git log
显示提交的记录。
代码语言:txt复制# 打印所有的提交记录
$ git log
代码语言:txt复制# 打印从第一次提交到指定的提交的记录
$ git log <commit ID>
代码语言:txt复制# 打印指定数量的最新提交的记录
$ git log -<指定的数量>
git reset
还原提交记录。
代码语言:txt复制# 重置暂存区,但文件不受影响
# 相当于将用 "git add" 命令更新到暂存区的内容撤出暂存区,可以指定文件
# 没有指定 commit ID 则默认为当前 HEAD
$ git reset [<文件路径>]
$ git reset --mixed [<文件路径>]
代码语言:txt复制# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>
代码语言:txt复制# 将 HEAD 的指向改变,撤销到指定的提交记录,文件未修改
# 相当于调用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>
代码语言:txt复制# 将 HEAD 的指向改变,撤销到指定的提交记录,文件也修改了
$ git reset --hard <commit ID>
git revert
生成一个新的提交来撤销某次提交,此次提交之前的所有提交都会被保留。
代码语言:txt复制# 生成一个新的提交来撤销某次提交
$ git revert <commit ID>
git tag
操作标签的命令。
代码语言:txt复制# 打印所有的标签
$ git tag
代码语言:txt复制# 添加轻量标签,指向提交对象的引用,可以指定之前的提交记录
$ git tag <标签名称> [<commit ID>]
代码语言:txt复制# 添加带有描述信息的附注标签,可以指定之前的提交记录
$ git tag -a <标签名称> -m <标签描述信息> [<commit ID>]
代码语言:txt复制# 切换到指定的标签
$ git checkout <标签名称>
代码语言:txt复制# 查看标签的信息
$ git show <标签名称>
代码语言:txt复制# 删除指定的标签
$ git tag -d <标签名称>
代码语言:txt复制# 将指定的标签提交到远程仓库
$ git push <远程仓库的别名> <标签名称>
代码语言:txt复制# 将本地所有的标签全部提交到远程仓库
$ git push <远程仓库的别名> –tags
git mv
重命名文件或者文件夹。
代码语言:txt复制# 重命名指定的文件或者文件夹
$ git mv <源文件/文件夹> <目标文件/文件夹>
git rm
删除文件或者文件夹。
代码语言:txt复制# 移除跟踪指定的文件,并从本地仓库的文件夹中删除
$ git rm <文件路径>
代码语言:txt复制# 移除跟踪指定的文件夹,并从本地仓库的文件夹中删除
$ git rm -r <文件夹路径>
代码语言:txt复制# 移除跟踪指定的文件,在本地仓库的文件夹中保留该文件
$ git rm --cached
Git操作场景示例
工作场景一 —— 新任务(开发新特性 / 修bug)
git st
查看当前项目的状态,如果有未保存的修改,就git add .
和git ci -m "xyz"
保存下来1d23813 (HEAD -> feat-1) develop feat-1 phase 3 a7e5705 develop feat-1 phase 2 2685240 init feat-1假设我开发 feat-1 中 commit 了3次,三次的commit message如上所示。- 切换到开发主分支,假如项目的主分支叫develop 就使用
git co develop
- 确保主分支是最新版本
git pull origin develop
- 创建新分支
git co -b feat-1
(创建一个叫做 feat-1的新分支) - 开始写代码
- 如果当前任务比较复杂,代码量比较多,我通常会多次使用
git add .
和git ci -m "xxx"
保存当前代码 (记得把 xxx 换成更有意义的文字, 如git ci -m "init feature-1"
) - 代码开发结束,整理
commit message
- 首先仍然是用
git st
确保所有代码都commit了(没有就 git add 和 git ci ) - 第二步
git logl
查看当前分支下最近的commit message
,如
前面说过 commit 是为了防止意外丢失代码,但是在推到远端之前,最好把一次开发的 commit 合并成一个,避免污染远端的 git commit message
因为这个例子中有3个 commit,所以执行 git rebase -i HEAD~3
然后就会看到一个 vim 界面 (不熟悉 vim 基础操作的读者请自行查阅搜索)
记住不要动最上面的那行,把下面几行开头的 pick 换成 s , 然后保存
这时会显示另一个 vim 界面
删除所有内容( #开头的可以忽略),然后写一句简短、准确的句子作为这次开发的 commit message,如
然后保存
如果成功了就能看见这么一些文字
最后使用 git logl 确认所有这次开发中的 commit message 都被压缩成了一个
(这边只介绍了 git rebase
的最简单直接的用法,有兴趣的读者可以去阅读官方文档,了解更详细、高级的用法,如第一次vim界面里使用 f 替代 s 有时候更方便)
最后 git push origin feat-1
把本地仓库推到远端仓库
工作场景二 —— 开发进行一半,需要远端主分支的最新代码
有些时候,你在本地开发某个功能,代码写到一半,某个同事将某些重要代码合进了远端的主分支(如 develop 分支)里。这些重要代码可能是可以极大提升本地开发效率,可能是加入了某些规范检查或者是跟你当前开发相关的代码 —— 总之需要你将那部分代码融入你当前的本地开发环境里。
这种情况下,我会
git st
查看当前项目的状态,如果有未保存的修改,就git add .
和git ci -m "xyz"
保存下来git pull --rebase origin develop
使用这个指令将远端的主分支以 rebase 的形式 “合进”当前分支git logl
查看当前分支下的 commit message 是否符合预期
为什么用 --rebase 呢?
因为这么做,可以让git历史最干净、整洁 —— 所有本地开发的 commit 都会出现在远端主分支里的 commit 之后;并且可以避免额外引入一次 merge 的 commit
工作场景三 —— 希望把某个分支中的某个 commit 对应的代码复制到当前分支
有时我会创建一些实验性的分支,写一些实验性的代码,如果代码不可行,我可以直接废弃掉这个分支,返回原本的开发分支中;如果这些实验性代码可行,我会返回开发分支中,然后把实验性分支的那部分代码“复制”过来,具体操作如下:
- git st 查看当前项目的状态,如果有未保存的修改,就
git add .
和git ci -m "xyz"
保存下来 - 假设我们需要的是 feat-1 这个分支的某个 commit ,使用
git logl feat-1
查看最近这个分支的所有 commit 记录,如
记下对应的 commit 的 hash 值,即开头的7个字符乱码 如上图的 c843c37
- 使用
git cherry-pick c843c37
将这个 commit 对应的代码复制到当前分支
另外 git cherry-pick
有时还可以用来救场 —— 找回“丢失”的代码,前提是能找到对应的 commit hash 值。