如何让git分支与master保持同步

Mr.*_*IEL 251 git

目前git正在努力,我无法想出以下的最佳解决方案.

有两个分支,一个叫master,一个叫mobiledevicesupport.我希望将mobiledevicesupport保持为一个连续的分支,只要mobiledevicesupport稳定,它就会与主分支合并/同步.这会将来自mobiledevicesupport的更改合并到master中,但也会将master中的所有更改带入mobiledevicesupport,以便继续处理分支并更改或修改功能.这需要与中央存储库和多个开发人员一起工作.

请举例说明其他人使用的类似工作流程,或者只是告诉我这个想法是不是很愚蠢,我应该考虑其他选择.目前工作流程似乎很合理,但我只是不知道如何让git以这种方式工作.

谢谢,所有帮助非常感谢.

更新1:如果我要将master与mobiledevicesupport和mobiledevice support合并到master中,我是否会在两个分支上获得复制提交.或者git足够聪明,我已经将分支A中的最新更改提取到分支B并将合并提交C添加到分支B.并且我已将分支B中的最新更改提取到分支A并将合并提交D添加到分支一个?

我打算发布一张图片,但我没有足够的声誉,所以我想下面的插图将要做.两个分支连续运行,经常合并两个方向.我不确定的关键是git将如何完成提交,并且它将在合并时从其他分支的提交填充任一分支,或者它将保持干净.我之前使用过rebase但它似乎结束了分支并将所有提交放入master中,或者我做错了.感谢你目前的帮助.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L
Run Code Online (Sandbox Code Playgroud)

con*_*t47 382

是的只是做

git checkout master
git pull
git checkout mobiledevicesupport
git merge master
Run Code Online (Sandbox Code Playgroud)

保持mobiledevicesupport与master同步

那么当你准备把mobiledevicesupport放到master中时,首先像上面那样在master中合并,然后...

git checkout master
git merge mobiledevicesupport
git push origin master
Run Code Online (Sandbox Code Playgroud)

就是这样.

这里的假设是mobilexxx是一个主题分支,其工作还没有准备好进入你的主分支.因此,当mobiledevicesupport处于一个好位置时,只能合并到master中

  • @oneworld 以确保您拥有最新版本的 master。你可以通过从 mobiledevicesupport 分支做一个 `git pull origin master` 来完成同样的事情 (3认同)
  • 这对我来说听起来很合理,我想我不确定这会让提交历史变得多么肮脏,我将用我认为会发生的例子来更新我的问题。 (2认同)
  • 您将有很多“合并提交”,本质上是 git 试图解决分支之间的差异。如果您对此感到担心并且您是唯一一个使用该分支的人,那么请执行“git rebase master”而不是“git merge master”并且不要将提交推送到远程分支。如果你这样做了,你会发现自己对 origin/mobiledevicesupport 进行了大量的强制推送(git push --force),因为你将(可能)总是发送与提交历史不匹配的提交历史远程分支有。更多细节在这里 http://git-scm.com/book/en/Git-Branching-Rebasing (2认同)
  • 阅读本文以了解为什么这不是特别好的建议:http://kentnguyen.com/development/visualized-git-practices-for-team/#comment-423841808.这是由Git维护者编写的,因此可以公平地说他知道他正在谈论这个特定主题的内容. (2认同)
  • 这会使提交历史变得混乱,请参阅我的答案通过rebase进行. (2认同)

eup*_*a83 43

每当您想要从master进行更改到您的工作分支时,请执行git rebase <remote>/master.如果有任何冲突.解决他们.

当你的工作分支准备好后,再次进行rebase然后再做git push <remote> HEAD:master.这将更新远程(中央仓库)上的主分支.

  • Sane直到你花了5个小时在地狱里 (27认同)
  • 仅当您的分支位于私有存储库时才会出现这种情况.永远不要改变上游推动的东西.这就是原因:https://git-scm.com/book/en/v2/Git-Branching-Rebasing#The-Perils-of-Rebasing (17认同)
  • 这样做的优点/缺点是什么,而不是在接受的答案中? (3认同)
  • 重新定位是重写历史的问题是,重新定义的提交的SHA被更改,因此您不能依赖于(例如)`git branch --contains <commit>`的输出. (3认同)

Iwi*_*ghT 11

concept47的方法是正确的方法,但我建议与--no-ff选项合并,以保持您的提交历史清晰.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master
Run Code Online (Sandbox Code Playgroud)

  • 有关“--no-ff”的更多信息和图形:/sf/ask/634834301/ Between-git-merge-and-git-merge-no-ff (3认同)

Gob*_*0st 10

通过 git merge 接受的答案将完成工作,但会留下混乱的提交历史,正确的方法应该是通过以下步骤“rebase”(假设您希望在 PR 之前进行最终推送之前将您的功能分支与开发保持在 sycn 中)。

1git fetch来自您的功能分支(确保您正在处理的功能分支是最新的)

2 git rebase origin/develop

3、如有冲突,一一解决

4git rebase --continue处理完所有冲突后使用

5 git push --force

  • 这既难以阅读,又难以理解。请更新您的答案并使用正确的代码降价,将您的注释与命令分开。 (2认同)

sac*_*024 8

是的,我同意你的方法.要将mobiledevicesupport合并到master中,您可以使用

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport
Run Code Online (Sandbox Code Playgroud)

同样,您也可以在mobiledevicesupport中合并master.

问:如果交叉合并是一个问题.

答:它取决于上次同步时在mobile*branch和master branch中所做的提交.以此示例为例:在上次同步之后,以下提交发生在这些分支上

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E
Run Code Online (Sandbox Code Playgroud)

现在,假设提交B对文件a.txt进行了一些更改,并且提交D也对a.txt进行了一些更改.让我们看一下现在合并的每个操作的影响,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.
Run Code Online (Sandbox Code Playgroud)

现在,有两种类型的合并可能

  1. 快进合并
  2. 真正的合并(需要手动工作)

Git将首先尝试使FF合并,如果发现任何冲突都无法通过git解析.它无法合并并要求您合并.在这种情况下,将发生新的提交,负责解决a.txt中的冲突.

所以底线是交叉合并不是问题,最终你必须这样做,这就是同步意味着什么.在进行任何生产之前,确保在合并分支时弄脏你的手.


小智 8

运行以下命令:

$ git checkout mobiledevice
$ git pull origin master 
Run Code Online (Sandbox Code Playgroud)

这会将所有最新提交合并到您的分支。如果合并导致一些冲突,您需要修复它们。

我不知道这是否是最佳实践,但对我有用。