这才是真正的Git——Git实用技巧详解

本篇是这个系列的最后一篇文章,以前的文章主要讲的是基础原理部分(见上方专辑),在理解原理的基础上,介绍一些实用的技巧给你们,但愿能提升你们的开发效率。git

这篇文章由于更多的是列举实际应用的技巧,因此文章结构会显得散乱一些,也不会像前两篇文章那样要求你们顺序阅读。每一个点都是互相独立的,你们能够根据本身的须要学习。shell

在这篇文章里我会使用操做录屏的方式来介绍例子,但愿这种方式可让你更直观的了解命令的使用方法。vim

将几个commit压缩成一个

这才是真正的Git——Git实用技巧详解

这里有一点要特别注意的是:rebase会致使新的commit节点产生,因此切记不要对多人共用的远端分支进行rebase。ide

rebase -i 是个很实用且应用普遍的工具,但愿你们都学会它的使用。它还能够用来修改commit信息,抛弃某些commit,对commit进行排序等等。具体命令以下,操做方式跟动图一致,都是在vim里面进行编辑。这里不展开,感兴趣的同窗能够本身操做一下。工具

 
 
  1. # Commands: 学习

  2. # p, pick <commit> = use commit 开发工具

  3. # r, reword <commit> = use commit, but edit the commit message 测试

  4. # e, edit <commit> = use commit, but stop for amending this

  5. # s, squash <commit> = use commit, but meld into previous commit spa

  6. # f, fixup <commit> = like "squash", but discard this commit's log message 

  7. # x, exec <command> = run command (the rest of the line) using shell 

  8. # d, drop <commit> = remove commit 

  9. # l, label <label> = label current HEAD with a name 

  10. # t, reset <label> = reset HEAD to a label 

  11. # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>] 

  12. # .       create a merge commit using the original merge commit's 

  13. # .       message (or the oneline, if no original merge commit was 

  14. # .       specified). Use -c <commit> to reword the commit message. 

另外若是要合并的是最近的几个commit,咱们还能够用git reset --soft HEAD~3 && git commit -m 'xxx'来实现。对这个有问题的同窗能够参照Git内部原理强调的可视化方法思考一下。

找回丢失的commit节点或分支

像上一步rebase后发现不符合预期,如何恢复?不当心删除了一个分支,如何找回?

“学会这个技能,你的同事会请你喝奶茶的,并且说不定还能收获妹子。” —— 来自往期课程的某位同窗

这才是真正的Git——Git实用技巧详解

主要思路为:找到要返回的commit object的哈希值,而后执行git reset恢复

咱们知道Git的出现就是为了尽可能保证咱们的操做不被丢失,在Git内部原理中咱们讲过,git object一旦被建立,就不可变动,因此只要找到它对应的哈希值,就能找回。可是ref呢?在Git内部原理中咱们也讲过,它是一个可变的指针,好比说你在master中提交了一个commit,那当前的master这个ref就会指向新的commit object的哈希值。reflog 就是将这些可变指针的历史给记录下来,能够理解成 ref的log,也能够理解成 版本控制的版本控制

得到一个干净的工做空间

当咱们实验一种思路,或者跟朋友讲代码时,咱们可能会随意的修改代码。而当咱们回到正常的开发时,咱们须要一个干净的工做目录,即保证目前工做目录跟Git最后一次commit的文件是一致的。咱们能够怎么作?

这才是真正的Git——Git实用技巧详解

尽可能少用会丢失文件的操做,除非你可以肯定再也不须要这些文件。

修改最近一个commit

commit完发现有一些临时的log忘记去掉?有一些文件忘记添加?commit信息出现错别字?

这才是真正的Git——Git实用技巧详解

也可使用 git reset HEAD~,而后执行你须要的修改,再commit便可,同上面介绍的命令效果是相同的。

提交一个文件中的部分修改

这才是真正的Git——Git实用技巧详解

Git interactive add 还有不少功能,也推荐你们有时间能够尝试一下。

禁止修改多人共用的远端分支

若是一条远端分支有多人共用,那么不要在上面执行reset、rebase等会修改这条分支已经存在的commit object的命令。

这才是真正的Git——Git实用技巧详解

具体的解释参照这篇文章 Rebase and the golden rule explained 。

撤销一个合并

若是是一个本地分支,仅需git reset --hard <合并前的SHA1>便可。

若是这个分支已经被推送到远端,好比说合并进master,发到线上才发现有bug须要回滚。这时分支有可能已经被其余人所使用,根据“禁止修改多人共用的远端分支”,你须要执行git revert -m 1 <合并的SHA1>,新增一个revert节点,以下图中的E'。

这才是真正的Git——Git实用技巧详解

但要注意不要在原特性分支继续开发,而应该删除原来的分支,从E'节点拉出新分支作bug修复等。

若是在原特性分支上继续开发,则在合并回master的时候须要作一次revert操做revert掉E'节点,变成E‘’(以下图),否则很容易出现丢失文件等问题。具体缘由分析参照分支合并中的总结。

这才是真正的Git——Git实用技巧详解

从整个历史中删除一个文件

代码要开源了,但发现其中包括密钥文件或内网ip怎么办?

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

可使用filter-branch命令,它的实现原理是将每一个commit checkout出来,而后执行你给它的命令,像上面的rm -f passwords.txt,而后从新commit回去。

 这个操做属于高危操做,会修改历史变动记录链,产生全新的commit object。因此执行前请通知仓库的全部开发者,执行后全部开发者重新的分支继续开发,弃用之前的全部分支。

其余好用的命令

下面这些命令也是比较实用的命令,感兴趣的同窗能够本身学习一下。

  • git bisect 二分查找出现问题的变动节点,好比你发现当前提早下测试是不经过的,但HEAD~10(10个提交前)的测试是能够经过的,就能够用git bisect 来帮你定位到出现问题的变动点。

  • git blame 查看某行代码最后是谁修改的。

  • git show-branch 直观的展现多条分支间的关系。

  • git subtree 拆分或合并仓库。

【编辑推荐】

  1. 致远互联携手华为云启动开发者大赛 加速企业应用定制向平台生态转型

  2. 快来测试Python开发工具pipenv的新版本

  3. 30 多个有内味道且笑死的人代码注释

  4. 科学家的挑战:十年前写的代码如今还可否运行

  5. 用Python进行多元线性回归分析(附代码)

【责任编辑:张燕妮 TEL:(010)68476606】

相关文章
相关标签/搜索