Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在git中,fetch与pull有何不同,merge与rebase有何不同?_Git - Fatal编程技术网

在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重新基础
取与拉

Git fetch只是更新您的repo数据,但是Git pull基本上会执行一次fetch,然后合并所拉的分支


合并与重新基础

来自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遥控器 有什么区别?A
merge
不会改变提交的祖先。A
rebase
重写您的本地用户的祖先

*
此说明假定当前分支是本地分支,并且指定为
获取
合并
重基
参数的分支是远程分支。这是通常的情况<例如,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