git:cherry-pick、revert、reset介绍

git简介

这里并不是git的科普介绍,只是想说git的核心---修改,git作为版本控制器的核心就是修改,记录修改、追踪修改、回退修改、提交修改等等操作。

tips

  • git checkout -- filename 可以把工作区的某个文件的修改撤回到上一次add或者commit的状态,不过filename不能省略,可以使用 git checkout -- 不加文件名来查看当前工作区修改了哪些文件,这个只是针对工作区的问题;

  • git reset HEAD filename 可以把add到缓存区的文件回退到工作区,也就是把add filename这个过程给回退了,这并不会修改文件的内容,这只是要把缓存区的某个文件变成和HEAD这个当前版本相同,也就是说如果你多次add,这会回退到第一次add的过程,和上面的操作一样,也可以不带上文件名来查看哪些文件被添加到了缓存区;

  • git reset --hard HEAD~【1,2,3,4,5...】这个是大家熟悉的本地版本的回退

某分支上的修改迁移到另一分支

今天不行遇到了一个问题,在一个工程里面,在修改某个分支a的时候,被叫去修改一个bug,切到分支b,这时候在改完了不过后忘了切回之前的分支a,而是在上面继续编写本应该是分支a的内容,这样就是b分支存在了一部分a分支的代码,这个时候需要把这段修改迁移到a分支上, 两个思路:

  1. 如果还没有在b分支上commit的话[add的话没影响,在迁移后,就不会再当前分支的缓存中]。直接切到a分支,会提示有一堆修改没有被commit的代码,切到a分支后,就可以commit这段没有被commit的代码了,也就是在b分支上编写的部分正确的被迁移到了a分支,
    如果这个时候已经commit,最开始觉得其实也只是放到了本地仓库,回退一下,回退到HEAD^上一版本就好,这个时候就回到了上一个地方,git reset --soft HEAD^,这个时候执行切换分支的话就会出现问题,提示不能切换,否则修改的文件会被覆盖,要么gitadd commit或者git stash,这就蛋疼了下面使用第二种方法来吧。

  2. 如果已经commit了,可以这么来:git log找到你commit的分支号,然后直接切换到a分支,执行git cherry-pick commit-id,这个commit-id就是那个b分支错误commit的id,这个命令就是把这个commit的修改拿到当前分支来,很简单粗暴而有效,在切换到b分支,使用git revert commit-id把这个错误的分支号移除。

revert reset cherry-pick

git revert

git revert命令其实很有用:参考 http://www.cnblogs.com/irocke... ,当我们的某个分支中有了很多版本之后,形成了一条版本链,这个时候我们如果想去除这个;线路中的某一版本,但是保留版本链中的其他所有修改,生成一个新的版本链,版本链中的HEAD就是revert最新生成的版本。

所以revert是会生成新版本的指令。可以这么想,
链就像一个链条,是一环扣一环的,其中的一环就是一个版本,
现在想去这个链条中的某一环(某个版本),
执行git revert HEAD~2,这个HEAD~2就是这个要删除的版本(链条中的一环),就会把这个环解开剔除,
把和这个剔除的环(版本)相邻的环连在一起,形成了一下心得链条(少了一环),
然后在链条的最后面添加一个新的没有任何修改的环(revert HEAD~2 这个新的commit版本)
整个过程就像剔除了中间某一个版本,最后加上了一个没有任何修改的新的版本。
需要注意的是,不要随意删除中间的版本,因为可能会存在依赖,最好是revert最新的版本,风险会小很多。

git reset

git reset [--hard|soft|mixed|merge|keep] [或HEAD]是比较常用的指令,其中比较重要的是mode,也就是 --hard、--soft、--mixed。。。比较常见的是--hard和--soft;

--hard是指完全重设,会把回退到某版本之后的修改全部删除,

--soft这是个回退解体,让版本库回退到某个版本,这个版本之后的修改全部存在缓存区,这个时候在commit的话,又会把会退的部分重新加载到最新版本中;

参考:http://blog.csdn.net/hudashi/...

git cherry-pick

  • git cherry-pick 用于把另一个本地分支的commit修改应用到当前分支,也是解决之前遇到问题的关键,可以直接把其他的分支上的修改或者是某一个版本直接引过来,可能会存在冲突,这个时候就和正常的冲突太一样的解决就好了。
    参考:http://blog.csdn.net/hudashi/...

你可能感兴趣的:(git)