|
|
|
@ -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 <commitHash>
|
|
|
|
|
git cp <commitHash>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|