git stash
官方解释:当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用 git stash 。该命令将保存本地修改,并恢复工作目录以匹配头部提交。
比如某一天你正在自己的分支上开发你的新需求,突然被测试同学提了一个线上bug,必须马上修复。而此时你的功能开发到一半,于是你急忙的想切换到另一个分支上进行修改,然后你就会看到以下报错。
bash
error: Your local changes to the following files would be overwritten by checkout:
src/pages/xxxx/index.tsx
Please commit your changes or stash them before you switch branches.
Aborting
因为当前有文件更改了,需要提交 commit 保持工作区干净才能切换分支。由于情况紧急,你就急忙 commit 上去。commit 信息也就随便写了个"暂存代码",于是该分支提交记录就留了一条无用的记录。而有了stash 你只需要
js
git stash
git checkout xxxx
// 相关命令
git stash // 保存当前未commit的代码
git stash save "备注的内容" // 保存当前未commit的代码并添加备注
git stash list // 列出stash的所有记录
git stash clear // 删除stash的所有记录
git stash apply // 应用最近一次的stash
git stash pop // 应用最近一次的stash,随后删除该记录
git stash drop // 删除最近的一次stash
// 当有多条 stash,可以指定操作stash,首先使用stash list 列出所有记录:
git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ...
stash@{2}: On ...
// 应用第二条记录
$ git stash apply stash@{1}
git reset
用于回退版本。可以指定退回某一次提交的版本。
接着上面的场景,你修改完了代码。准备提交却发现了一些问题需要回退一下提交,那么这个时候就需要用到git reset 这个命令了
git reset 分为三种:软 --soft, 中 --mixed,硬 --hard 对应三种回滚程度,程度越硬,回滚越狠。
js
// --soft
// 写完代码后提交了,但发现 commit message 写错了
git reset --soft HEAD^ // 回退到上个版本 但是只回退了commit信息
// --soft 修改文件已 add,但尚未 commit
// --mixed(是默认设定 可以省略不写)
// 你 `git add` 太快了,把不该提交的文件加进去了
git reset HEAD^ // 修改文件会变成未add的状态
// --hard 硬核,彻底,会彻底返回到回退前的版本状态,了无痕迹
// 改坏了,干脆回滚
// 方法一
git reset --hard~3 // 回退三个版本
git reset --hard~n // 回退n个版本
// 方法二
git reset --hard HEAD^ // 表示回退一个版本
git reset --hard HEAD^^ // 表示回退2个版本
// 方法三
git reset --hard xxxxxx // 回退到索引值
git reflog
此命令用来管理引用日志(reflog)。引用日志会记录在本地仓库里,分支的指针和其他引用在什么时候被更新过
继续上面的场景,你学会了 git reset 来回滚你的代码,但是你只是想修改一下 commit message 但一不小心用了最狠的 --hard, 你的代码全都消失不见了。此时 该怎么办呢,别担心如果 reset 被称为后悔药的话那么 reflog 就是后悔药中的后悔药,它记录了你所有的操作信息。
这时 log 信息如下

不小心回退到 C 之后会发现 A 、B的 commit 记录都没有了。最新的记录变成 C 了

那么这个时候就可以用 reflog了

就能找到我们所有的提交记录了,发现 c2c8086 就是我们最新提交的 commit ,我们reset到最新的那个commit后再次log,就发现记录都回来了
git log 和 git reflog 的区别
git log 命令可以显示所有提交过的版本信息
git reflog 可以查看所有分支的操作记录(包括已经被删除的 commit 记录和 reset 的操作)
git cherry-pick
某天你们的项目同时有两个迭代并行开发,但是两个迭代都有依赖同一个功能,那么你可能会再这个分支上完成这个功能,然后将这些代码再copy到另一个分支上。但是有了 cherry-pick 你就不需要再做重复的工作了。
通过 cherry-pick 命令,Git 可以将任何分支中的选定提交合并到当前的 Git HEAD 分支中。 在执行 git merge 或 git rebase 时,一个分支的所有提交都会被合并。而 cherry-pick 命令则允许你选择单个提交进行整合。
使用 merge 的情况: 在执行 merge 或 rebase 时,一个分支的所有提交都会被整合。

使用 cherry-pick 的情况: 允许你选择个别提交进行整合。只有 C2 被整合到主分支,而不是 C4。

如何使用
- 拉取本地分支。使用 git fetch。
- 回到要合并的分支。你可能会通过运行 git checkout dev。
- 找到要拉入分支的提交。转到 git log,为每条提交获取唯一的提交哈希值。
- "Cherry-pick" 您想要加入该分支的提交。运行以下命令:git cherry-pick {commit sha}。这将只把这个提交拉入当前分支。
- (可选) 在某些情况下, 可能需要手动解决冲突.
- 像往常一样推送这个分支: git push。
设置 Git 短命令
方式一
js
git config --global alias.ps push
方式二
js
// 打开全局配置文件
vim ~/.gitconfig
//写入内容
[alias]
co = checkout
ps = push
pl = pull
使用
git pl 等同于 git pull