在 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
没问题。
是的,这个简单的合并将显示从 master
到 aq
的更改是在那个时候进行的,而不是相反;但这没关系——因为那确实发生了!稍后,当您最终将分支合并到 master
时,合并最终将显示您对 master
所做的所有更改(这正是您想要的,也是人们期望的提交无论如何都要找到该信息)。
我已经检查过,下面的方法也显示了与正常方法完全相同的更改(自 original 在 aq
和 master
之间拆分以来对 aq
所做的所有更改)上面,当您最终将所有内容合并回master
时。所以我认为它唯一真正的缺点(除了过于复杂和非标准...... :-/ )是,如果你用 git reset --hard HEAD~<n>
回退 n 最近的变化并且这超过了合并,那么下面的版本就会滚动退回“错误”分支,您必须手动修复(例如使用git reflog
和git 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
将分支 a
和 b
合并到当前分支中。但是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 aq
onto 将保留提交名称的分支,但如果这是一个远程分支,请不要 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
。如果您的分支已被推送,请使用 merge
。 rebase
将重写历史记录。
@Toskan 您可能会遇到本地主机无法与远程同步的问题。这样可以确保您合并到代码的远程副本中。
@garbagecollector 我反对变基(我可以,但不会变基)我认为没有理由用变基赌博。它只会让事情变得不必要地复杂。你总是有一个问题“我把它推到远程了吗?”思考和向新人解释是痛苦的。有人说它避免了合并提交。但我 想要 进行合并提交。它们并不杂乱,它们记录分支何时合并。所以最后一次,我们可以最终停止表现得像我们都致力于大师一样吗?如果你非常不喜欢日志中的合并提交,只需使用 --no-merges 过滤它们。【参考方案13】:
cherry-pick
相关提交到分支 aq
或合并分支 master
到分支 aq
。
【讨论】:
@Slee 你自己回答了......这不是这种情况的解决方案以上是关于在 Git 中获取从 master 到分支的更改的主要内容,如果未能解决你的问题,请参考以下文章
Git - 处理错误的分支 - 如何将更改复制到现有主题分支