ChatGPT解决这个技术问题 Extra ChatGPT

如何保持分支与 master 同步/更新?

目前 git 正在努力,我无法为以下问题提出最佳解决方案。

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

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

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

更新 1:如果我要将 master 合并到 mobiledevicesupport 并将 mobiledevice 支持合并到 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
如果您和我一样,正在寻找如何使用 GitHub client 进行操作:help.github.com/articles/merging-branches
这个问题救了我几个世纪的命;感谢您花时间提出这个精彩的问题@Mr。以西结
如果您正在使用 fork,则必须遵循 help.github.com/articles/syncing-a-fork
Google 员工:下面的答案自然会导致 rebasemerge 的两难境地;请参阅此处进行比较:perforce.com/blog/vcs/git-rebase-vs-merge-which-better

O
Oleg Valter is with Ukraine

是的,只需这样做:

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

使 mobiledevicesupport 与 master 保持同步。

然后,当您准备好将 mobiledevicesupport 放入 master 时,首先,像上面一样合并到 master 中,然后:

git checkout master
git merge mobiledevicesupport
git push origin master

就是这样。

这里的假设是 mobilexxx 是一个主题分支,其工作尚未准备好进入您的主分支。因此,只有在 mobiledevicesupport 处于良好位置时才合并到 master 中。


这对我来说听起来很合理,我想我不确定这会使提交历史变得多么肮脏,我将用一个我认为会发生的例子来更新我的问题。
您将有很多“合并提交”,本质上是 git 试图解决您的分支之间的差异。如果您对此感到担心,并且您是唯一使用该分支的人,那么请执行“git rebase master”而不是“git merge master”,并且不要将提交推送到远程分支。如果你这样做了,你会发现自己对 origin/mobiledevicesupport 做了很多强制推送(git push --force),因为你会(可能)总是发送与什么不匹配的提交历史远程分支有。更多细节在这里git-scm.com/book/en/Git-Branching-Rebasing
我相信这是正确的答案,听起来和我想要的完全一样。我在上面添加了一个插图以使其更加清晰,但是如果您说的是真的,那么这应该完全符合我的要求。谢谢你。
这会使提交历史变得混乱,请参阅我的答案通过 rebase 来完成。
@oneworld 以确保您拥有最新版本的 master。您只需从 mobiledevicesupport 分支执行 git pull origin master 即可完成相同的操作
e
euphoria83

每当您想将更改从 master 转移到您的工作分支时,请执行 git rebase <remote>/master。如果有任何冲突。解决它们。

当您的工作分支准备就绪时,再次变基,然后执行 git push <remote> HEAD:master。这将更新远程(中央仓库)上的主分支。


以这种方式而不是在接受的答案中这样做的优点/缺点是什么?
直到你在变基地狱里呆了 5 个小时
仅当您的分支位于私有存储库上时,这才是正确的。永远不要对已经推送到上游的东西进行变基。这就是为什么:git-scm.com/book/en/v2/…
rebase 重写历史的问题在于 rebase 提交的 SHA 已更改,因此您不能依赖(例如)git branch --contains <commit> 的输出。
I
IwishIcanFLighT

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

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master

有关 --no-ff 的更多信息和图形:stackoverflow.com/questions/9069061/…
R
Ruby Racer

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

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

2 git rebase origin/develop

3 如有冲突,一一解决

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

5 git push --force


这既难以阅读,也难以理解。请更新您的答案并使用正确的代码降价,将您的评论与命令分开。
建议使用 git push --force-with-lease 而不是 git push --force
S
Sachin Jain

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

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

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

问:交叉合并是否存在问题。

A. 这取决于上次同步时在 mobile* 分支和 master 分支中所做的提交。举个例子:在最后一次同步之后,这些分支发生了以下提交

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

现在,假设提交 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.

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

快进合并真正的合并(需要手动操作)

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

所以底线是交叉合并不是问题,最终你必须这样做,这就是同步的意思。在生产中做任何事情之前,确保你在合并分支时弄脏了你的手。


所以像这样的交叉合并不是问题吗?
交叉合并就是我们所说的同步,除非两个分支中的提交不会导致任何冲突,否则这不是问题。请参阅我更新的答案。
a
aalbagarcia

运行以下命令:

$ git checkout mobiledevice
$ git pull origin master 

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

我不知道这是否是最佳做法,但对我有用。


f
faisal

您正在朝着正确的方向思考。不断合并master与mobiledevicesupport,当mobiledevicesupport稳定时将mobiledevicesupport与master合并。每个开发人员都有自己的分支,并且可以根据他们的角色在 master 或 mobiledevicesupport 上进行合并。


u
user3625699
using yourBranch = mobiledevicesupport;

使 yourBranchmaster 保持同步包括两个重要细节:

根据master更新云端yourBranch版本 根据master更新PC上yourBranch版本

如何:

假设 yourBranch 落后于 master

创建从 master 到 yourBranch 的合并请求(例如通过 GitLab Web UI)接受/解决从 master 到 yourBranch 的合并请求(例如通过 GitLab Web UI)

现在您的分支中的 master 有了更改

这已在远程(在云中)将主更改加载到 yourBranch,但尚未在本地加载

更新您在本地(在您的 PC 上)拥有的旧版本 yourBranch

确保您现在正在本地与您的分支进行交互

git fetch 将检查更改

git status 将告诉您本地存储库(本地 yourBranch 的)的状态 - 例如 master 后面的 5 次提交

git pull 将从云端(从“远程”)下载新的更新版本,其中添加了来自 master 的更改 - 现在您也将在本地存储库中与 master 同步(在您的机器上)