zoukankan      html  css  js  c++  java
  • 【Git】616- git命令的进阶和复习(带动图效果)

    作者:老郑的技术杂货铺
    链接:

    https://juejin.im/post/5e9e49356fb9a03c917fe7fd

    1. 学习途径

    个人学习途径主要以下几个:

    • learnGit在线学习

    • 猴子都能懂的git

    • 小姐姐用动画图解Git

    个人比较推荐第二个Git学习网站猴子都能懂的git,图文结合,简单明了,本文将介绍一些常用 Git 指令,作为一个学习总结

    • git rebase

    • git merge

    • git reset

    • git revert

    • git cherry-pick

    • git fetch

    • git pull

    • git reflog


    2. 分支的合并(merge)

    对于merge而言,又有两个合并策略:

    • fast-forward

    • no-fast-forward

    假设bugfix分支是从master分支分叉出来的,以这个图作为初始分支状态

    2.1 fast-forward

    git merge默认采用fast-forward的方式,执行git merge等同于执行git merge --ff,–ff是fast-forward的简写。特点:

    • 快进操作:只更新指针的指向,不会创造一个新的commit节点。

    • 缺点:一旦删除分支或者分支指针往前走,会丢掉分支信息(原来这个分支的做了什么在log中体现不出来)

    • 触发时机:合并 bugfix分支到master分支时,如果master分支的状态没有被更改过,这样的合并被称为fast-forward(快进)合并


    2.2 no-fast-forward

    --no-ff 指的是强行关闭fast-forward方式,使得每一次的合并都创建一个新的commit记录。完整的命令如下

    //即在合并分支命令加入 --no-ff 后缀的方式运行
    $ git merge --no-ff -m "merge with no-ff" dev
    
    • 如何设置默认为no-fast-forward模式

    
    //第一种方案:全局设置禁用fast-forwardgit config --global --add merge.ff false//第二种方案:某个分支单独禁用fast-forwardgit config branch.【分支名】.mergeoptions  "--no-ff"
    
    • 触发时机:
      比如master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。

      此时如果把bugFix合并到master,合并两个修改会生成一个提交。这时,master分支的HEAD会移动到该提交上。


    3. 变基(rebase)

    reabse和merge其实都可以看作为合并操作,rebase 的优势就是可以创造更线性的提交历史,还是以这张图为列

    执行以下命令:

    //rebase bugfix分支到master分支
    ➜  ~ git:(master) ✗ git rebase bugfix
    

    现在 bugFix 分支上的工作在 master 的最顶端,同时我们也得到了一个更线性的提交序列。rebase之后,唯一的问题就是 master的HEAD位置还没有更新。所以需要【将master的HEAD移动到bugfix的HEAD

    ~ git:(bugFix) ✗ git checkout master
    ~ git:(master) ✗ git merge bugFix 或者git rebase  bugFix
    

    由于篇幅原因,有兴趣的可以在了解下交互式变基,交互式变基修改commit,如commit的合并、顺序调整、commit的提交日志修改。


    4. 重置(reset)

    撤销变更方式有两种。其中一种就是git reset(控制当前分支回撤到某次提交时的状态。),这个部分这篇文章小姐姐用动画图解Git讲的相对好一些


    4.1 软重置

    最大的特点:撤回到特定提交之后,已有的修改会保留

    以下图为例:9e78i 提交添加了 style.css 文件,035cc 提交添加了 index.js 文件。使用软重置,我们可以撤销提交记录,但是保留新建的 style.css 和 index.js 文件。

    4.2 硬重置

    最大的特点:无需保留提交已有的修改,直接将当前分支的状态恢复到某个特定提交下,,硬重置还会将当前工作目录(working directory)中的文件、已暂存文件(staged files)全部移除


    使用 git status 查看,发现当前操作空间空空如也。Git 丢弃了 9e78i 和 035cc 两次提交引入的修改,将仓库重置到 ec5be 时的状态

    5. 还原(revert)

    虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”的方法对大家一起使用的远程分支是无效的,所以要使用revert

    • 最大的特点:用于还原某次提交的修改时,会创建一个包含已还原更改的 新提交记录

    • 比如:我们在 ec5be 上添加了 index.js 文件。之后发现并不需要这个文件,可以执行git revert ec5be 指令还原之前的更改


      新的提交记录 9e78i 还原了 ec5be 引入的更改。git revert 可以在不修改分支历史的前提下,还原某次提交引入的更改

    6. 检出提交(cherry-pick)

    如果某个分支上的某次提交的修改正是当前分支需要的,那我们可以使用 git cherry-pick 命令检出某次的提交更改,作为新的提交添加到当前分支上面

    //命令形式为:
    git cherry-pick <提交号>...
    

    比如:dev 分支上的 76d12 提交添加了 index.js 文件,我们需要将本次提交更改加入到 master 分支,那么就可以使用 git cherry-pick 76d12 单独检出这条记录修改。

    7 git fetch

    比如:你和你的同事在master分支上工作,如果你的同事将他做的更改提交到了远程分支上(orgin/master),而这些提交是你本地没有的,此时,就要使用 git fetch指令将远程分支上的最新的修改下载下来

    git fetch 指令并没有影响本地分支,即head指针位置未改变

    8. 拉取(pull)

    git pull 指令实际做了两件事:git fetchgit merge这里,相当于在get fetch基础上,移动了Head指针。这里就不具体阐述了


    9. Reflog

    git reflog 是一个非常有用的命令,用于显示所有已执行操作的日志!包括合并、重置、还原:基本上记录了对分支的任何更

    • 使用场景:假设你不小心使用 git reset 命令硬重置仓库到某个提交。后面突然想到,重置导致了一些已有的正常代码的误删


    • demo我们不想合并 origin/master 分支了。执行 git reflog 命令,我们看到合并之前的仓库状态位于 HEAD@{1} 这个地方,我们使用 git reset 指令将 HEAD 头指向 HEAD@{1}


    10. 补充

    10.1 commit --amend

    可以更新先前的commit的提交信息,并且本地仓库中并不会产生一个新的commit


    10.2 squash merge

    可能你遇到过想要合并多个 commit 为一个,这时候就可以用squash merge把某个分支上的所有提交都合并成一个提交

    git merge --squash 分支名
    

    1. JavaScript 重温系列(22篇全)

    2. ECMAScript 重温系列(10篇全)

    3. JavaScript设计模式 重温系列(9篇全)

    4. 正则 / 框架 / 算法等 重温系列(16篇全)

    5. Webpack4 入门(上)|| Webpack4 入门(下)

    6. MobX 入门(上) ||  MobX 入门(下)

    7. 59篇原创系列汇总

    回复“加群”与大佬们一起交流学习~

    点击“阅读原文”查看70+篇原创文章

    点这,与大家一起分享本文吧~

  • 相关阅读:
    开博语
    ch8 固定宽度、流式、弹性布局
    ch8 让div居中--使用外边距
    ch8 基于浮动的布局(两列浮动布局、三列浮动布局)
    ch3 盒模型、定位
    事件类型--鼠标与滚轮事件
    事件类型-UI事件、焦点事件
    事件对象
    事件处理程序
    内存和性能--事件委托、移除事件处理程序
  • 原文地址:https://www.cnblogs.com/pingan8787/p/13069331.html
Copyright © 2011-2022 走看看