git pull VS git fetch git rebase
另一个问题是,git pull就像git fetch和git merge一样。
但是,git pull和git fetch和git rebase有什么区别?
- 有人应该清理链接…我很惊讶另一个问题得到了多少选票。
- @色诺:我想这只是"我也有这个问题"的人数的一个数字。
- 总有一天我会有时间真正阅读git文档,但在那之前,我会在这些类型的问题上添加我的投票。
从你的问题中应该可以很明显地看出,你实际上只是在问git merge和git rebase之间的区别。
所以让我们假设你是在一个普通的情况下——你已经在你的主分支上做了一些工作,并且你从Origin那里得到了一些工作,Origin也做了一些工作。取货之后,情况如下:
1 2 3
| - o - o - o - H - A - B - C (master)
\
P - Q - R (origin/master) |
如果此时合并(git pull的默认行为),假设没有任何冲突,则最终会出现以下情况:
1 2 3
| - o - o - o - H - A - B - C - X (master)
\ /
P - Q - R --- (origin/master) |
号
另一方面,如果你做了适当的调整,你会得到这样的结果:
1 2 3
| - o - o - o - H - P - Q - R - A' - B' - C' (master)
|
(origin/master) |
在这两种情况下,工作树的内容应该是相同的;您刚刚创建了一个不同的历史记录。REBASE重写了您的历史,使您看起来像是在Origin的新主分支(R)之上进行的,而不是您最初进行的(H)。如果其他人已经从您的主分支中退出,则不应使用REBASE方法。
最后,请注意,通过将配置参数branch..rebase设置为true,您实际上可以为给定分支设置git pull,以使用rebase而不是merge。您也可以使用git pull --rebase进行单次拉动。
- 如果有人已经从你的主分支中退出了,你会怎么做?这会破坏回购协议吗?
- 你怎么知道是否有人从你的总分行拉了车?
- 如果你不确定某人没有,你应该假设他们有。
- 我只是在想,除非你也在推动源站/主站以外的其他地方的变化,否则我看不到有任何其他人将这些变化拉入问题,因为如果你已经将这些变化推到源站/主站,那么首先就没有什么可以重新平衡的了。在我看来,警告只在你得到比x->origin/x更复杂的东西的情况下才重要,但我可能是错的。如果有人知道我忽略的一个场景,请分享。
- @永远不要忘记基本场景是:我将A推到原点/主节点。是别人拉的。我重新平衡,把A改为(或更复杂的东西),然后强制推它。现在,当另一个人拉动时,他们将尝试合并a和a'(或与pull一起--在a的顶部重新放置a)。这两种方法都是针对从头痛到灾难的某种程度的东西的处方,这取决于另一个人的能力。
- @实际上,Neverfox,pull-rebase试图变得更聪明,但我不确定它是否普遍成功。
- 这听起来可能很挑剔,但这只是为了帮助我理解:在您的图表中,如果从左到右的线与相对时间相对应,那么最终结果不是- o - o - o - o - P - A - Q - B - R - C,(即保留了提交的时间顺序)吗?
- @史蒂夫钱伯斯不,那不是结果。这些线条仅仅代表了承诺的祖先,即A是B的父代,对于Q或B是第一次出现没有任何暗示。所有这些操作都基于提交图,而不是时间。REBASE只是移植一些提交,结果正如我所展示的,不管提交时间戳是什么。
- @这里讨论的钢筋是从主到源/主的。Git查看master,从commit c开始,一直工作到与origin/master有共同祖先,找到a和p的共同父代,所以它知道它需要从a开始移动所有东西,所以它将A - B - C移动到origin/master(commit r),然后这样做,最终得到P - Q - R - A - B - C。
- 如果您希望对签出的每个分支的默认行为进行重新平衡,而不是合并,则可以通过执行git config --global branch.autosetuprebase always全局配置此行为。
- 如果您使用REBASE,您应该更好地测试您的工作。如果您的更改与自版本(h)以来完成的提交不兼容,那么使用REBASE,没有人会知道您提交损坏代码的原因,因为它看起来像是您在最新版本(c)上进行了更改。合并更好地反映了现实,也就是说,它将捕获您在(h)版本而不是(c)版本上工作的事实。
- @didibus:来自rypress.com/tutorials/git/centralized-workflows.html:考虑一下如果Mary在推送到中央存储库之后重新调整了平衡,会发生什么。她将重新编写承诺,其他开发人员可能已经加入到他们的项目中。
- 在git pull中是否有代码丢失或文件丢失的可能?
- "如果其他人已经从您的主分支中提取了,您不应该使用REBASE方法。"我发现这句话非常令人困惑,因为我希望主分支通常应该是本地分支,而不应该由其他人提取?如果分支不在远程(远程/主服务器)上,并且可能被某人拉着,是否存在任何合理的场景?
TLDR:
git pull就像运行get fetch,然后是git merge。git pull --rebase与git fetch相似,然后是git rebase。
作为对你第一次陈述的答复,
git pull就像git fetch和git merge一样。
"In its default mode, git pull is shorthand for git fetch followed by
git merge FETCH_HEAD" More precisely, git pull runs git fetch with the
given parameters and then calls git merge to merge the retrieved branch
heads into the current branch"
号
(参考:https://git-scm.com/docs/git-pull)
对于第二个陈述/问题:
"但是,git pull与git fetch与git rebase的区别是什么?"
同样,来自同一个来源:埃多克斯1〔6〕
"With --rebase, it runs git rebase instead of git merge."
号现在,如果你想问
'merge和rebase之间的差异'
这里也有答案:https://git-scm.com/book/en/v2/git-branching-rebasing(更改版本历史记录的方式与不更改版本历史记录的方式之间的区别)