在Git中从master转换为分支

Sle*_*lee 633 git version-control git-merge

在我的存储库中,我有一个aq我正在研究的分支.

然后,我承诺了新的工作和错误master.

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

Dou*_*rer 730

检查aq分支,并从中退出master.

git checkout aq
git rebase master
Run Code Online (Sandbox Code Playgroud)

  • 晚会,但这是一个很好的概述什么时候反对与合并:https://www.atlassian.com/git/tutorials/merging-vs-rebasing/workflow-walkthrough (54认同)
  • 如果您之前对分支机构的提交是公开的,那么请不要进行rebase.https://www.atlassian.com/git/tutorials/rewriting-history/git-rebase (5认同)
  • 有时,`git merge`会更好.如果两个分支随着时间的推移而发展,您应该考虑哪个最适合您. (4认同)
  • rebase 可以来自任何其他分支吗?IE。git rebase 其他分支?看来我的问题有点偏离,我从一个分支分支出来,然后对原始分支进行了更改。 (2认同)
  • 如果我正确,在pull请求上rebase它将显示所有主提交.如果您使用merge/origin master,则所有主提交都将显示为1提交,这使代码审查更容易. (2认同)

Chr*_*ken 277

你应该能够git merge origin/master在你的aq分支上.

git checkout aq
git merge origin/master
Run Code Online (Sandbox Code Playgroud)

  • 如果您的分支是本地的并且尚未被推送到"origin",请使用`rebase`.如果您的分支已被推送,请使用`merge`.`rebase`将重写历史. (132认同)
  • 如果rebase"更好"完全取决于具体情况. (52认同)
  • @Toskan你可以遇到本地主人不与遥控器保持同步的问题.这样它可以确保您合并代码的远程副本. (16认同)
  • 为什么不直接调用"git merge master"而不是"git merge origin/master"? (13认同)
  • @garbagecollector我反对rebase(我可以,但不会反驳)我认为没有理由用rebase赌博.它只会使事情变得不必要地复杂化.你总是有一个问题"我把它推到遥控器了吗?" 思考,向新人解释是一种痛苦.有人说它避免了合并提交.但我*希望*有合并提交.它们并不凌乱,它们在合并分支时进行记录.所以最后一次,我们终于可以停止表演,就像我们都在承诺掌握一样吗?如果您不喜欢日志中的合并提交,只需使用--no-merges过滤它们. (7认同)
  • 当您想从父分支中提取更改时,合并不是理想的解决方案.请参阅以下内容,了解为什么rebase更好:http://stackoverflow.com/questions/457927/git-workflow-and-rebase-vs-merge-questions (3认同)
  • 为什么不直接调用"git merge master"而不是"git merge origin/master"? (2认同)

Hri*_*hra 83

首先检查掌握:

git checkout master
Run Code Online (Sandbox Code Playgroud)

做所有更改,修补程序和提交并推送您的主人.

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

git checkout aq
git merge master
Run Code Online (Sandbox Code Playgroud)

您的分支机构将与主人保持同步.合并的一个很好的基本例子是3.2 Git Branching - Basic Branching and Merging.


Ada*_*ruk 23

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

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...
Run Code Online (Sandbox Code Playgroud)

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

从现在开始,将bug修复保存在单独的分支中.你将能够做到

git merge hotfixes
Run Code Online (Sandbox Code Playgroud)

当你想将它们全部滚动到常规dev分支中时.


小智 21

设想 :

  • 我从master说branch-1创建了一个分支并将其拉到我的本地。
  • 我的朋友从master 说branch-2 创建了一个分支。
  • 他向 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 
Run Code Online (Sandbox Code Playgroud)

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


Ala*_*avi 16

无论是cherry-pick有关提交到分行aq或分支机构合并master成分支aq.

  • @Slee你自己回答......这不是解决这种情况的方法 (5认同)

est*_*ezg 16

这(从这里)对我有用:

git checkout aq
git pull origin master
...
git push
Run Code Online (Sandbox Code Playgroud)

引用:

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


ald*_*tis 11

与它合并 aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push
Run Code Online (Sandbox Code Playgroud)

  • 为什么不快进? (3认同)

Ale*_*Lee 7

无论rebase或merge是正确的,但是如果你的分支aq中有多个提交,那么当你发送pull请求时,rebase或merge将包含其他人的更改,或者如果将提交压缩到一个提交中,那么我认为我有一种方式(不是最好的方式,但非常安全和清晰)

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A
Run Code Online (Sandbox Code Playgroud)


Mik*_*ton 7

编辑:

\n\n

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

\n\n

只是:

\n\n
git checkout aq\ngit merge master\n
Run Code Online (Sandbox Code Playgroud)\n\n

很好。

\n\n

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

\n\n

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

\n\n
\n\n

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

\n\n

有一个问题:

\n\n
git checkout aq\ngit merge master\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

另一方面

\n\n
git checkout master\ngit merge aq\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

怎么应对?!

\n\n

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

\n\n
git checkout master\ngit merge aq\ngit checkout aq\ngit merge master\ngit checkout master\ngit reset --hard HEAD~1\ngit checkout aq\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n


Pet*_* B. 6

对我来说,我已经进行了更改,我想从基础分支获得最新信息.我无法做到rebase,并且cherry-pick会永远这样做,所以我做了以下事情:

git fetch origin <base branch name>  
git merge FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下:

git fetch origin master  
git merge FETCH_HEAD
Run Code Online (Sandbox Code Playgroud)