文章摘要: Git分布式版本控制系统工具软件的使用命令汇总。
注释
- 全局配置表示这台计算机中的操作系统中的这个用户中的所有的Git仓库都会使用这个配置。
- 该文章参考了BiliBili上GeekHour的教学视频,视频连接:https://www.bilibili.com/video/BV1HM411377j?p=1
- 如果是多人协作使,不要对已经推送到远程的分支进行
rebase操作。
Git设置
提示
作用范围命令参数
--local:本地配置,对当前项目“当前本地仓库”生效。(默认参数)--global:全局配置,对当前用户“所有仓库”生效。--system:系统配置,对当前系统“所有用户和所有仓库”生效。
编辑配置文件
git config -e [--global]
设置用户名和邮箱
# 若用户名存在空格则需要使用双引号包裹起来
git config [<作用范围>] user.name "【用户名】"
git config [<作用范围>] user.email "【电子邮件】"
永久保存用户名和密码
# 将保存用户名和密码,后续提交文件无需再输入密码
git config [<作用范围>] credential.helper store
配置控制Git如何处理行结束符
注释
- CRLF(回车换行)是Windows系统中使用的换行符,LF(换行)是Unix和Linux系统中使用的换行符。
- 当你在跨平台的环境下使用Git时,Git会尝试根据你的系统设置来转换文件中的换行符。
- 推荐进行全局配置。
# `core.autocrlf`:配置控制Git如何处理行结束符。
# - `true` 或 `auto`(在Windows系统上默认): 提交时转换成LF,检出时转换成CRLF。
# - `false`: 禁用自动转换。
# - `input`(在Linux和macOS系统上默认): 提交时转换为LF,但在检出时不进行转换。
git config [<作用范围>] core.autocrlf input # Linux系统
git config [<作用范围>] core.autocrlf auto # Windows系统
# `core.eol`:配置在“检出”时Git应该使用哪种行结束符。
# - `lf`: 使用LF作为行结束符。
# - `crlf`: 使用CRLF作为行结束符。
# - `native`: 使用操作系统的默认行结束符。
git config [<作用范围>] core.eol lf # Linux系统
git config [<作用范围>] core.eol crlf # Windows系统
# `core.safecrlf`:配置检查在提交或检出时是否出现了意外的不安全行结束符转换。
# - `true`: 拒绝提交包含混合行结束符的文件。
# - `false`: 允许提交包含混合行结束符的文件。
# - `warn`: 提交时警告混合行结束符的存在。
git config [<作用范围>] core.safecrlf warn
查询git配置
查看Git的配置信息
# 查看全部配置信息
git config [<作用范围>] --list
# 查看用户名
git config [<作用范围>] user.name
# 查看邮箱
git config [<作用范围>] user.email
# 检查 core.autocrlf 的当前设置
git config [<作用范围>] --get core.autocrlf
# 检查 core.eol 的当前设置
git config [<作用范围>] --get core.eol
# 检查 core.safecrlf 的当前设置
git config [<作用范围>] --get core.safecrlf
仓库操作
创建(初始化)仓库
# 将当前目录作为Git仓库进行初始化
git init
# 新建一个目录,将其初始化为Git代码库
git init [<仓库名>]
查看仓库提交历史记录
# 查看仓库提交历史记录
git log
# 使用`--oneline`参数来查看简洁的提交记录
git log --oneline
查看仓库的状态
# 列出未提交的新的或修改的文件
git status
跟踪(关联)远程仓库的操作
# 查询
git remote -v
# 添加
git remote add "<远程仓库名>" "<远程仓库URL>"
# 断开
git remote remove "<远程仓库名>"
# 修改 - 当前跟踪的远程仓库在本地的别名
git remote rename "<远程仓库名>" "<新的远程仓库的别名>"
# 修改 - 当前跟踪的远程仓库在本地的URL地址
git remote set-url "<远程仓库名>" "<新的RUL>"
克隆(下载)远程仓库
# 克隆/下载,将远程仓库的main分支“克隆”到本地仓库
# 默认克隆远程仓库的主分支
git clone "<远程仓库URL>"
# 克隆/下载,将远程仓库的指定分支“克隆”到本地仓库
git clone -b "<分支名>" "<远程仓库URL>"
分支操作
创建分支
# 创建新分支
git branch "<分支名>"
提示
在后续遇到要新建分支时,创建分支后,会在当前分支的修改基础上提示你“缓存区”有修改的文件,是否要保存到“本地仓库”。
这个时候可以选择以下两种做法:
- 副本分支:将“缓存区”中发生修改的文件全部保存。
- 空白分支:将发生修改的文件全部剔除,还原。
删除分支
# 删除分支
git branch -d "<分支名>"
# 强制删除分支
git branch -D "<分支名>"
修改分支
# 修改当前分支名称
git branch -M "<新分支名>"
# 修改指定分支名称
git branch -m "<旧分支名>" "<新分支名>"
查看分支
# 查看本地分支
git branch
# 查看远程分支
git branch -r
# 查看所有分支
git branch -a
切换分支
# 切换到指定分支,并更新工作区
git checkout "<分支名>"
# 切换并创建新分支,没有原先的历史版本记录
git checkout --orphan "<分支名>"
合并分支
# `-no-ff`参数表示禁用Fast forward模式,合并后的历史有分支,能看到曾经做过合并
git merge --no--ff -m "<主分支名>"/"<分支名>"
# `-ff`参数表示使用Fast forward模式,合并后的历史会变成一条直线
git merge --ff -m "<主分支名>"/"<分支名>"
# 合并所有提交到一个提交
git merge --squash "<分支名>"
# 取消当前合并操作状态
git merge --abort
获取(远程分支->本地分支)
注释
- 获取操作并没有真正将远程分支下载到本地。
- 只是能在本地看到或查询到远程分支。
- 需要再次执行拉取分支操作。
- 在本地会有如下显示:
remotes/<远程仓库名>/<远程分支名>
# 获取全部分支,将所有远程分支“下载”到本地仓库
git fetch "<远程仓库名>"
# 获取指定分支,将指定远程分支“下载”到本地仓库
git fetch "<远程仓库名>" "<分支名>"
跟踪(关联)远程分支
- 当前分支正在跟踪哪条远程分支。
# 查询 - 当前分支正在跟踪哪条远程分支。
git branch -vv
# 跟踪远程分支
git branch -u "<添加的远程仓库名>"/"<远程分支名>"
# 断开远程分支
git branch --unset-upstream
推送(本地分支->远程分支)
# 推送,将本地文件“更新”到远程仓库(遇到冲突将提交失败)
git push "<远程仓库名>" "<本地分支名>":"<远程分支名>"
# 强制推送,将本地分支“覆盖”到远程仓库(遇到冲突将强制覆盖远程分支)
git push "<远程仓库名>" "<本地分支名>":"<远程分支名>" --force-with-lease
# 设置上游分支,若远程分支不存在将创建分支
git push "<远程仓库名>" "<本地分支名>":"<远程分支名>" --set-upstream
拉取(远程分支->本地分支)
注释
- 拉取操作之前,需要确定能够在本地看到远程分支。
- 可以进行获取操作,来查看到远程分支。
# 拉取,将远程仓库“更新”到本地仓库
git pull "<远程仓库名>" "<分支名>"
# 强制拉取,将远程仓库“覆盖”到本地仓库
git pull "<远程仓库名>" "<远程分支名>":"<本地分支名>" --force
# 将远程分支“变基”到本地分支
git pull --rebase
整理分支中的提交历史/停止变基状态
# `rebase`操作可以把本地未push的分叉提交历史整理成直线,看起来更直观。
git rebase "<主分支名>"
# 停止变基,取消当前变基状态。
git rebase --abort
标签
新建标签
# 新建标签在当前版本中
git tag "<标签名>"
# 新建标签在指定版本中
git tag "<标签名>" [commit]
删除标签
# 删除本地tag
git tag -d "<标签名>"
# 删除远程tag
git push origin :refs/tags/[tagName]
查看标签
# 列出所有标签
git tag
# 查看tag信息
git show "<标签名>"
查看信息
# 显示有变更的文件
git status
# 显示当前分支的版本历史
git log
# 显示commit历史,以及每次commit发生变更的文件
git log --stat
# 搜索提交历史,根据关键词
git log -S [keyword]
# 显示某个commit之后的所有变动,每个commit占据一行
git log [tag] HEAD --pretty=format:%s
# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
git log [tag] HEAD --grep feature
# 显示某个文件的版本历史,包括文件改名
git log --follow [file]
git whatchanged [file]
# 显示指定文件相关的每一次diff
git log -p [file]
# 显示过去5次提交
git log -5 --pretty --oneline
# 显示所有提交过的用户,按提交次数排序
git shortlog -sn
# 显示指定文件是什么人在什么时间修改过
git blame [file]
# 显示暂存区和工作区的差异
git diff
# 显示暂存区和上一个commit的差异
git diff --cached [file]
# 显示工作区与当前分支最新commit之间的差异
git diff HEAD
# 显示两次提交之间的差异
git diff [first-branch]...[second-branch]
# 显示今天你写了多少行代码
git diff --shortstat "@{0 day ago}"
# 显示某次提交的元数据和内容变化
git show [commit]
# 显示某次提交发生变化的文件
git show --name-only [commit]
# 显示某次提交时,某个文件的内容
git show [commit]:[filename]
# 显示当前分支的最近几次提交
git reflog
文件操作
提交文件到暂存区/改为跟踪状态
# 添加当前路径下的所有修改过的文件到暂存区
git add .
# 添加指定文件到暂存区
git add <文件> ...
# 添加指定目录到暂存区,包含子目录
git add <目录> ...
从暂存区移除文件/撤销文件操作
git restore <文件>
修改为未跟踪状态/移除跟踪文件
# `-r`:递归删除文件夹和文件。
# 删除“缓存区”和“工作区”中的文件
git rm <文件>
# 删除“缓存区”,保留“工作区”中的文件
git rm --cached <文件>
代码提交
暂存区文件提交到本地仓库
# 提交所有缓存区的文件到本地仓库
git commit -m "提交消息"
# 提交所有已修改的文件到本地仓库
git commit -a -m "提交消息"
版本控制
查看版本/文件差异
# 查看工作区、暂存区、本地仓库之间的差异
# 默认比较“工作区”和“暂存区”之间的差异内容,显示发生更换的文件以及更改的详细信息
# 查看未暂存的文件更新了哪些部分
git diff
# 查看“工作区”和“本地仓库”之间的差异
git diff HEAD
# 查看“暂存区”和“本地仓库”之间的差异
git diff --cached
# 查看两个提交之间的差异
git diff <分支名-id> <分支名-id>
回滚历史版本
# `--hard`参数,“丢弃”工作区和暂存区的所有修改内容
git reset --hard
# `--soft`参数,“保留”工作区和暂存区的所有修改内容
git reset --soft
# `--mixed`参数,“保留”工作区“丢弃”暂存区的修改内容。
git reset --mixed
存储/存档
stash操作可以把当前工作现场“储藏”起来,等以后回复现场后继续工作。
# save参数表示存储的信息,可以不写
git stash [save] "<分支名>"
# `-u`参数表示把所有未跟踪的文件也一并存储
git stash -u "<分支名>"
# `-a`参数表示把所有未跟踪的文件和忽略的文件一并存储
git stash -a "<分支名>"
# 查看所有stash
git stash list
# 恢复最近一次stash
git stash pop
# 恢复指定的stash
# stash@{2}表示第三个stash
# stash@{0}表示最近的stash
git stash pop stash@{2}
# 重新接受最近一次stash
git stash apply
# `pop`和`apply`的区别是,`pop`会把`stash`内容删除,而`apply`不会。可以使用`git stash drop`来删除`stash`。
git stash drop stash@{2}
# 删除所有stash
git stash clear
其他
帮助
# 全部帮助
git help
# 查看特定命令的帮助
git <命令名> --help
生成可供发布的压缩包
# 生成一个可供发布的压缩包
git archive