git rebase 不使用分支

Posted

技术标签:

【中文标题】git rebase 不使用分支【英文标题】:git rebase without using a branch 【发布时间】:2017-02-12 02:36:17 【问题描述】:

假设我没有使用分支(我在本地主分支上工作,原点是远程服务器上的主分支)。想知道命令的作用是什么?我的困惑是有时我看到人们使用此命令成功合并本地更改(与主远程服务器分支上的更改)而不使用分支,但我可能是错的,但我认为 rebase 仅在您处理分支(主)和与其他分支合并?

git rebase -i origin/master 

【问题讨论】:

您的问题始于一个不正确的断言:使用 Git,您几乎总是使用分支。在这种情况下,您使用的是分支mastermaster 几乎没有什么特别之处:它只是另一个分支。 master 似乎特别的主要原因是它是 Git 在您创建新的空存储库时首先创建的分支。这意味着几乎每个存储库都有一个master(因为没有有一个,你必须做额外的工作。 git rebase 命令首先获取。 git pull 便利命令做了两件事:首先,它运行 git fetch。然后,一旦获取成功完成,git pull 就会运行git mergegit rebase。这里的问题是您必须提前选择要运行的(合并或变基),并且直到您获取后才能确定哪个操作是最好的。对于大多数人来说,大多数时候,rebase 更好;但git pull 默认做git merge。因此,我建议完全避免使用git pull:坚持使用git fetch。但是,(续) ...如果您发现使用git pull 比运行两个命令更方便,请记住git pull --rebase 的意思是“先获取,然后再变基”。您还可以设置您的配置,以便 git pull 默认执行 git rebase(但我仍然更喜欢自己单独执行 fetch-then-rebase)。 是的,我通常在 fetch 引入新的提交后 rebase。 如果您想比较合并与变基,请参阅许多现有 SO 问题中的任何一个(例如,***.com/q/804115/1256452 和 ***.com/q/16666089/1256452)。 【参考方案1】:

origin/mastermaster 一样是一个分支。它基本上是跟踪远程主机上的任何内容。

当你从master 运行git fetch 时,它会从你的远程主机获取所有提交并将其放到origin/master 上。如果您随后运行 git rebase -i origin/master,则会发生这种情况:

您所有不在 origin/master 上的提交都被暂时搁置 您的主服务器已更新为 origin/master 上的任何内容 您的提交将在更新后的master 之上重播

所以,如果你先手动fetch 然后rebase,那基本上就是手动做git pull --rebase 会做的事情。

顺便说一句,您还可以重新定位到您自己的分支,例如:git rebase HEAD~2。这将允许您重新排序(或以其他方式编辑)当前分支上的提交。

【讨论】:

感谢 rethab 的出色解释,并投票。对于您的 cmets,“您的提交在更新后的 master 之上重播”,您的意思是我在本地分支 origin/master 上的提交在本地分支 master 上重播吗? 我已经在我的回答中解释了 rebase:***.com/questions/39794674/… 你的提交不会出现在origin/master。在我上面描述的三个步骤之后,您的master 的状态是:origin/master + 您在 master 上所做的本地提交。 感谢 rethab,研究了您所做的另一篇文章,它的描述非常清晰和真棒!投票。第二步还有一个问题,当我执行git rebase -i origin/master 时,git 会将最近的更改从远程 master 拉到我的本地 origin/master 分支 - 然后根据最近的远程 master 更改,将它们应用到我的本地 master ?或者git rebase -i origin/master 只是从我的本地源/主分支获取提交(对于最近的更改没有拉远程主控)我的本地主控更改?谢谢。 确实如此。 rebase 纯粹是本地的。获取获取。

以上是关于git rebase 不使用分支的主要内容,如果未能解决你的问题,请参考以下文章

git使用-merge、--no-ff、rebase

Git rebase使用

在 Git 中,如何在不挑选新分支的情况下对历史中具有多个合并提交的分支进行 rebase + squash

如果不再使用本地分支,我应该使用 `git pull --rebase origin master` 还是 `git rebase origin/master`?

git:rebase的原理

聊下 git rebase -i