stash(保存未commit代码)
为什么要保存未commit代码?
主分支上出bug了,要求你马上修复(情况很紧急)。但是 dev 分支上的功能还未开发完,难道要急忙 commit 上去,备注写个‘暂存代码’?
如果想切回主分支,但 dev 分支(你的分支)上还有未写完提交的代码,就可以用stash,具体就是将内容保存下来(可以给他命名),下次在主分支切回来的时候就可以将存下来的代码恢复
可以解决切换分支的问题:
git stash//保存未commit的代码
git stash save '名称'//给保存代码命名
git stash apply//应用最近一次保存
git stash pop//应用最近一次保存代码并删除
git stash list//获取stash的所有记录
git stash apply stash@{1}//应用第二条保存的代码
git stash drop//删除最近一次stash
git stash clear//删除所有stash记录
reset --soft(回退commit更改并保存在暂存区)
git reset --hard
让commit 记录强制回溯到某个节点
git reset --soft
(柔软的),除了回溯节点还会保留 commit 的内容
git reset --soft ^HEAD//恢复最近一次commit
对于已经 push 的 commit,也可以使用该命令,但是由于原创分支和本地分支有差异,需要强制推送 git push -f
来覆盖被 reset 的 commit
为什么要保存修改内容,并且切换分支?
commit 分工明确,会便于问题排查。但是你将两个功能不同的代码(一个是 feat,一个 fix)交上去了。这时你可以用 reset 将 commit 回退,然后重新调整暂存区代码,分两次提交
需要注意
git reset --soft
指定 commit 的 hash 值时,会将 这次 commit 到 最近一次 commit 的内容全部回退并保存在暂存区,不只是针对该 hash 的 commit
git log、git status、git reflog区别
git log
查看所有提交过的版本的详细信息
如果记录过多,则按上下键,Enter
(向下显示一行),空格
(显示下一页),来控制显示
git status
获取暂存区文件和已修改的文件状态,如果合并代码出现冲突,可以通过 git status
查看
git reflog
如果不小心删除了一个分支或者丢失了某个提交,怎么办?
reset \--soft
是后悔药,reflog 就是强力后悔药,记录了所有的 commit 操作记录,包括分支切换,合并,重置等等,即使在一些命令后出现了分支或者提交丢失,也可以通过reflog找到之前的代码。
应用
恢复丢失的提交或分支
- 不小心使用
git reset --hard
或者git branch -D
重置了提交删除了一个分支。可以用git reflog
找回之前的状态
# 查看reflog
git reflog
# 找到丢失提交的哈希值
git reset --hard <在reflog中找到丢失部分的hash>
查找历史操作记录
- 包括仓库中的分支切换、合并、重置等操作是在什么时候进行的,有助于我们理解仓库的状态并排查问题
cherry-pick(将已经提交的 commit,复制成为新的 commit 并应用到分支里)
为什么还要复制新的 commit ?
团队开发中,dev 分支合并到线上有问题,这时候可以拉一个干净的开发分支,再从 dev 分支中把commit 复制到干净分支
# 复制单个 commit
# 通过 git log 获取目标 commit 的 hash 值,并复制
git log
# 切换分支(干净的开发分支)
git checkout clean-dev
# 使用 cherry-pick 把目标 commit 引用到当前分支
git cherry-pick commit-hash
# 复制多个 commit
git cherry-pick commit1-hash commit2-hash
# 复制多个连续 commit 区间
git cherry-pick commit1-hash^..commit2-hash
发现冲突了怎么办?
发现冲突 cherry-pick
会停下来,让用户决定如何操作
- 继续复制:假设一共复制四条 commit,分别命名为:a,b,c,d,如果 b 发生代码冲突,此时 a 被复制成功。然后解决冲突后,使用
git checkout-pick --continue
接着复制。 - 放弃
cherry-pick
:git cherry-pick --abort
,回到操作前的样子,就像什么都没发生过。 - 退出
cherry-pick
:git cherry-pick --quit
,保留已复制成功的 commit,并退出cherry-pick的流程。
revert(将某个 commit 还原,并生成新的提交记录)
为什么不用reset,要用这个?
如果你的某个提交有问题,但是已经过去挺久了,其他开发成员也提交了很多代码。上面介绍 reset 时也说了,会撤回当前 commit 以及最新 commit 的区间。这时使用 revert 就可以处理这种情况。
(编辑提交记录)
# 回复对应的 commit
git revert commit-hash
# revert 会生成一条新的提交记录,编辑提交信息(如上图),编辑好后 :wp退出
最新的log上,生成了一条 revert 记录,之前提交的记录还是保留着,但是修改的代码已经被撤回了
小方法
如果不记得常用的命令,可以输入git --help
查看