首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“git rebase”和“git拉”是如何协同工作的?

“git rebase”和“git拉”是如何协同工作的?
EN

Stack Overflow用户
提问于 2018-01-21 05:22:29
回答 2查看 88关注 0票数 2

我知道“git”放弃了一些提交。因此,如果开发人员这样做,并将更改推送到远程回购,那么这是否意味着这些提交也将从远程回购中删除。

当另一个开发人员进行“git拉”时,这些提交是否也会从他/她的本地回购中删除?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-21 05:33:28

Rebase不会放弃某些提交,除非您执行交互式重基并显式删除某些提交。相反,使用重基策略执行git pull则相反;它保留本地分支中的所有提交,同时使用来自远程分支的更改进行更新。

一幅画在这里胜过千言万语。下面是一个图表,显示了一个本地分支会是什么样子,在一个git拉动之前和之后,通过重新基地。

代码语言:javascript
复制
remote: ... A -- B -- C
             \
local:        D -- E

遗憾的是,最近的祖先是A,因此您的本地分支和远程分支已经分别提交了2次。如果要运行git status,则Git会告诉您,您的分支落后于2提交,比远程提交早2提交。现在通过重基拉出:

代码语言:javascript
复制
git pull --rebase origin your_branch

拉完后,图表如下:

代码语言:javascript
复制
remote: ... A -- B -- C
                       \
local:                  D' -- E'

请注意,您的本地分支上的前两个提交仍然是按该顺序排列的DE。但是现在您的工作位于分支的远程版本之上。这就是为什么这个命令被称为“because”,因为它在拉动时给分支一个新的基础。

做拉通过重新基地站在并置做一个正常的git pull通过合并。如果将远程分支合并到本地分支中,您将得到以下结果:

代码语言:javascript
复制
remote: ... A -- B -- C
             \         \
local:        D -- E -- M

现在,远程提交BC并不直接出现在本地分支的历史记录中。相反,您将得到一个合并提交(上图中的M)。换句话说,通过合并拉出倾向于巩固提交,而重基则倾向于预测历史。

票数 2
EN

Stack Overflow用户

发布于 2018-01-21 05:49:16

长话短说,git rebase (由其他人)和git pull (由您)可能不是您想要做的事情,通常考虑不要在共享分支上重新建立基础,除非您确定自己在做什么。

假设您正在处理的分支不是主程序(永远不要重新基于主模块),它仍然是一个共享的分支。通常,重基重写提交的历史/SHA,如果有人重写历史记录,则需要 force push,而强制推到私有分支(例如您自己的分支)是常见的,而公共分支则不是这样。

如果您想坚持在共享分支上使用重基策略,常见的策略是使用git pull --rebasegit rebase origin/<local_branch> # instead of origin/master,这样的话,重基不再重写历史,因此使用起来很安全,尽管它感觉有点偏离了设计的目的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48363938

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档