个人学习途径主要以下几个:
个人比较推荐第二个Git学习网站猴子都能懂的git,图文结合,简单明了,本文将介绍一些常用 Git 指令,作为一个学习总结
git rebase
git merge
git reset
git revert
git cherry-pick
git fetch
git pull
git reflog
对于merge而言,又有两个合并策略:
fast-forward
no-fast-forward
假设bugfix分支是从master分支分叉出来的,以这个图作为初始分支状态
git merge默认采用fast-forward的方式,执行git merge等同于执行git merge --ff
,–ff是fast-forward的简写。特点:
--no-ff 指的是强行关闭fast-forward方式,使得每一次的合并都创建一个新的commit记录。完整的命令如下
//即在合并分支命令加入 --no-ff 后缀的方式运行 $ git merge --no-ff -m "merge with no-ff" dev 复制代码
//第一种方案:全局设置禁用fast-forward git config --global --add merge.ff false //第二种方案:某个分支单独禁用fast-forward git config branch.【分支名】.mergeoptions "--no-ff" 复制代码
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的提交日志修改。
撤销变更方式有两种。其中一种就是git reset(控制当前分支回撤到某次提交时的状态。),这个部分这篇文章小姐姐用动画图解Git讲的相对好一些
最大的特点:撤回到特定提交之后,已有的修改会保留
以下图为例:9e78i 提交添加了 style.css 文件,035cc 提交添加了 index.js 文件。使用软重置,我们可以撤销提交记录,但是保留新建的 style.css 和 index.js 文件。
最大的特点:无需保留提交已有的修改,直接将当前分支的状态恢复到某个特定提交下,,硬重置还会将当前工作目录(working directory)中的文件、已暂存文件(staged files)全部移除
使用 git status 查看,发现当前操作空间空空如也。Git 丢弃了 9e78i 和 035cc 两次提交引入的修改,将仓库重置到 ec5be 时的状态虽然在你的本地分支中使用 git reset 很方便,但是这种“改写历史”
的方法对大家一起使用的远程分支是无效的,所以要使用revert
git revert ec5be
指令还原之前的更改
新的提交记录 9e78i 还原了 ec5be 引入的更改。git revert 可以在不修改分支历史的前提下,还原某次提交引入的更改如果某个分支上的某次提交的修改正是当前分支需要的,那我们可以使用 git cherry-pick
命令检出某次的提交更改,作为新的提交添加到当前分支上面
//命令形式为: git cherry-pick <提交号>... 复制代码
比如:dev 分支上的 76d12 提交添加了 index.js 文件,我们需要将本次提交更改加入到 master 分支,那么就可以使用 git cherry-pick 76d12
单独检出这条记录修改。
比如:你和你的同事在master分支上工作,如果你的同事将他做的更改提交到了远程分支上(orgin/master
),而这些提交是你本地没有的,此时,就要使用 git fetch
指令将远程分支上的最新的修改下载下来
git pull
指令实际做了两件事:git fetch
和 git merge
这里,相当于在get fetch基础上,移动了Head指针
。这里就不具体阐述了
git reflog 是一个非常有用的命令,用于显示所有已执行操作的日志!包括合并、重置、还原:基本上记录了对分支的任何更
可以更新先前的commit的提交信息,并且本地仓库中并不会产生一个新的commit
可能你遇到过想要合并多个 commit 为一个,这时候就可以用squash merge
把某个分支上的所有提交都合并成一个提交
git merge --squash 分支名 复制代码