前言
Git 的辅助工具很多,经常使用导致我都忘记 Git 命令都是啥了。记录一下工作中常用的 Git 命令以及最常用的使用场景,加深自己的印象,下次忘了直接翻出来一看就会。
常见命令总览
常见 Git 命令(注意:不是全部)
├── 启动一个工作区
├── clone 将存储库克隆到新的目录中
├── init 创建一个新的 Git 仓库或初始化一个现有的仓库
└── 处理当前的更改
├── add 将文件内容添加到暂存区(索引)
├── restore 恢复工作树文件
├── rm 从工作树和索引中删除文件
└── 检查历史和状态
├── diff 显示提交、提交和工作树之间的变化
├── log 显示提交日志
├── status 显示工作树状态
└── 成长,标记和调整你的共同历史
├── branch 列出、创建或删除分支
├── commit 将更改记录到存储库中
├── merge 将两个或多个开发历史连接在一起(合并分支)
├── rebase 在另一个基本提示上重新应用提交
├── reset 重置当前 HEAD 到指定状态
├── switch 切换分支
├── tag 创建、列出、删除或验证使用 GPG 签名的标记对象
└── 协作
├── fetch 从另一个存储库下载对象和引用
├── pull 从另一个存储库或本地分支获取并与之集成
├── push 更新远程引用和相关的对象
Git 工作区域
Working Area工作区
通过 git clone 将存储库克隆到本地目录。
也可通过 git init 初始化一个现有仓库。
Staging Area暂存区(索引)
通过 git add 命令可以将工作区的文件添加到暂存区。
Local Repository本地仓库(版本库)
通过 git commit 命令将暂存区的内容提交到本地仓库。
Remote Repository远端仓库
通过 git push 命令将本地仓库的修改同步到远端仓库。
辅助理解图如下:
Git 工作区域
Git 文件状态
辅助理解图如下:
Git 文件状态
必备命令示例
# 查看当前工作区文件状态
$ git status
# 将工作区文件暂存起来
$ git stash
# 将之暂存的文件恢复到工作区
$ git stash pop
# 添加当前目录下所有更改文件到暂存区(索引)
$ git add .
# 添加指定文件到暂存区(索引)
$ git add <filename>
# 提交暂存的更改,并记录快照
$ git commit -m 'xxx'
# 等价于 `git add . && git commit -m 'xxx'`
$ git commit -am 'xxx'
# 将本地的 master 分支推送到 origin 主机,同时指定 origin 为默认主机
$ git push -u origin master
# 从远端仓库拉取数据并尝试合并到当前分支
$ git pull
# 列出所有本地分支
$ git branch
# 切换分支
$ git switch <branchname>
$ git checkout <branchname>
# 创建并切换到指定分支
$ git checkout -b <branchname>
# 显示某分支提交的更改记录(按 q 可退出)
$ git log <branchname>
# 查看历史记录的紧凑简洁的版本
$ git log --oneline
# 将本地仓库的该分支代码合并到当前工作目录
$ git merge <branchName>
# 查看所有标签
$ git tag
# 给最新一次提交打上(HEAD)v1.0.0的标签,一般用来标记发布版本
$ git tag -a v1.0.0
# 给发布提交 commit id 为 1cf2de5 追加标签
$ git tag -a v1.0.1 1cf2de5
进阶命令示例
1. git stash
git stash 命令用于保存本地修改并还原工作目录以匹配HEAD提交。
将当前工作区未 commit 的代码暂存起来,恢复到上次 commit 时的状态。
常用命令:
# 暂存当前未 commit 代码
$ git stash
Saved working directory and index state WIP on master: 31fd464 first
# 暂存当前未 commit 代码并添加备注
$ git stash save "stash message"
Saved working directory and index state On master: stash message
# 列出 stash 暂存的所有记录
$ git stash list
stash@{0}: On master: stash message
stash@{1}: WIP on master: 31fd464 first
# 将最近一次 stash 暂存的代码恢复到工作区。
$ git stash apply
# 恢复指定 stash 暂存的代码到工作区。( pop drop 操作同样支持 )
$ git stash apply stash@{0}
# 删除最近一次 stash 记录
$ git stash drop
# 将最近一次 stash 暂存的代码恢复到工作区,并删除该记录
$ git stash pop
# 删除 stash 所有记录
git stash clear
解决问题:
- 我正在 develop 分支做开发呢,领导让我去 hotfix 分支改bug,此时 develop 分支的代码如何处理
- 我代码已经写完了,刚要提交代码,发现写错分支了
// 暂存当前分支代码
$ git stash
// 切换分支
$ git switch <branchName>
// 恢复上一次 stash 暂存代码
$ git stash pop
2. git reset
git reset 重置当前HEAD到指定状态。
将当前指针指向指定的 commit 节点。
常用命令:
# 硬重置。删除工作区代码,不会保留 commit 节点的提交内容,即同时撤销暂存区和工作区修改。
$ git reset --hard
# 软重置,保留工作区代码,撤销 commit,不撤销 add,即只撤销 commit 记录,不改变暂存区。
$ git reset --soft HEAD^
# 撤销 n 次上次 commit 操作
$ git reset --soft HEAD~n
# 回退到 commit id 为 3628164 的版本
$ git reset --soft 3628164
# 指针重置。保存工作区代码,撤销 commit,撤销 add,即撤销暂存区修改。
$ git reset HEAD^
# 撤销上一次向暂存区添加的所有文件。默认参数 mixed,通常用于撤销 `git add`。
$ git reset
# 撤销上一次向暂存区添加的指定文件, 不影响工作区代码。
$ git reset -- <filename>
解决问题:
- 将 commit 后代码回滚到未 commit 状态或者未 add 状态
// 已commit 恢复至 未add 状态
$ git reset HEAD^
# 已commmit 恢复至 add 状态
$ git reset --soft HEAD^
# 将文件从 add状态 恢复至 未add 状态
$ git reset (HEAD)
# 将文件从 已修改状态 恢复至 未修改状态
$ git restore <filename>
- 代码不但commit了,还push了,如何撤回
# 回退到 commit 上个版本
$ git reset HEAD^
# 强制提交。提交后会发现远端仓库的上次 commit 记录已经消除
$ git push --force
// 可以继续修改代码了
3. git restore
git restore 将文件从已修改状态撤销,回退未被修改踪的状态
常用命令:
# 将文件从 已修改状态 恢复至 未修改状态
$ git restore <filename>
# 类似命令
$ git checkout <filename>
# 将文件从 add状态 恢复至 未add 状态,相当于撤销 git add 命令
$ git restore --staged <filename>
# 类似命令
git reset
4. git remote
git remote 管理一组跟踪存储库
常用命令:
# 添加新的远程仓库地址
$ git remote add origin xxx
# 更改现有的远程仓库地址
$ git remote set-url origin xxx
5. git cherry-pick
git cherry-pick 应用一些现有提交引用的更改。
将指定的提交记录(commit),应用于其他分支,这会产生一条新的提交记录。
注意: 不是非常推荐使用,能不用就不用。
常用命令:
# 将指定的提交 commitHash,应用于当前分支。
$ git cherry-pick <commitHash>
# 支持一次转移多个提交
$ git cherry-pick <HashA> <HashB>
解决问题:
- 我在 develop1 分支想使用 develop2 分支的某条提交怎么办
# 查看提交日志(可看到每条提交记录的 commitHash)
$ git log
# 使用指定的提交 commitHash 到当前分支
$ git cherry-pick <commitHash>
6. git revert
git revert 恢复一些现有的提交。
将现有的 commit 提交内容恢复成未提交的样子,并生成一条还原记录。
常用命令:
# 查看提交日志(可看到每条提交记录的 commitHash)
$ git log
# 恢复指定的 commit 记录
$ git revert <commitHash>
# 针对 merge 的 commit 记录
$ git revert <commitId> -m
# 此时会生成一条新的提交记录,需要你编辑提交信息。
# 编辑完毕后,按 Esc 键退出编辑模式,大写英文模式下输入ZZ,然后回车保存退回。
常遇问题解决
- 领导让我把小李的开发分支合并到我的开发分支上
// eg:我的开发分支为 dev-me,小李的开发分支为 dev-li
1. git switch dev-li 切换到小李分支
2. git pull 拉取代码到本地,保证本地代码为最新代码
3. git switch dev-me 切换到我的分支
4. git merge dev-li 将本地仓库 dev-li 代码合并到当前工作目录
5. git push
- 分支合并后发现代码冲突了
1. 不要慌,用 vscode 编辑器打开冲突项目
2. 从左侧工具栏切换到源代码管理
3. 你可以在源代码管理管理中看到所有冲突文件(合并更改列表下,并且文件后边有给你标❗)。
4. 依次打开冲突文件,选择使用自己的还是队友的,或者都要。
提示:
标绿的是 `Curren Change` ,也就是当前分支的修改内容。
标蓝的是 `Incoming Change` ,也就是合并分支的修改内容。
对比两处冲突,选择 `Accept Current Change` 还是 `Accept Incoming Change` 等等。
git merge和git rebase的区别
`git merge` 特点:
1. 新增一条合并记录。
2. 需要处理一次冲突。
3. 合并后的commit记录会按照提交时间来排列
`git rebase` 特点:
1. 没有多余的合并历史记录。
2. 可能需要处理多次冲突,通过 `git rebase --continue`继续。
3. 合并后的commit记录不一定按照commit的提交时间来排序。
- Git 密令配置
https://git-scm.com/downloadsGit下载地址
1. 打开 GitBash 命令行,输入 ssh-keygen 然后一路回车,生成的密令会保存当前系统用户的 .ss 目录中
2. 登录 GitHub,点击 setting 选项,然后选择 SSH Keys 菜单,将生成的 ssh 公钥(系统用户的.ss目录下的.pub结尾的文件)用笔记本打开,并将内容粘贴辅助到 Key 的输入项中,点击 Add Key 按钮则添加成功
3. 每次本地向 GitHub 仓库提交代码的时候,需要输入账号和密码,确认是本人才做才能提交。每次都这么操作比较麻烦,因此我们通过 ssh 协议配置一个 key,每次访问 GitHub 不需要再输入账号和密码
- 将代码提交到 GitHub 上却发现没有贡献度
- 原因很可能是你本地配置的邮箱和 github 上的邮箱不一致导致的。
$ git config --global user.name xxx
$ git config --global user.email xxx@163.com
- 最常用的代码提交方式,保持 git 日志的清晰
# 将本次开发代码暂存起来(可以选择增加一条记录信息)
$ git stash (save "stash message")
# 同步线上代码到本地
$ git pull
# 将暂存代码合并到本地,也是为了在本地解决冲突,减少不必要的 merge 记录
$ git stash pop
# 解决冲突后,提交代码
$ git commit -am 'xxx'
$ git push
参考
- git 文档
- 阮一峰 Git 教程
- Git 不要只会 pull 和 push,试试这5条提高效率的命令
- 常用 Git 命令清单
- 三年 Git 使用心得
- 详解 git pull 和 git fetch
- git fetch & pull 详解
- 进公司不会用 Git 拉项目!第二天被开除?天!那还在等什么,快点进来看看
- 优雅的提交你的Git Commit Message
最后
- 文章是自己手敲,是对工作日常的总结,如有错误之处,敬请指正
- 如果遇到什么问题就留言吧,能解决大家帮忙一起解决一下