在git中,fetch与pull有何不同,merge与rebase有何不同?
我就是不明白。我在网上读了很多书,但有些东西却不在我的脑海里。有人能给我以下的虚拟版本吗在git中,fetch与pull有何不同,merge与rebase有何不同?,git,Git,我就是不明白。我在网上读了很多书,但有些东西却不在我的脑海里。有人能给我以下的虚拟版本吗 git获取vs拉取 git合并vs重新基础 取与拉 Git fetch只是更新您的repo数据,但是Git pull基本上会执行一次fetch,然后合并所拉的分支 合并与重新基础 来自Atlassian SourceTree博客: 合并将两条开发线结合在一起,同时保留 每一个历史的祖先 相反,重定基址通过重写统一了开发线 来自源分支的更改,以便它们显示为源分支的子级 目标分支–有效地假装那些提交是 一
- git获取vs拉取
- git合并vs重新基础
合并与重新基础 来自Atlassian SourceTree博客: 合并将两条开发线结合在一起,同时保留 每一个历史的祖先 相反,重定基址通过重写统一了开发线 来自源分支的更改,以便它们显示为源分支的子级 目标分支–有效地假装那些提交是 一直写在目标分支的顶部 另外,请查看,这是一个很好的游戏,刚刚发布到HackerNews()上,教了很多分支和合并技巧。我相信在这件事上它会很有帮助。fetch vs pull
fetch
将从远程*分支下载任何更改,更新存储库数据,但保持本地*分支不变
pull
将执行fetch
操作,另外merge
将更改合并到本地分支中
有什么区别?pull
使用所拉分支的更改更新本地分支。fetch
不会推进您的本地分支机构
合并与重新基础
鉴于以下历史:
C---D---E local
/
A---B---F---G remote
rebase
将接受本地分支中存在的提交,并在远程分支上重新应用它们。此操作将重新写入本地提交的祖先
重设基址的效果将是:
C---D---E local
/ \
A---B---F---G---H remote
C'--D'--E' local
/
A---B---F---G remote
C'--D'--E'局部
/
A--B--F--G遥控器
有什么区别?Amerge
不会改变提交的祖先。Arebase
重写您的本地用户的祖先
*
此说明假定当前分支是本地分支,并且指定为获取
、拉
、合并
或重基
参数的分支是远程分支。这是通常的情况<例如,code>pull
将从指定分支下载任何更改,更新存储库,并将更改合并到当前分支中。pull vs fetch:
我的理解是,git pull
只是一个git fetch
,然后是git merge
。即,从远程分支获取更改,然后将其合并到当前分支
合并与重设基础: 合并将按照命令所述进行;合并当前分支和指定分支之间的差异(合并到当前分支中)。也就是说,
git合并另一个分支
命令将把另一个分支合并到当前分支中
重基的工作原理有点不同,有点酷。假设您执行命令git-rebase-other\u-branch
。Git将首先在当前分支和另一个分支之间找到最新的通用版本。即分支分叉之前的点。然后git将把这个分歧点移动到另一个分支的头上。最后,当前分支中自原始发散点以来的所有提交都将从新发散点重放。这创建了一个非常干净的历史,分支和合并更少
然而,这并非没有陷阱!由于版本历史记录是“重写”的,因此只有在本地git repo中存在提交时才应该这样做。也就是说:如果已将提交推送到远程回购,则永远不要这样做
在网上的书中给出的关于重定基址的解释很好,插图很容易理解
使用重定基址而不是合并进行拖动 我实际上经常使用rebase,但通常它与pull结合使用:
git pull --rebase
将获取远程更改,然后重新设置基础,而不是合并。即,它将重播您上次执行拉取时的所有本地提交。我发现这比通过合并执行普通的拉操作要干净得多,后者将通过合并创建一个额外的提交。合并-头分支将生成一个新的提交,保留每个提交历史的祖先。如果合并提交是由多个同时在同一分支上工作的人进行的,那么历史可能会被污染 重新基址-将一个分支的更改重新写入另一个分支,而不创建新的提交。代码历史记录是简化的、线性的和可读的,但它不适用于拉请求,因为您看不到有人做了哪些小的更改
在处理基于功能的工作流或我不熟悉rebase时,我会使用
git merge
。但是,如果我想要一个更干净的线性历史,那么git-rebase
更合适。有关更多详细信息,请务必查看。谢谢Felips。。因此,如果我从远程执行提取,我的主分支将不会有更新?另外,听起来我应该更多地使用rebase,而不是mergarebase vs merge,这取决于您的意图,记住rebase重写了所有提交历史。是的,如果您只获取,主分支将不会被更改,您必须合并(或拉)它才能应用远程更改git merge/
。例如,如果您是主分支,并且您的远程设备名为origin,您可以执行git merge origin/master
。因此,听起来我应该始终执行git checkout master git fetch git diff origin/master git rebase origin master。因此,如果我在和分支中工作,并且希望合并它,那么我应该执行git checkout master git fetch git diff origin/master git rebase origin master