最近闲来无聊,虽然会使用git操作,但是 git fetch
和 git pull
的区别,git merge
和 git rebase
的区别只是一知半解,稍微研究一下;
git fetch
和 git pull
的区别
git fetch
git fetch
是将远程仓库中的改动拉到本地,但是不会主动和本地项目中的代码进行合并,需要你主动操作git merge
,然后才能进行合并。
git pull
git pull
其实就等于 git fetch + git merge
,它会拉取指定的分支,然后主动和本地当前的分支代码进行合并,如果产生冲突会需要你进行解决。
git merge
和 git rebase
的区别
git merge
git merge
是将远端代码合并到本地,同时会产生一条 merge branch xxx into xxxx 的记录
,同时会保留所有的提交细节。
git rebase
git rebase
则是变基,这里我采用git
官方介绍的一个实例来解释;
如下图,当我们新开发的分支 experiment
已经和master
有了分叉后,我又不想使用merge
的方式,那么就可以采用rebase的方式来处理。
我们使用rebase方式可以将我们的c4提交提取出来,在c3的基础上应用一次。这种方式就叫变基。同样你也可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上。
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
它的原理是首先找到这两个分支(即当前分支 experiment、变基操作的目标基底分支 master) 的最近共同祖先 C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件, 然后将当前分支指向目标基底 C3, 最后以此将之前另存为临时文件的修改依序应用。
其实就是将提交变得更加线性,不会有分叉出现。类似于比较提交的c3和c4后直接将c4提交挂在了c3后同时并没有生成merge
操作的那条记录。
建议慎重使用
rebase
操作,如果其他人和你同时开发一条分支,强烈建议不要使用rebase
操作
附
最近看到克隆代码的时候有这样的一个操作
git clone --depth=1 -branch master http://xxxxxxxx
--depth=1
指的是克隆的深度。不会下载 Git 协作的历史记录,这样可以大大加快克隆的速度
depth
用于指定克隆深度,为1即表示只克隆最近一次commit
适合用git clone --depth=1
的场景:你只是想clone最新版本来使用或学习,而不是参与整个项目的开发工作
如果在历史协作版本中,如果有个人提交了1G的文件,然后又删掉了,那么你完整克隆的时候,这1G的文件也会被下载下来放在git的版本控制中。
假如后面我又想拉取全部的记录和分支怎么办呢?
修改.git/config文件中的
fetch = +refs/heads/master:refs/remotes/origin/master
为
fetch = +refs/heads/*:refs/remotes/origin/*
然后执行git fetch --all