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

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

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

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

1038989 次浏览

要么cherry-pick相关提交到分支aq,要么将分支master合并到分支aq

检查aq分支,并从master重新定位。

git checkout aqgit rebase master

当您在aq分支上时,您应该能够只git merge origin/master

git checkout aqgit merge origin/master

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

git checkout aqgit cherry-pick commit1git cherry-pick commit2git cherry-pick commit3...

假设这些提交代表bug修复。

从现在开始,将bug修复保存在一个单独的分支中

git merge hotfixes

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

首先查看Master:

git checkout master

做所有的更改,热修复补丁和提交,并推动你的主人。

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

git checkout aqgit merge master

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

对我来说,我已经有了更改,我想从基分支获得最新的更改。我无法执行rebase,而cherry-pick将花费很长时间,所以我做了以下操作:

git fetch origin <base branch name>git merge FETCH_HEAD

所以在这种情况下:

git fetch origin mastergit merge FETCH_HEAD

你有几个选项。git rebase master aq到分支上,它将保留提交名称,但如果这是一个远程分支,请不要REBASE。如果你不在乎保留提交名称,你可以git merge master aq。如果你想保留提交名称,它是一个远程分支git cherry-pick <commit hash>,提交到你的分支上。

简单的方法

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

将其与aq合并

git checkout mastergit pullgit checkout aqgit merge --no-ff mastergit push

这个(从这里)对我有用:

git checkout aqgit pull origin master...git push

引用:

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

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

这相当于

git checkout aqgit merge master

编辑:

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

只是:

git checkout aqgit merge master

很好。

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

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


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

存在以下问题:

git checkout aqgit merge master

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

另一方面

git checkout mastergit merge aq

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

如何应对?!

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

git checkout mastergit merge aqgit checkout aqgit merge mastergit checkout mastergit reset --hard HEAD~1git checkout aq

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

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

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

场景:

  • 我创建了一个分支从主说分支-1,并把它拉到我的本地。
  • 我的朋友从大师那里创建了一个分支,说分支-2。
  • 他向master提交了一些代码更改。
  • 现在我想将这些更改从master分支转移到本地分支。

解决方案

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

执行“git stash Application”后,您可以在文件上找到冲突。您需要手动修复它,现在您已准备好推送。