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] [<commit>或HEAD]是比较常用的指令,其中比较重要的是mode,也就是 --hard、--soft、--mixed。。。比较常见的是--hard和--soft;

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

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

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

git cherry-pick

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

class Myself {

1.5k 声望
53 粉丝
0 条评论
推荐阅读
HTML元素的height、offsetHeight、clientHeight、scrollTop等梳理
在前端的日常开发中,我们经常无可避免的需要获取或者监听一些页面的属性,那么我们需要经常了解一些属性代表的含义才能更好地使用这些属性。特别是一下这些:

caoweiju2阅读 4.1k

一个开源vue网站博客,nuxt开源网站,前后端分离项目
开媛笔记,基于nuxt ssr首屏服务器端渲染 。用于分享、记录、交流和学习,希望可以帮助到小伙伴们。同时网站在不断更新,创造属于猿(媛)的世界 -$Bao Yalong ..Let's Go! [链接]

jigsaw16阅读 8.4k评论 3

Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go5阅读 2.3k评论 2

封面图
Git 入门与实践
Git 入门与实践推荐:猴子都能懂的 GIT 入门Git --everything-is-loca 官方文档Git 教程-廖雪峰Git 的使用方式有很多。图形化 —— 小乌龟(Tortoise Git )、命令行—— git bash、IDE 集成等 ......目录1. 基础配置...

RainBow1阅读 2.2k

openKylin 0.9.5版本正式发布,加速国产操作系统自主创新进程!
2023年1月12日,中国桌面操作系统根社区openKylin(开放麒麟)正式发布openKylin 0.9.5操作系统版本。此版本充分适应5G时代需求,打通平板,PC等设备,实现多端融合,弥补了国产操作系统的短板,有效推动国产操作...

openKylin5阅读 7.2k

封面图
SegmentFault 思否技术周刊 Vol.78 — Git 必看技术补给
Git 的诞生是一个非常有趣的故事。1991年 Linus 开源了 Linux 内核,无数 Linux 爱好者在世界各地为 Linux 编写代码,那么问题来了,这些代码该如何管理呢?起初 Linus 使用 BitKeeper(BitMover 公司的版本控制软...

Beverly3阅读 1.5k

封面图
git patch常用方法
针对指定的commit range生成patch,默认对每一个commit分别单独生成patch文件。patch文件按照commit的先后顺序从1开始编号。patch文件会生成到当前目录下。

黑暗森林1阅读 13.2k评论 1

class Myself {

1.5k 声望
53 粉丝
宣传栏