前言
git早已经是每个开发必备的技能,但是大多数开发还是只会pull、push这些简单的命令,遇到一些稍微麻烦的事件,就不好处理。
暂存未提交内容: stash
用于暂存没有提交的内容,运行该命令后,所有没有commit的代码,都会暂时从工作区移除,回到上次commit时的状态。
场景
当你在a分支开发时,突然线上有个bug,需要紧急修复,这个时候需要切换到b分支,进行修复。但是a也才刚开发一半,如果这个时候直接提交,该分支提交记录就多了一条黑历史,但是使用stash,可以很好的解决这个问题。
使用
暂时保存a分支代码
git stash
当修复完线上代码,回到a分支恢复代码
git stash apply
其他相关命令
// 保存未提交记录,并加备注
git stash save ‘备注内容’
// 列出所有stash
git stash list
// 删除所有stash记录
git stash clear
// 应用最近一次stash
git stash apply
// 应用最近一次的stash 随后删除记录
git stash pop
// 删除最近一次的stash
git stash drop
当有多条 stash, 可以指定某条stash
// 列出所有stash
git stash list
// 指定第二条
git stash apply stash@{1}
注意:git stash 不会存储新增的文件,如果想存储新增的文件,需要先git add
回到某一节点:reset
命令将当前分支指向另一个位置
一般我们经常用 git reset --hard,它是将记录强制回到某个节点,而 git reset --soft 也是回到某个节点,但是会保留该节点需要提交的内容,我们接下来主要讲解soft的用法
场景
场景一:当我们把不该提交的东西提交了,想修改回来,又不想重新在commit一次
场景二:团队要求提交的内容,要职责明确,方便后期排查问题,但本来属于两块不同的功能一起commit上去了怎么办呢
使用
soft 就是那个后悔药
切换到当前节点,有两点需要注意
- 在
reset --soft指定 commit 号时,会将该 commit 到最后一次 commit 的所有修改内容全部恢复,而不是只针对该 commit - 提交时,需要强制推送
git push -f来覆盖被 reset 的 commit,因为远程分支和本地分支有差异
git reset --soft 1a900ac29eba73ce817bf959f82ffcb0bfa38f75
指定提交记录:cherry-pick
指定某分支的某条提交记录,或多条提交记录,合并到另一个分支上
当a分支所有代码都要复制到b分支时,我们常用 git merge, 但是只有局部需要改变时,就需要用git cherry-pick
场景
场景一:当需求开发一半,需要将某些需求提前上线
场景二:当开发分支被污染的时候,需要重新拉一个分支,把之前的分支commit过去,过滤被污染的地方
使用
复制单条
比如将a分支的commit1,复制到b分支上
首先将a分支的commitHash复制下来,然后切换到b分支
git cherry-pick commit1
复制多条
比如a分支 commmit1和commit2 都需要复制到b分支
git cherry-pick commit1 commit2
如果是连续的commit,可以区间复制(包含commit1,commit2)
git cherr-pick commit1^..commit2
代码冲突
当cherry-pick多个commit时,如果有代码冲突,这时候cherry-pick 会停下来,
让用户去抉择
比如将a分支的commit1,commit2,commit3同时复制到b分支上
当复制commit2发生冲突时,这时候需要解决冲突,并将代码提交的缓存区
然后使用cherry-pick --comtinue让cherry-pick继续,最后commit3也会被复制进来。
但是也可以放弃或者退出流程
- 放弃
cherry-pick,回到操作前的样子,就像什么都没发生过。
gits cherry-pick --abort
- 退出
cherry-pick不回到操作前的样子。即保留已经cherry-pick成功的 commit,并退出cherry-pick流程
git cherry-pick --quit
撤销commit: revert
用于撤销commit,即将提交的代码还原,并生成一条新的还原记录
场景
比如说之前新修改的需求,被要求还原回去,但是你提交后,后面还有别的同事提交了代码,那如何在不影响同事代码的情况的,将自己提交的代码进行还原
使用
记录自己那条提交记录commitHash为commit1,这个时候会让你编辑提交记录,编辑完后:wq保存退出
git revert commit1
修改文件名 mv
场景
有时文件名或者文件夹大小写不小心写错,本地运行时不会报错,但是发布到线上就会报错,我们直接修改文件名,git是没有反应的
使用
当修改文件名称时,比如我们将a.vue 改为 b.vue 就可以直接写 git mv a.vue b.vue
git mv oldname newname
当修改文件夹名称时,比如我们将a1 改为 b1, 这时候 直接写git mv a1 b1, git会报错,提示修改失败
这时候 我们需要一个临时变量,比如temp,用于存储之前旧的文件夹
// 存储之前的旧文件夹
git mv template/oldName temp
// 再给旧的文件夹重新命名
git mv temp template/newName