git命令的进阶和复习(带动图效果)

1. 学习途径

我的学习途径主要如下几个:css

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

  • git rebase
  • git merge
  • git reset
  • git revert
  • git cherry-pick
  • git fetch
  • git pull
  • git reflog

2. 分支的合并(merge)

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

  • fast-forward
  • no-fast-forward

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

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记录。完整的命令以下fetch

//即在合并分支命令加入 --no-ff 后缀的方式运行
$ git merge --no-ff -m "merge with no-ff" dev
复制代码
  • 如何设置默认为no-fast-forward模式
//第一种方案:全局设置禁用fast-forward
git config --global --add merge.ff false
//第二种方案:某个分支单独禁用fast-forward
git 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讲的相对好一些spa

4.1 软重置

最大的特色:撤回到特定提交以后,已有的修改会保留3d

如下图为例: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 分支名
复制代码
相关文章
相关标签/搜索