git高级技巧


一. 概述

       git作为开发者必备技能, 除了日常使用的git add, commit, push, pull, fetch, merge, checkout等,还有一些比较好玩的命令, 本文将会介绍几个git”骚操作”.

二. git rebase

       git rebase 官方叫作『变基』,名字比较唬人,但是功能确实超级强大。rebase的两大使用场景分别是合并分支、修改commit.

分支合并

       刚接触git时,教程中教我们使用git merge feature/name 将feature/name合并到当前分支,这种合并方式解决冲突较为简单,但是commit log非常verbose,举例如下 (1) init初始化仓库,目前只有文件parse.sh, 当前commit:

(2)从master 切到新分支feature/develop-java,对parse.sh进行修改,并commit:

(3) 同时从master拉分支feature/develop-python,对parse.sh进行修改,提交commit后切换到feature/develop-java,然后合并feature/develop-python

(4) 可以看到多生成一个merge commit

下面重复1-3步骤,将merge替换成rebase

说明:
  • rebase过程中如果发生冲突,需要先打开文件解决冲突,然后一定要git add 修改文件, 然后直接git rebase –continue 就ok了,一定不要git commit.
  • 可以看到最新的commit是本分支的,即会把别的分支的commit压在下面,更加流畅.

合并commit

说明:
  • git rebase -i commitId,commitId可以在git log里看到
  • 在合并其他分支的过程中同样可以合并commit,日常开发很常用

三. git check-pick

        比如最近一周我一直在feature/develop-java分支上开发,并且有多个功能点,但是并不要求同时上线,我想把某几个commit“摘”出来到一个新的分支,那么就可以使用cherry-pick, 如下: (1) 从master拉出新的分支feature/issue, 并确认要“摘取”的commitId.

四. git grep

        熟悉linux grep命令的同学肯定猜得出来grep是查找检索功能, 比如项目中需要找出所有定义Long类型的userId,然后修改为string类型,思路是查询所有java文件中的”Long userId”. 在git仓库下输入” git grep ‘Long userId’ “ 即可

说明:

  • git grep 后面的参数和linux中的grep使用方法一致
  • 上面示例中 git grep ‘Long userId’ == find . -name ‘*.java’ xargs grep ‘Long userId’

五. git stash

        经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。 简而言之就是本地修改了仓库但是不想提交commit, 此刻需要切换到别的分支,那么就直接使用git stash

说明:

  • 可以使用git stash list 查看你本地一共有哪些”储藏”
  • 如果想还原”储藏”, 使用 git stash apply stash@{index} 或 git stash pop 即可
  • “储藏”只对本分支有效,无法查看其它分支的”储藏”

六. git fsck

        git fsck用于文件系统检测,项目中的commit 不小心丢失/删除时,可以使用git fsck –lost-found看到丢掉的提交。

说明:

  • 可以通过运行 git show commitId 查看提交之后的改变,然后运行git merge commitId 来恢复到之前的提交

七. 结束语

        本文介绍了几个功能强大的git技巧,只列举了最简单的使用方式,读者可以先在本地执行 git [commandX] -h 查询具体帮助文档,在工作中多操作几次就很容易掌握。



本作品由 zhans 创作,采用 CC BY-NC-SA 3.0 许可协议 进行许可。

Comments