diff --git a/DevOps.md b/DevOps.md index 3788dfe..9fb51c7 100644 --- a/DevOps.md +++ b/DevOps.md @@ -3015,7 +3015,183 @@ $ git revert [commit] -## 特殊命令 +## 高效命令 + +### 存储临时代码(stash) + +当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用git stash。该命令将保存本地修改,并恢复工作目录以匹配头部提交。stash 命令能够将还未 commit 的代码存起来,让你的工作目录变得干净。 + + + +**应用场景** + +某一天你正在 feature 分支开发新需求,突然产品经理跑过来说线上有bug,必须马上修复。而此时你的功能开发到一半,于是你急忙想切到 master 分支,然后你就会看到报错。因为当前有文件更改了,需要提交commit保持工作区干净才能切分支。由于情况紧急,你只有急忙 commit 上去,commit 信息也随便写了个“暂存代码”,于是该分支提交记录就留了一条黑历史。 + + + +**常用命令** + +```shell +# 保存当前未commit的代码 +git stash + +# 保存当前未commit的代码并添加备注 +git stash save "备注的内容" + +# 列出stash的所有记录 +git stash list + +# 删除stash的所有记录 +git stash clear + +# 应用最近一次的stash +git stash apply + +# 应用最近一次的stash,随后删除该记录 +git stash pop + +# 删除最近的一次stash +git stash drop +``` + +当有多条 stash(pop、drop同理),可以指定操作stash: + +```shell +# 使用stash list 列出所有记录 +$ git stash list +stash@{0}: WIP on ... +stash@{1}: WIP on ... +stash@{2}: On ... + +# 应用第二条记录 +$ git stash apply stash@{1} +``` + + + +### 软回溯(reset --soft) + +软回溯,回退 commit 的同时保留修改内容。回退你已提交的 commit,并将 commit 的修改内容放回到暂存区。 + + + +**应用场景** + +回溯节点,为什么要保留修改内容? + +- 应用场景1:有时候手滑不小心把不该提交的内容 commit 了,这时想改回来,只能再 commit 一次,又多一条“黑历史” +- 应用场景2:规范些的团队,一般对于 commit 的内容要求职责明确,颗粒度要细,便于后续出现问题排查。本来属于两块不同功能的修改,一起 commit 上去,这种就属于不规范。这次恰好又手滑了,一次性 commit 上去 + + + +**命令使用** + +```shell +# 恢复最近一次 commit +git reset --soft HEAD^ + +# 恢复到指定commit +git reset --soft 1a900ac29eba73ce817bf959f82ffcb0bfa38f75 +``` + + + +### 复制commit(cherry-pick) + +给定一个或多个现有提交,应用每个提交引入的更改,为每个提交记录一个新的提交。这需要您的工作树清洁(没有从头提交的修改)。将已经提交的 commit,复制出新的 commit 应用到分支里。 + + + +**应用场景** + +commit 都提交了,为什么还要复制新的出来? + +- 应用场景1:有时候版本的一些优化需求开发到一半,可能其中某一个开发完的需求要临时上,或者某些原因导致待开发的需求卡住了已开发完成的需求上线。这时候就需要把 commit 抽出来,单独处理。 +- 应用场景2:有时候开发分支中的代码记录被污染了,导致开发分支合到线上分支有问题,这时就需要拉一条干净的开发分支,再从旧的开发分支中,把 commit 复制到新分支。 + + + +**命令使用** + +```shell +# 一次转移单个提交 +git cherry-pick commit1 + +# 一次转移多个提交 +git cherry-pick commit1 commit2 + +# 多个连续的commit,也可区间复制 +git cherry-pick commit1^..commit2 + +# 放弃 cherry-pick +git cherry-pick --abort + +# 退出 cherry-pick +git cherry-pick --quit +``` + + + + + +### 撤销commit的修改内容(revert) + +给定一个或多个现有提交,恢复相关提交引入的更改,并记录一些这些更改的新提交。这就要求你的工作树是干净的(没有来自头部的修改)。将现有的提交还原,恢复提交的内容,并生成一条还原记录。 + + + +**应用场景** + +应用场景:有一天测试突然跟你说,你开发上线的功能有问题,需要马上撤回,否则会影响到系统使用。这时可能会想到用 reset 回退,可是你看了看分支上最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了。由于情况紧急,又想不到好方法,还是任性的使用 reset,然后再让同事把他的代码合一遍(同事听到想打人),于是你的技术形象在同事眼里一落千丈。 + + + +**命令使用** + +```shell +# 撤销指定的commit +git revert 21dcd937fe555f58841b17466a99118deb489212 +``` + + + +### 设置Git短命令 + +对喜欢敲命令而不用图形化工具的爱好者来说,设置短命令可以很好的提高效率。下面介绍两种设置短命令的方式: + +**方式一** + +```shell +git config --global alias.ps push +``` + +**方式二** + +打开全局配置文件 + +```shell +vim ~/.gitconfig +``` + +**写入内容** + +```properties +[alias] + co = checkout + ps = push + pl = pull + mer = merge --no-ff + cp = cherry-pick +``` + + + +**使用** + +```shell +# 等同于 git cherry-pick +git cp +```