【Todo】git的fast forward & git命令学习 & no-ff
git的fast-forward在之前的文章有介绍过,但是介绍的不细:
http://www.cnblogs.com/charlesblc/p/5953066.html

- fast-forward方式就是当条件允许的时候,git直接把HEAD指针指向合并分支的头,完成合并。属于“快进方式”,不过这种情况如果删除分支,则会丢失分支信息。
因为在这个过程中没有创建commit- squash 是用来把一些不必要commit进行压缩,比如说,你的feature在开发的时候写的commit很乱,那么我们合并的时候不希望把这些历史commit带过来,
于是使用--squash进行合并,此时文件已经同合并后一样了,但不移动HEAD,不提交。需要进行一次额外的commit来“总结”一下,然后完成最终的合并。- --no-ff指的是强行关闭fast-forward方式。

有这篇文章详细复习一下 (Link)
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
实战一下--no-ff
方式的git merge
:
首先,仍然创建并切换dev
分支:
- $ git checkout -b dev
- Switched to a new branch 'dev'
修改readme.txt文件,并提交一个新的commit:
- $ git add readme.txt
- $ git commit -m "add merge"
- [dev 6224937] add merge
- 1 file changed, 1 insertion(+)
现在,我们切换回master
:
- $ git checkout master
- Switched to branch 'master'
准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:
- $ git merge --no-ff -m "merge with no-ff" dev
- Merge made by the 'recursive' strategy.
- readme.txt | 1 +
- 1 file changed, 1 insertion(+)
因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。
合并后,我们用git log
看看分支历史:
- $ git log --graph --pretty=oneline --abbrev-commit
- * 7825a50 merge with no-ff
- |\
- | * 6224937 add merge
- |/
- * 59bc1cb conflict fixed
- ...
可以看到,不使用Fast forward
模式,merge后就像这样:
关于默认的fast-forward的,上面引文没有详述。基本就是看不出有从其他分支合并过来的信息,只能看到每个commit实际的信息。如果其他分支丢失了,分支合并的信息就丢失了。
我自己试了一下 默认的有fast-forward的情况。如下:
- $ git checkout -b testff
- Switched to a new branch 'testff'
- $ vi readme
- $ git add readme
- $ git commit readme
- test ff
- # Please enter the commit message for your changes. Lines starting
- # with '#' will be ignored, and an empty message aborts the commit.
- # Explicit paths specified without -i or -o; assuming --only paths...
- # On branch testff
- # Changes to be committed:
- # new file: readme
- #
...- ".git/COMMIT_EDITMSG" [converted] 8L, 282C written
- [testff 5a036ee] test ff
- 1 file changed, 1 insertion(+)
- create mode 100644 readme
- $ git checkout -b newtestff
- Switched to a new branch 'newtestff'
- $ git merge testff
- Already up-to-date.
- $ git diff testff newtestff
- $ git checkout master
- Switched to branch 'master'
- Your branch is up-to-date with 'origin/master'.
- $ git pull
- $ git checkout -b newff
- Switched to a new branch 'newff'
- $ git checkout newff
- Already on 'newff'
- $ git merge testff
- Updating 30a974d..5a036ee
- Fast-forward
- readme | 1 +
- 1 file changed, 1 insertion(+)
- create mode 100644 readme
- $ git log --graph --pretty=oneline --abbrev-commit
- * 5a036ee test ff
- * 30a974d Merge branch 'xxx' into master
- |\
- ...
重点看两点:
1. 第一处飘黄的地方,是在test-ff版本 checkout -b的,结果发现git 两个branch完全没有差别。
git checkout -b dev命令相当于
创建分支: git branch dev 切换分支: git checkout dev
而这个创建是基于当前HEAD的。
所以新创建的分支和test-ff没有区别。
2. 采用默认的merge之后,使用git log --graph --pretty=oneline --abbrev-commit 能够看到:
- * 5a036ee test ff
完全没有原来 test-ff 分支的信息。
另,git log命令加上后面的参数很好用,--graph --pretty=oneline --abbrev-commit
比原始的输出好看多了。
分支策略
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
小结
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
一些git命令:
- git checkout -b dev//基于本地创建分支
- git checkout -b dev origin/dev //基于远程分支创建本地分支
- 可以看到git checkout -b命令相当于
- 创建分支: git branch dev切换分支: git checkout dev
- 是基于当前HEAD的
- 删除本地分支
- git branch -D dev
- 删除远程分支
- git push origin :branch-name
- 冒号后面没有空格
下面再对这些内容做一下复习:
http://www.ruanyifeng.com/blog/2015/12/git-workflow.html
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html
http://www.ruanyifeng.com/blog/2014/06/git_remote.html
【Todo】git的fast forward & git命令学习 & no-ff的更多相关文章
- Git 关于Fast Forward提交的简单说明
多人协同开发,使用Git经常会看到警告信息包含术语:fast forward, 这是何义? 简单来说就是提交到远程中心仓库的代码必须是按照时间顺序的. 比如A从中心仓库拿到代码后,对文件f进行了修改. ...
- Git的fast forward和no fast forward和 three way merge 以及squash(聚合)
github上上传了版本库https://github.com/ChuckGitMerge 包括merge和rebase 没时间画图,貌似也不太会用画图工具,先写了一个文字版本的 更新:2015年 ...
- git教程5-查看关系图与no fast forward融合
1.每一个提交相当于一个版本,版本都有版本号与之对应.通常通过git commit -m "name"为每次提交命名. 2.融合:即将次分支的最后一个版本添加到主分支上.当融合冲突 ...
- How to get started with GIT and work with GIT Remote Repo
https://www.ntu.edu.sg/home/ehchua/programming/howto/Git_HowTo.html#zz-7. 1. Introduction GIT is a ...
- mzy git学习,禁用Fast forward的普通合并(六)
git merge --no-ff -m "msg" x-branch:禁用Fast forward的普通合并 通常,合并分支时,如果可能,Git会用Fast forward模式, ...
- Git 与 SVN 命令学习笔记
一:Git git config --global user.name "you name" #设置用户名git config --global user.email &quo ...
- Git版本控制软件结合GitHub从入门到精通常用命令学习手册(转)
简要参考:http://www.tuicool.com/articles/mEvaq2 http://gitref.org/zh/index.html GIT 学习手册简介 本站为 Git 学习参考手 ...
- Git – Fast Forward 和 no fast foward
Git 很是强大,在体验过rebase的华丽之后,再次发现之前在TFS上遇到的问题一下都有解了.但也印证了Git深入并非易事.这篇就谈下一个容易迷糊的概念:Fast forward. Fast-For ...
- GIT 版本控制命令学习
一 基本命令 1.$ git init 要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行: 2.$ git status 检查当前文件状态 3.git add命令 功能1:可以 ...
随机推荐
- 什么是php?php的优缺点有哪些?与其它编程语言的优缺点?
身为一个PHP开发者,有必要了解一下PHP的缺点,知道每种语言的优点和缺点,才能知道某种语言在什么场景下适合使用,在什么场景下不适合使用. 这个问题我曾经面试的时候遇到过,我之前没总结过,第一问大部分 ...
- Python把类当做字典来访问
定义一个类将它实例化,我们可以通过obj.属性来访问类的属性,如果想获取类的所有实例变量,我们可以使用obj.__dict__来访问,如下: class A: def __init__(self): ...
- java之 List、Set、ArraylIst、 LinkList
LIst与set概述 List Set 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList优于 ...
- Spring,Mybatis,Springmvc框架整合项目(第三部分)
一.静态资源不拦截 第二部分最后显示的几个页面其实都加载了css和js等文件,要不然不会显示的那么好看(假装好看吧),前面已经说了,我们在web.xml中配置了url的拦截形式是/,那么Dispatc ...
- Hive 执行查询语句报错,由于内存空间不足导致
org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.hdfs.server.namenode.SafeModeException): Can ...
- mongodb权限机制以及扩展
mongodb权限机制 启动权限机制之前要先在MONGODB中添加管理员账号: 1. 创建账号 重装安装一个mongodb,安装时添加一个 --auth参数: 先把安装好的从服务中删除掉(删除之后数据 ...
- xtu数据结构 H. City Horizon
H. City Horizon Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java cl ...
- 总结搭建Oracle11g DG踩的坑
此次的操作环境是Oracle11g 单实例,os为Linux,采用duplicate在线创建物理备库 primary上设置相关参数 ALTER SYSTEM SET LOG_ARCHIVE_CONFI ...
- 有关git的配置
git版本控制器总结 关于部分内容请参考:https://www.cnblogs.com/smuxiaolei/p/7484678.htmlgit是一个版本控制器,分布式管理:可以记录每次文件的改动, ...
- [luoguP3608] [USACO17JAN]Balanced Photo平衡的照片(树状数组 + 离散化)
传送门 树状数组裸题 #include <cstdio> #include <cstring> #include <iostream> #include <a ...