从远程主分支开始的Git Rebase

7
这可能以前被问过了,但我对术语有点困惑,所以不确定哪个命令是完成我需要完成的任务的正确命令。现在,我正在与我的团队一起从GitHub存储库中工作。在那里,我为一个任务创建了一个分支。我将存储库克隆到我的本地计算机,然后在本地检出该分支。我开始进行更改,希望继续工作……在进行这些更改的同时,我的团队一直在更新他们的代码,并将更改推送回 GitHub 上的主分支。如何从 GitHub 的主分支上拉取他们的更改,使其在本地和 GitHub 上更新我的分支(现在在 GitHub 上,它显示我领先于 1 次提交,但比主分支落后了 19 次)。感谢您的建议......这是我计划经常进行的事情,因此学习正确的流程对我来说非常重要...
4个回答

11

有几种方法可以实现你想要的,但这可能取决于你的仓库策略。例如,如果你变基你的分支,你将无法将其推回服务器,你需要使用-f选项或删除远程分支并推送一个新分支。一些人可能会说,一旦你已经将分支推到了服务器上,变基不是一个好方法,如果这是你的repo策略,那么你就必须将主分支合并到你的分支中,然后再将其推回远程。

让我们谈谈两种方法:

变基:

我个人更喜欢做变基,但前提是我确定没有其他人在远程使用我正在推送的分支。我喜欢变基,因为它最终会留下一个更干净的历史记录,它之所以能够达到这样的效果,是因为它从分支中删除了我的更改,应用了远程更改,然后再将我的更改放回顶部,但是,这样做会更改提交哈希值,并且与先前相同提交的哈希值不匹配,因此您必须使用-f选项将其推送或删除远程分支并重新创建它。

我会像这样做,在本地存储库中,我会进入主分支:

git checkout master

然后更新它的远程更改:

git pull

它将在你的git主分支上幕后运行一个合并的git fetch。

然后回到你的分支:

git checkout my_branch

然后将其与主分支进行变基:

git rebase master

如果一切都没有冲突,那么你就可以开始了。

你可以使用:

git push -f origin my_branch

(小心!这个命令会覆盖你的远程分支,非常危险,请确保在使用此命令之前一切正常。)

或者你可以删除你的远程分支,然后将其正常推回服务器:

git push origin my_branch

合并:

使用这种方法,你将在历史记录中得到一个合并提交,并且日志随着时间的推移可能会变得混乱,但也有一些优点,如果你确实有冲突,你只需要在合并时解决一次,如果你在变基时有冲突,你可能必须多次解决它,因为它会尝试逐个应用你的提交到新的远程提交上。

要做到这一点,你只需要进入主分支并更新它:

git checkout master

然后:

git pull

将执行与之前相同的操作

现在回到你的分支:

git checkout my_branch

然后运行:

git merge master

如果没有冲突,你就可以继续推送到服务器;如果有冲突,则需要解决它并正常地将其推送到服务器,由于已经在新提交中解决了冲突,因此本地分支和远程分支之间不会出现任何偏差。

git push origin my_branch

就是这样,希望这个过程对你有所帮助。你可能可以用更少的步骤来完成此操作,但这些是我喜欢的步骤,虽然它们可能不是最短的,但我感觉这样更安全。当然,在合并和变基方面有很多选项,建议你深入了解它们,它们非常有用。

它在抱怨我的pom.xml文件。有没有一种简单的方法可以忽略我本地对该文件所做的更改,从rebase中拉取更新后的文件,然后在该文件上重新进行这些更改?它们是小更改,所以我觉得这样会更容易。 - Chris Moretti
我成功避免了pom.xml的冲突,然后对其进行了添加和提交。但是现在我的本地分支显示“您的分支和'origin/<mybranch>'已经分叉, 分别有22个和1个不同的提交。 (使用“git pull”将远程分支合并到您的分支中) 没有要提交的内容,工作树干净”。你有什么想法? - Chris Moretti
不太确定我是否理解正确,您是先提交了更改,然后尝试进行变基吗?在此之前您没有任何提交吗?因为正如我所说:“...如果您重置您的分支,您将无法将其推送回服务器,您只能通过使用-f选项或删除远程分支并推送一个新的分支。” - Marcone
1
没事了。我改用合并操作,它完美地工作了。我确实需要添加冲突文件。这不是一个干净的提交历史,但对于这个特定的情况来说,这是可以接受的。只要它能正常工作,而它确实做到了。谢谢! - Chris Moretti

2

在一行中完成这个最佳的方法是...

git pull origin master --rebase

我认为Chris正在询问如何在合并/变基后将他的更改推送到Github。 - MikNiller
我认为对于使用 rebase 的(相对初学者级别的)git问题的答案,应该始终附带一个警告/免责声明,指出重写已与他人分享(推送到远程)的历史记录可能产生负面后果。 - Thomas
这是从开发/特性分支完成的吗? - undefined

1

那会很有帮助:

$ git config --global branch.master.rebase true

或者

# cat ~/.gitconfig
[user]
        name = xx
        email = xx@xx.com
[branch "master"]
        rebase = true

谢谢。


好的,一旦我添加了那个配置,我需要执行什么命令来完成我的需求?我只需要执行 git rebase 吗? - Chris Moretti
只需要执行"git pull"命令,远程提交将会合并到本地。 - Yang Yu
2
你必须在答案中添加更多信息。仅有一系列命令对未来的目的并不有用。 - Smit
当我从本地分支推回GitHub存储库时,我需要做任何特殊的事情吗? - Chris Moretti
@user1943674 只需推送并检查差异。验证它。 - Yang Yu

0
我该如何从GitHub的主分支拉取他们的更改,以便在本地更新我的分支?
git checkout master
git pull
git checkout <your-branch>
git rebase master

而且也在 GitHub 上(现在在 GitHub 上,它说我领先 1 次提交,落后于主分支 19 次提交)。
git commit -m "I do this, do that"

将你的分支上传到远程

git push -u <remote-name> <your-branch-on-remote>

合并到主分支并将您的更新上传到远程

git checkout master
git merge --no-ff <your branch>
git push -u <remote-name> master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接