真的好用的Git方法

152 阅读5分钟

前言

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 --comtinuecherry-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