如何从另一个分支获取更改

250

我目前正在处理 featurex 分支。我们的主分支名为 our-team。自从我开始处理 featurex 以来,更多的变更已经被应用到了 our-team 分支。

我已经在本地完成了这个操作,以获取来自 our-team 的最新更改:

git checkout our-team
git pull

在我将featurex推送合并之前,我想要在本地将our-team分支中的所有更改合并到featurex中,以确保一切按预期工作。

我该如何操作?

6个回答

252

在按照以下步骤之前,请记住:featurex 是正在合并和推送更改的分支。

  1. 进入你的分支 featurex

git checkout featurex
our-team分支的更改合并到featurex分支中。
git merge our-team
或者
git cherry-pick {commit-hash}

如果您想合并特定的提交。

注意:在将 our-team 分支合并到 featurex 分支之前推送,可能需要解决冲突。


4
我对Git相对陌生,遇到了这样的问题:即使运行了git fetch,执行git merge our-team仍未包含来自远程our-team的最新更改。我必须先切换到our-team,执行git pull,然后再切换到featurex才能合并。Git的思维方式与我不同。 - nielsen

123

当你在自己的分支featurex时,可以使用rebase,例如git rebase our-team

这将把你的分支的起点移动到our-team分支的末尾,并合并所有featurex分支上的更改。


4
我将来会使用这个方法,但是这一次我只是按照以下步骤操作...它是否具有相同的效果?git checkout our-team git pull git checkout featurex git merge our-team - Anthony
9
我想强调:如果你这样做,但本地没有来自 our-team 的更改,则需要运行 git fetch && git rebase origin/our-team。你的命令假设存储库已经更新。 - Makoto
8
不要在公共分支上使用rebase,这是有史以来最糟糕的建议。 - Ondrej Sotolar
3
@OndrejSotolar 为什么? - Livius

65
git fetch origin our-team
或者
git pull origin our-team

但首先你应该确保你已经处于你想要更新到的分支(featurex)上。


40
有两种选择,要么合并你的分支,要么变基你的分支。两者的工作方式不同,但是效果类似。 被接受的答案是进行变基。这将获取所有对our-team所做的提交,然后应用对featurex所做的提交,并提示您根据需要合并它们。
变基的一个小缺点是,您会失去/重写您的分支历史记录,从本质上告诉git您的分支不是从提交123abc开始的,而是从提交456cde开始的。这将会给其他人在分支上工作带来问题,并且一些远程工具会抱怨。但是,如果您确定自己在做什么,那就是--force标志的作用。 其他发帖者建议的是进行合并。这将获取featurex分支以及其当前状态,并尝试将其与our-team的当前状态合并,提示您进行一个大的合并提交并在推送到our-team之前修复所有合并错误。区别在于您在our-team新提交之前应用了您的featurex提交,然后修复了差异。您也不会重写历史记录,而是添加一个提交记录,而不是重写先前的提交记录。
两种选择都是有效的,并且可以共同使用。通常(我的意思是,如果您使用git-flow等广泛使用的工具和方法),对于功能分支,会将其合并到主分支中,通常通过合并请求,并解决所有产生的冲突为一个(或多个)合并提交。
变基是一种有趣的选择,可以帮助您在最终进行合并之前修复分支,并减轻执行一个大的合并提交的痛苦。

11
谢谢。我真正不喜欢 Git 的地方在于,对于一个问题,似乎总会有几个答案,即使是专家也意见不一。而作为一个被迫使用它的新手用户,我必须想办法选择正确的答案。如果我选错了,Git 就会惩罚我,因为没有简单的撤销选项。嗯,可能有很多撤销选项,但那样我们就又要重新开始了 :-( - Sander de Jong
3
你可以做的一件事是创建“备份分支”来缓解这种情况。在进行重大更改之前,你可以始终执行git checkout -b my-backup。虽然这不是完整/正确的备份,但如果合并/变基出现问题,它会为你节省一些麻烦。 只要你不推送它并在之后清理它,这样做就没有真正的缺点。 - CyberFoxar
1
感谢您解释这两者之间的区别。 - Aditya

20

你已经快要到达目的地啦 :)

剩下需要做的是

git checkout featurex
git merge our-team

这将把our-team合并到featurex中。

以上假设您已经在featurex中提交或隐藏了您的更改,如果不是这种情况,则您需要先执行此操作。


-4

假设有人在询问如何在不使用 git pull 的情况下拉取更改 - git pull 实际上会先运行 git fetch,然后执行 git merge,因为它组合了两个序列,即 fetch + merge。对于那些仅需从另一个分支拉取更改而无需这样做的人:

git checkout <branch with changes wanted> 
git checkout -b <new branch> 


目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

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