我只是无法理解这一点.我一直在网上和书上阅读很多东西,但有些事情并没有留在我脑海里.有人可以给我以下虚拟版本:
pes*_*lla 399
fetch 将从远程*分支下载任何更改,更新您的存储库数据,但保持本地*分支不变.
pull将执行一个fetch和另外merge的更改到您当地的分支机构.
有什么不同? pull通过拉动分支的更改来更新本地分支.A fetch不会推进您当地的分支机构.
鉴于以下历史:
C---D---E local
/
A---B---F---G remote
merge将两个发展历史结合在一起.它通过重放在远程分支上分散后在本地分支上发生的更改来执行此操作,并将结果记录在新提交中.此操作保留每个提交的祖先.
a的效果merge将是:
C---D---E local
/ \
A---B---F---G---H remote
rebase将接受当地分支中存在的提交,并在远程分支的顶部重新应用它们.此操作会重写您本地提交的祖先.
a的效果rebase将是:
C'--D'--E' local
/
A---B---F---G remote
有什么不同?A merge不会改变提交的祖先.A rebase
重写您本地提交的祖先.
*本说明假定当前分支是一个本地分支,并且指定作为参数的分支fetch,pull,merge,或rebase是一个远程分支.这是通常的情况.pull例如,将从指定分支下载任何更改,将存储库和merge更改更新到当前分支.
Fel*_*ino 26
获取与拉动
Git fetch只是更新你的repo数据,但git pull基本上会执行一次fetch,然后合并pull分支
合并vs Rebase
来自Atlassian SourceTree博客,Merge或Rebase:
合并将两条开发线结合在一起,同时保留每个提交历史的祖先.
相反,rebasing通过重写源分支的更改来统一开发线,以便它们作为目标分支的子级出现 - 有效地假装这些提交一直写在目标分支之上.
另外,看看Learn Git Branching,这是一款很棒的游戏,刚刚发布到HackerNews(链接到帖子),并教授了大量的分支和合并技巧.我相信在这件事上会非常有帮助.
拉取vs取:
我理解这一点的方式是,这git pull只是一个git fetch跟随git merge.即从远程分支获取更改,然后将其合并到当前分支.
merge vs rebase:
合并将按命令说明; 合并当前分支和指定分支之间的差异(进入当前分支).即命令git merge another_branch将合并another_branch到当前分支.
一个rebase的工作方式有点不同,而且很酷.假设你执行命令git rebase another_branch.Git将首先找到当前分支与之间最新的通用版本another_branch.也就是分支分歧之前的那一点.然后git会将这个不同点移动到头部another_branch.最后,从原始发散点开始,当前分支中的所有提交都从新的发散点重放.这创建了一个非常干净的历史记录,分支和合并更少.
然而,它并非没有陷阱!由于版本历史记录是"重写的",因此只有在提交仅存在于本地git仓库中时才应执行此操作.那就是:永远不要做,如果你有推提交到远程回购.
本在线书中对变基的解释非常好,有易于理解的插图.
拉动而不是合并
我实际上经常使用rebase,但通常它与pull结合使用:
git pull --rebase
Run Code Online (Sandbox Code Playgroud)
将获取远程更改然后rebase而不是merge.也就是说,它会在您上次执行拉动时重放所有本地提交.我发现这比使用合并进行正常拉动要清晰得多,这将通过合并创建额外的提交.