在 git 中,提取和拉取有什么不同,合并和重建有什么不同?

我就是不明白。我在网上和书上读了很多东西,有些东西就是没有停留在我的脑海里。有没有人能告诉我下面这个假的版本:

  • 快去拿,快去拉
  • Git 合并与 rebase
105392 次浏览

接球对拉球

Git 提取只是更新你的回购数据,但是一个 Git 提取基本上会执行一个提取,然后合并提取的分支

什么是区别之间的 git 拉和 git 获取 & # 39; ?


合并与重建

来自 Atlassian SourceTree Blog,合并或重建基础:

合并将两条开发线结合在一起,同时保留 每个犯罪历史的祖先。

相比之下,rebase 通过重写来统一开发线路 从源分支更改,以便它们显示为 目标分支——有效地假装那些提交是 一直写在目标分支的顶部。

另外,看看 学习 Git 分支,这是一个不错的游戏,刚刚被发布到 HackerNews (链接到文章) ,教授了很多分支和合并技巧。我相信在这件事上会有很大的帮助。

接球对拉球

fetch将从远程 * 分支下载任何更改,更新存储库数据,但保持本地 * 分支不变。

pull将执行一个 fetch和另外的 merge的变化到您的本地分支。

有什么区别吗?pull使用从提取的分支发生的更改来更新您的本地分支。fetch不会推进您的本地分支。

合并与变基

鉴于以下历史:

C---D---E local
/
A---B---F---G remote

merge将两个开发历史连接在一起。它通过重播本地分支在远程分支上发生分叉后在本地分支上发生的更改,并将结果记录在一个新的提交中来实现这一点。此操作保留每个提交的祖先。

merge的影响将是:

C---D---E local
/         \
A---B---F---G---H remote

rebase将接受本地分支中存在的提交,并在远程分支上重新应用它们。此操作重写本地提交的祖先。

rebase的影响将是:

C'--D'--E' local
/
A---B---F---G remote

有什么区别呢? merge不会改变提交的祖先 重写本地提交的祖先。

这个解释假设当前分支是一个本地分支,指定为 fetchpullmergerebase参数的分支是一个远程分支。这是常见的情况。例如,pull将从 指明分支下载任何更改,将您的存储库和 merge的更改更新到 目前分支。

拉 VS 获取 :

我对此的理解是,git pull仅仅是 git fetch后面跟着 git merge。也就是说,您从一个远程分支获取更改,然后将其合并到当前分支中。


Merge vs rebase :

Merge 将按照命令执行; 将当前分支和指定分支之间的差异合并到当前分支中。也就是说,命令 git merge another_branch将把 another_branch合并到当前分支中。

Rebase 的工作方式有点不同,有点酷。假设您执行命令 git rebase another_branch。Git 将首先在当前分支和 another_branch之间找到最新的公共版本。也就是树枝分叉前的那一点。然后 git 将这个发散点移动到 another_branch的头部。最后,当前分支中自原始发散点以来的所有提交都是来自新发散点的 重播。这创建了一个非常干净的历史,较少的分支和合并。

然而,这并非没有陷阱!由于版本历史是“重写”的,所以只有当提交只存在于本地 git repo 中时才应该这样做。也就是说: 如果您已经将提交推送到远程回购,则 从来没有执行此操作。

这个在线图书中对于重新定位的解释非常好,配有简单易懂的插图。


用重新定基代替合并

实际上我经常使用 rebase,但通常是和 pull 结合使用:

git pull --rebase

将获取远程更改,然后重新基础而不是合并。也就是说,它会重播你上次执行拉取操作时的所有本地提交。我发现这比通过合并执行正常的拉操作要干净得多,后者将通过合并创建额外的提交。

Merge -HEAD 分支将生成一个新的提交,保留每个提交历史的祖先。如果并行工作在同一个分支上的多个人进行合并提交,历史记录可能会受到污染。

Rebase -在不创建新提交的情况下将一个分支的更改重写到另一个分支。代码历史记录是简化的、线性的和可读的,但是它不适用于请求,因为您无法看到某人做了哪些微小的更改。

在处理基于特性的工作流或者不熟悉 rebase 时,我会使用 git merge。但是,如果我想要一个更干净,线性的历史然后 git rebase是更合适的。要了解更多细节,请一定查看 此合并或重新基准项目