在 Git 中获取从 master 到分支的更改

Posted

技术标签:

【中文标题】在 Git 中获取从 master 到分支的更改【英文标题】:Get changes from master into branch in Git 【发布时间】:2011-07-17 11:28:20 【问题描述】:

在我的存储库中,我正在处理一个名为 aq 的分支。

然后我在master 中提交了新的工作和错误。

将这些提交放入aq 分支的最佳方法是什么?从master 中创建另一个新分支并将其与aq 合并?

【问题讨论】:

将来,您还可以从 master 和其他需要修复的分支的共同祖先开始您的 bugfix 分支,这样您就可以将其合并到所有这些分支中,而无需选择其他任何东西起来。 @Jefromi 但如果他不是该项目的唯一工作人员,这将超出他的控制范围。其他人更新大师。见鬼,你自己可能会从第三个分支更新master,这种情况是不可避免的,需要一个通用的解决方案。 @ahnbizcad 我很确定他可以控制自己在哪里开设自己的分支机构。如果他的分支是他想要合并的分支的共同祖先,并且人们随后添加到这些分支,它仍然是一个共同祖先。 伙计们的问题,这个命令能做到吗,git pull origin my_branch_name 【参考方案1】:

场景:

我从 master say branch-1 创建了一个分支并将其拉到我的本地。 我的朋友从 master 说 branch-2 创建了一个分支。 他向 master 提交了一些代码更改。 现在我想将这些更改从 master 分支转移到我的本地分支。

解决方案

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

执行“git stash apply”后,您可以在文件中发现冲突。您需要手动修复它,现在您可以推送了。

【讨论】:

值得注意的是,如果其他人的分支是从你的分支分支出来的(或以其他方式链接到你现有历史的更改),那么变基将是一场噩梦。如果你的分支是纯本地的,这很好,但要小心重写已经发布的历史!【参考方案2】:

编辑:

我在下面的回答记录了一种将master 合并到aq 的方法,如果您查看合并的详细信息,它会列出合并之前在aq 上所做的更改,而不是在master 上所做的更改.我意识到这可能不是你想要的,即使你认为它是!

只是:

git checkout aq
git merge master

没问题。

是的,这个简单的合并将显示从 masteraq 的更改是在那个时候进行的,而不是相反;但这没关系——因为那确实发生了!稍后,当您最终将分支合并到 master 时,合并最终将显示您对 master 所做的所有更改(这正是您想要的,也是人们期望的提交无论如何都要找到该信息)。

我已经检查过,下面的方法也显示了与正常方法完全相同的更改(自 originalaqmaster 之间拆分以来对 aq 所做的所有更改)上面,当您最终将所有内容合并回master 时。所以我认为它唯一真正的缺点(除了过于复杂和非标准...... :-/ )是,如果你用 git reset --hard HEAD~<n> 回退 n 最近的变化并且这超过了合并,那么下面的版本就会滚动退回“错误”分支,您必须手动修复(例如使用git refloggit reset --hard [sha])。


[所以,我之前的想法是:]

有问题:

git checkout aq
git merge master

因为合并提交中显示的更改(例如,如果您现在或稍后在 Github、Bitbucket 或您最喜欢的本地 git 历史查看器中查看)是在 master 上所做的更改,这很可能不是您想要的。

另一方面

git checkout master
git merge aq

显示在 aq 中所做的更改,这可能是您想要的。 (或者,至少,这通常是我想要的!)但是显示正确更改的合并在错误的分支上!

如何应对?!

完整的过程,以合并提交结束,显示在 aq 上所做的更改(根据上面的第二次合并),但合并影响 aq 分支,是:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

这:将 aq 合并到 master 上,将相同的合并快进到 aq 上,在 master 上撤消它,然后让你再次回到 aq 上!

我觉得我错过了一些东西 - 这似乎是你显然想要的东西,而且很难做到。

另外,rebase 不等价。它丢失了在 aq 上提交的时间戳和身份,这也不是我想要的。

【讨论】:

如果您还没有准备好将 aq 合并到 master 中,这不是一个解决方案。如果其他人参与您的项目,则非常重要的发言人。它似乎也违背了单独分支的目的。 (发言人?自动更正错字?)无论如何,这个解决方案是关于将master 的一些更改合并到aq,根据原始问题,所以我不确定我是否理解你的问题'在暗示?当然,您最终可以将 aq 合并到 master,在完成我提到的上述任一解决方案之后,然后对两者进行进一步更改 - 这不会导致任何问题。【参考方案3】:

这 (from here) 对我有用:

git checkout aq
git pull origin master
...
git push

引用:

git pull origin master获取并合并master的内容 与您的分支分支并创建合并提交。 如果有 合并冲突您会在此阶段收到通知并且您必须解决 在继续之前合并提交。当你准备好推动你的 本地提交,包括新的合并提交,到远程服务器, 运行git push

【讨论】:

重要的是要注意,如果特别需要 merge,即如果 master 分支由于某种原因无法重新建立基础,则此解决方案是完美的。【参考方案4】:

您也可以通过运行一行来执行此操作。git merge aq master

这相当于

git checkout aq
git merge master

【讨论】:

这不是你认为的那样。 git merge a b 将分支 ab 合并到当前分支中。但是git merge a 当你在分支上时,a 什么都不做(这就是为什么这看起来有点像你认为它正在做的事情)。 (见git-scm.com/docs/git-merge#Documentation/…。)【参考方案5】:

简单的方法

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

【讨论】:

【参考方案6】:

aq合并

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

【讨论】:

为什么不快进?【参考方案7】:

无法保证主错误修复不在其他提交中,因此您不能简单地合并。做

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

假设这些提交代表错误修复。

不过,从现在开始,将错误修复保留在单独的分支中。你将能够只是

git merge hotfixes

当您想将它们全部滚动到常规开发分支时。

【讨论】:

【参考方案8】:

您有几个选择。 git rebase master aqonto 将保留提交名称的分支,但如果这是一个远程分支,请不要 REBASE。如果您不关心保留提交名称,您可以git merge master aq。如果您想保留提交名称并且它是远程分支git cherry-pick <commit hash>,则提交到您的分支。

【讨论】:

【参考方案9】:

对我来说,我已经进行了更改,我希望从基础分支获得最新的。我无法做到rebase,而cherry-pick 会永远持续下去,所以我做了以下事情:

git fetch origin <base branch name>  
git merge FETCH_HEAD

所以在这种情况下:

git fetch origin master  
git merge FETCH_HEAD

【讨论】:

【参考方案10】:

先签出大师:

git checkout master

执行所有更改、修补程序和提交,然后推送您的 master。

回到你的分支'aq',并在其中合并master:

git checkout aq
git merge master

您的分支将与 master 保持同步。 3.2 Git Branching - Basic Branching and Merging 是一个很好的基本合并示例。

【讨论】:

【参考方案11】:

查看aq 分支,并从master 变基。

git checkout aq
git rebase master

【讨论】:

rebase 可以来自任何其他分支吗? IE。 git rebase 其他分支?我的问题似乎有点偏离,我从一个分支分支然后对原始分支进行了更改。 如果我是对的,基于拉取请求它会显示所有主提交。如果你使用 merge/origin master 所有主提交将显示为 1 次提交,这使得代码审查更容易。 有时,git merge 会更好。如果两个分支都随着时间的推移而发展,您应该考虑哪个最适合您。 聚会迟到了,但这是关于何时变基与合并的一个很好的概述:atlassian.com/git/tutorials/merging-vs-rebasing/… 如果你之前在分支 aq 上的提交是公开的,那么不要做 rebase。 atlassian.com/git/tutorials/rewriting-history/git-rebase【参考方案12】:

当你在你的 aq 分支上时,你应该可以git merge origin/master

git checkout aq
git merge origin/master

【讨论】:

rebase 是否“更好”完全取决于具体情况。 为什么不直接调用“git merge master”而不是“git merge origin/master”? 如果您的分支是本地分支并且尚未推送到origin,请使用rebase。如果您的分支已被推送,请使用 mergerebase 将重写历史记录。 @Toskan 您可能会遇到本地主机无法与远程同步的问题。这样可以确保您合并到代码的远程副本中。 @garbagecollector 我反对变基(我可以,但不会变基)我认为没有理由用变基赌博。它只会让事情变得不必要地复杂。你总是有一个问题“我把它推到远程了吗?”思考和向新人解释是痛苦的。有人说它避免了合并提交。但我 想要 进行合并提交。它们并不杂乱,它们记录分支何时合并。所以最后一次,我们可以最终停止表现得像我们都致力于大师一样吗?如果你非常不喜欢日志中的合并提交,只需使用 --no-merges 过滤它们。【参考方案13】:

cherry-pick 相关提交到分支 aq 或合并分支 master 到分支 aq

【讨论】:

@Slee 你自己回答了......这不是这种情况的解决方案

以上是关于在 Git 中获取从 master 到分支的更改的主要内容,如果未能解决你的问题,请参考以下文章

Git - 处理错误的分支 - 如何将更改复制到现有主题分支

Git 更新分支到 master

text 从git master分支中提取更改

git merge origin/master 和 git pull 的区别

使用 Git 将 master 的更改合并到所有分支中?

如何从远程仓库中的 master 删除 GIT 分支并从另一个分支启动新分支?