如何将我的仓库的当前状态作为主人提交?

时间:2015-03-03 09:57:45

标签: git

我在回购时遇到主分支问题。我在服务器上拉了主分支,但是它有一个无法预料的错误。我以一种有点恐慌的方式检查了一个我知道仍然有效的具体提交。

现在,应用程序正常工作,但我的回购是#34;当前不在任何分支上。"。与此同时,我想保留服务器本身的变化(非常糟糕的做法,我很清楚)。 所以我的问题是 - 有什么方法可以使用我的回购的当前状态并将其变成" master"?我已经研究了类似的问题,并通过与"我们的"合并来解决这些问题。策略 - 但我认为,由于我不在任何分支机构,因此不会起作用。

1 个答案:

答案 0 :(得分:1)

是的,你可以,并且有几种方法可以解决它。你没多说什么 您的项目如何设置以及您是否自动发布您的项目 主分支。

我强烈建议你首先在丢弃的回购中尝试这些技术 在您的实际网站上尝试之前,请确保您知道自己在做什么。

选项1:强制回滚主

首先,将当前版本的master保存为old-master:

git branch old-master master

现在old-master和master指向同一个提交。接下来,我们将更新master 指向你当前的提交:

git branch -f master HEAD

此时,您仍然会有一个分离的HEAD,但是本地主人会 指出你所在的提交。

git checkout master

这会让你回到当地的主分支机构。

虽然这里有很多细节。首先是问题 你是否应该推动这一变化。如果你自动发布了 master branch,那么你可能会考虑做一个--force push,但那就是 对团队中的其他开发人员非常不友好。如果你不这样做 自动发布网站,然后离开真的没有任何伤害 事情就像他们一样,修复出错的地方,然后更新网站 一旦解决了所有的问题。这里的想法是:如果事情不动 自动,然后你不必担心地毯被拔出 在你的脚下。 我不建议使用此选项。

选项2:还原错误提交

这更友好,因为您不必回滚历史记录。这是最好的 这是在您的存储库的单独克隆中,因此您不必更改您的 正在服务的工作树,直到修复主人。

让我们说提交WORKS是一切正常工作的地方,而BROKEN就是 当前的主人提示。目前尚不清楚是否有多个破损 修订,但假设它是,那么你可以简单地恢复损坏的提交。 从另一个工作树,您可以:

# In another working tree, *not* the one for your website
git checkout master
git revert BROKEN
git push origin master

如果有多个提交破坏了,您可以将它们全部还原。只是 注意这些提交中是否有任何提交是合并提交。你可以恢复整个 提交范围:

git revert FIRST_BROKEN_COMMIT..LATEST_BROKEN_COMMIT

这也将在两者之间恢复所有良好的提交。但这可能正是如此 考虑到这种情况,你想要什么。

最后,您可以更新您的网站。在网站的工作树中,您可以 使用方法:

git fetch origin master
git push . FETCH_HEAD:master
git checkout master

虽然提交编号会改变,但内容不应该,除非您选择 不要在WORKS和BROKEN之间恢复一些提交。

注意:git仍然会将恢复的提交视为历史记录的一部分,所以 重新合并分支机构不会重新引入这些更改。不幸的是,它 意味着您需要重新生成有效的东西并将其合并, 或者只是重做工作并重新介绍它。有相当多的帮助 有关于此主题的内容,包括StackOverflow。

选项3:将master合并为master

这使用合并策略将master回滚到先前的状态。不是 在我看来,比选项2更好,但这是一个选择。

同样,您必须在单独的工作树中执行此操作。首先创建一个 基于提交WORKS的new-master分支,尽管你不会保留它 端:

# In another working tree, *not* the one for your website
git checkout -b new-master WORKS

此时,new-master应指向您真正想要的提交 成为大师的尖端(有效的那个)。然后合并到主人的提示 使用我们的战略:

git merge -s ours master

确保为合并添加有意义的消息,例如“还原 网站返回提交工作“。

现在,我们需要使master分支与new master相同:

git push . new-master:master

如果您收到有关分歧的任何错误消息,那么您可能会做一些事情 错误。这个新的历史将是破碎的主分支的后代,所以 应该没有不同的历史。

您可以通过将其推送到远程仓库然后放下来完成此操作 新主分支:

git checkout master
git push origin master
git branch -d new-master

最后,您可以像在选项2中一样使您的网站保持最新状态:

git fetch origin master
git push . FETCH_HEAD:master
git checkout master

提交号码会改变,但内容不应该像我们提出的那样 掌握与你所在的提交相同。

摘要

哪一个更好取决于你。对我来说,如果有的话,我喜欢选项2 只涉及少数提交,而选项3则涉及更多。 ID 如果你对Git没有信心,那么也选择了选项3 - 没什么可去的 错。