stash
官方解释:当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用git stash。该命令将保存本地修改,并恢复工作目录以匹配头部提交。
stash 命令能够将还未 commit 的代码存起来,让你的工作目录变得干净
代码语言:javascript复制git stash # 保存起来
git stash apply # 释放出来
# 保存当前未commit的代码并添加备注
git stash save "备注的内容"
# 列出stash的所有记录
git stash list
# 删除stash的所有记录
git stash clear
# 应用最近一次的stash
git stash apply
# 应用最近一次的stash,随后删除该记录
git stash pop
# 删除最近的一次stash
git stash drop
应用场景:
- 1. 突然有个紧急的任务,但当前分支代码写到一半,还有bug没处理,保存又怕到时忘记处理,先暂存起来。
- 2. 本来是B任务的修改,结果切换分支搞错了,在A分支修改了,可以直接暂存起来,切换到B分支再释放出来。
reset --soft
完全不接触索引文件或工作树(但会像所有模式一样,将头部重置为)。这使您的所有更改的文件更改为“要提交的更改”。
回退你已提交的 commit,并将 commit 的修改内容放回到暂存区。
一般我们在使用 reset 命令时,git reset --hard
会被提及的比较多,它能让 commit 记录强制回溯到某一个节点。而 git reset --soft
的作用正如其名,--soft
(柔软的) 除了回溯节点外,还会保留节点的修改内容。
git init
echo 'first update' >> a.txt
git add .
git commit -m 'first update'
echo 'second update' >> a.txt
git add .
git commit -m 'second update'
查看一下日志
代码语言:javascript复制(base) xj@xjtest:~/temp/0912$ git log
commit 0175ac083b7b35d95834718a1bf59fd72be46733 (HEAD -> master)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:08:26 2023 0800
second update
commit 87770d53544d5dd5f1192798f7109704e0620874
Author: xj <xj@example.com>
Date: Tue Sep 12 19:08:26 2023 0800
first update
--hard
测试
(base) xj@xjtest:~/temp/0912$ git reset --hard 87770d53544d5dd5f1192798f7109704e0620874
HEAD is now at 87770d5 first update
(base) xj@xjtest:~/temp/0912$ git log
commit 87770d53544d5dd5f1192798f7109704e0620874 (HEAD -> master)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:08:26 2023 0800
first update
注意这里,--hard
退回之后,新的修改都全没有了。
(base) xj@xjtest:~/temp/0912$ git status
On branch master
nothing to commit, working tree clean
--soft
测试
(base) xj@xjtest:~/temp/0912$ git reset --soft HEAD^ # 恢复最近一次 commit
(base) xj@xjtest:~/temp/0912$ git log
commit 87770d53544d5dd5f1192798f7109704e0620874 (HEAD -> master)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:08:26 2023 0800
first update
注意这里,--soft
退回之后,新的修改还有保留
(base) xj@xjtest:~/temp/0912$ git status
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: a.txt
cherry-pick
给定一个或多个现有提交,应用每个提交引入的更改,为每个提交记录一个新的提交。这需要您的工作树清洁(没有从头提交的修改)。
将已经提交的 commit,复制出新的 commit 应用到分支里
应用场景
commit 都提交了,为什么还要复制新的出来?
应用场景:有时候版本的一些优化需求开发到一半,可能其中某一个开发完的需求要临时上,或者某些原因导致待开发的需求卡住了已开发完成的需求上线。这时候就需要把 commit 抽出来,单独处理。
代码语言:javascript复制git init
git checkout -b master
echo 'init' >> a.txt
git add .
git commit -m 'master commit1'
git checkout -b branch1
echo 'first' >> a.txt
git add .
git commit -m 'first update'
echo 'second' >> a.txt
git add .
git commit -m 'second update'
echo 'Third' >> a.txt
git add .
git commit -m 'Third update'
git log
查看历史
代码语言:javascript复制(base) xj@xjtest:~/temp/0912$ git log
commit c5d72ee84f7e2a92198269b262715eef4a131fba (HEAD -> branch1)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:34:14 2023 0800
Third update
commit a2dd8ac380f0110629a7aa42727ea6947da56cb6
Author: xj <xj@example.com>
Date: Tue Sep 12 19:34:14 2023 0800
second update
commit e1752f2b9c0c0eba6752418e35df9e06d1c53ca0
Author: xj <xj@example.com>
Date: Tue Sep 12 19:34:14 2023 0800
first update
commit 9ad46c4a1dd339e966a9981899dc4206dc1d15e3 (master)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:34:03 2023 0800
master commit1
切换到新的分支
代码语言:javascript复制git checkout master
git checkout -b branch2
把旧的分支上某个commit释放到新的分支上
代码语言:javascript复制git cherry-pick a2dd8ac380f0110629a7aa42727ea6947da56cb6
herry-pick 代码冲突
在 cherry-pick
多个commit时,可能会遇到代码冲突,这时 cherry-pick
会停下来,让用户决定如何继续操作。
revert
给定一个或多个现有提交,恢复相关提交引入的更改,并记录一些这些更改的新提交。这就要求你的工作树是干净的(没有来自头部的修改)。
应用场景:有一天测试突然跟你说,你开发上线的功能有问题,需要马上撤回,否则会影响到系统使用。这时可能会想到用 reset 回退,可是你看了看分支上最新的提交还有其他同事的代码,用 reset 会把这部分代码也撤回了。由于情况紧急,又想不到好方法,还是任性的使用 reset,然后再让同事把他的代码合一遍(同事听到想打人),于是你的技术形象在同事眼里一落千丈。
代码语言:javascript复制git init
git checkout -b master
echo 'first' >> a.txt
git add .
git commit -m 'first update'
echo 'second' >> a.txt
git add .
git commit -m '你的提交'
echo 'Third' >> a.txt
git add .
git commit -m '小伙伴的提交'
代码语言:javascript复制(base) xj@xjtest:~/temp/0912$ git log
commit 0aa72921f5ebeb4105beee0dac7be4b6fc6f35cd (HEAD -> master)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:40:11 2023 0800
小伙伴的提交
commit 1eaa40f8a26db5caf85b8c0d7cd419c57e90695e
Author: xj <xj@example.com>
Date: Tue Sep 12 19:40:11 2023 0800
你的提交
commit 2e2ddf0ca4b86204b0361f6a44b84c549f77b6eb
Author: xj <xj@example.com>
Date: Tue Sep 12 19:40:11 2023 0800
first update
revert 掉自己提交的 commit
代码语言:javascript复制(base) xj@xjtest:~/temp/0912$ git revert 1eaa40f8a26db5caf85b8c0d7cd419c57e90695e
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
error: could not revert 1eaa40f... 你的提交
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
reflog
如果说 reset --soft
是后悔药,那 reflog 就是强力后悔药。它记录了所有的 commit 操作记录,便于错误操作后找回记录。
应用场景
应用场景:某天你眼花,发现自己在其他人分支提交了代码还推到远程分支,这时因为分支只有你的最新提交,就想着使用 reset --hard
,结果紧张不小心记错了 commitHash,reset 过头,把同事的 commit 搞没了。没办法,reset --hard
是强制回退的,找不到 commitHash 了,只能让同事从本地分支再推一次(同事瞬间拳头就硬了,怎么又是你)。于是,你的技术形象又一落千丈。
git init
git checkout -b master
echo 'first' >> a.txt
git add .
git commit -m 'first update'
echo 'second' >> a.txt
git add .
git commit -m 'second update'
echo 'Third' >> a.txt
git add .
git commit -m 'Third update'
查看历史记录
代码语言:javascript复制(base) xj@xjtest:~/temp/0912$ git log
commit 35c16d86da2691a96133081e70658f01e272daaa (HEAD -> master)
Author: xj <xj@example.com>
Date: Tue Sep 12 19:45:46 2023 0800
Third update
commit 9b2777e045901e9d8c01ea6f322253026a0ab7fa
Author: xj <xj@example.com>
Date: Tue Sep 12 19:45:46 2023 0800
second update
commit fcbdc19704b8d74256c8e6e881e53ce97a520cfe
Author: xj <xj@example.com>
Date: Tue Sep 12 19:45:46 2023 0800
first update
现在你想回到second update
,结果copy错误,回到了first update
,还关闭了命令行窗口
git reset --hard fcbdc19704b8d74256c8e6e881e53ce97a520cfe
用reflog查看commit
代码语言:javascript复制(base) xj@xjtest:~/temp/0912$ git reflog
fcbdc19 (HEAD -> master) HEAD@{0}: reset: moving to fcbdc19704b8d74256c8e6e881e53ce97a520cfe
35c16d8 HEAD@{1}: commit: Third update
9b2777e HEAD@{2}: commit: second update
fcbdc19 (HEAD -> master) HEAD@{3}: commit (initial): first update
回到想要的commit
代码语言:javascript复制git reset --hard 35c16d8
我有个大胆的想法
小伙伴在平常有没有遇到以下这种情况:遇到技术难题时,网上教程一堆堆,优秀的很多,但也有很多是过时的,或者是copy来copy去,甚至错别字都没改。
我公众号的技术文章,都是亲自校验过的。至少可以保证在发文的一段时间,不会过时。如果你在实操过程中,有遇到问题,可以在同名公众号留言,免费解答,相互学习,相互成长^v^