以这种方式创建主分支是否安全

时间:2018-02-16 13:19:22

标签: git

当我为我的项目创建一个git存储库时,Git默认为我创建了master分支,我也将代码推送到那里。

然后,从一年前的某个时候开始,我开始研究一个新的分支“develop”。

现在,我在develop分支上有很多东西,我想直接在'master'分支上有一个develop的副本,是否安全(即没有工作getlost),如果我只是删除了当前本地&远程 master分支并从develop分支以创建新的master分支,以便在developmaster中创建相同的代码我的回购(本地和远程)?

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作,使master在遥控器中成为develop的副本。您可能会丢失masterdevelop以外的所有作品。

git checkout master
git reset --hard develop
git push origin master

我不知道你们两个分支的历史是什么。如果master上的提交不在develop上,这将不是一个好的解决方案,因为它会建议强制推送,这是不推荐的。

答案 1 :(得分:1)

在您的描述中我不清楚的事情:在您创建开发的提交之后是否有更改添加到master?

如果没有,那么你有类似的东西:

A <--(master)
 \
  B -- C -- D <--(develop)

在这种情况下,如果您要将master内容更新为develop,请将develop合并到master

git checkout master
git merge develop

默认情况下,这将执行“快进”,您将以

结束
A -- B -- C -- D <--(master)(develop)

如果要保留分支拓扑 - 即如果您希望稍后能够告知提交BCD已在分支上完成 - 那么不允许快进

git checkout master
git merge --no-ff master

然后你会得到

A ----------- M <--(master)
 \           /
  B -- C -- D <--(develop)

其中M是“合并提交”;但由于A无论如何都是D的祖先,TREE上的内容(“M对象”)将与广告D相同,因为您可以与git diff master develop验证。

另一方面,如果master收到了更改(来自您或其他任何人),那么您的要求(“使master匹配develop”和“不会丢失更改” “)有点冲突。在这种情况下,您从

开始
A -- X <--(master)
 \
  B -- C -- D <--(develop)

仍有多种方法可以将master分支移动到D - 但之后您将丢失X(除非您采取额外步骤来保留它,例如创建新分支或移动master之前在master标记。

另请注意,任何这些方法都会导致必须“强制推送”更改,这会导致其他任何克隆回购邮件的人出现问题 - 因此您必须与他们协调(请参阅recovering from upstream rebasegit rebase文档中 - https://git-scm.com/docs/git-rebase;无论您是否实际使用rebase命令,这种情况都适用。)

移动master的最简单方法是

git checkout master
git reset --hard develop
git push -f

如果您不想丢失X(或为其创建新分支),或者您不想因为对其他开发人员的影响而强制推送,那么请考虑以下其他选项:< / p>

分支分歧时的正常程序是将develop合并到master。 (有些人喜欢线性历史,首先会将develop重新定位到master然后快进master,如上例所示。)结果将通常是master匹配develop,因为master也会有来自X的更改。

您可以执行合并,同时让masterdevelop内容进行处理(粗略地,相对于master制作主提交记录,“撤消” X以及BCD的“执行”。在这种情况下,X的更改仍在历史记录中(因此它们并未完全丢失)。有两种方法可以做到这一点。更好的方法是还原仅在master上的提交(在我们的示例中为X)。

git checkout master
git revert HEAD
git merge develop

如果master上有多个提交,您可以在一次提交中将它们全部还原

git revert -n HEAD^ HEAD
git commit

在还原之后但在合并之前,您可以将develop重新定位到master,以便在需要时保持历史线性。

为了完整起见,我会提到你可以在合并提交本身中包含X的恢复;但是,除非将develop合并到master否则会因冲突而失败,这会造成“邪恶的合并”并可能导致问题。所以它可能不值得。 (特别是因为git并不像你希望的那样容易;它很容易合并并丢弃你正在合并的“其他”分支的变化,但不太容易合并并丢弃当前的变化分支。)