git:我不小心将特性分支合并到主分支而不是开发分支

8
我正在使用git并与主分支/开发分支/特性分支一起工作。
主分支只有README文件。不幸的是,我意外地将我正在工作的特性分支合并到了主分支中而不是开发分支,并且还删除了特性分支。
我对git知之甚少,对该怎么做感到困惑。但我认为正确的做法是将特性分支(已经被删除了)上的更改合并到开发分支中,并将合并撤销到主分支。但如果我已经删除了特性分支,该怎么办呢?
3个回答

7
请注意,我在这里假设您尚未将合并结果进行了push。如果您已经这样做了,这仍然可以工作,但需要进行“强制推送”,这会影响使用存储库的所有其他人(请参见git rebase文档中的“从上游回复”;因为它实际上是创建的情况)。但是,如果您没有这样做,您就不需要担心任何问题。所以:

首先要重新创建功能分支。 我假设它只存在于本地。(如果在合并之前已经推送,则可能可以从远程恢复它;但无论如何,下面的方法都可以工作。)所以:

git checkout master
git checkout -b feature
git reset --hard HEAD^2

现在,功能分支已恢复到合并提交的“第二个父提交”处,这应该是它在合并之前所在的位置。

接下来,您需要从master中删除合并提交。

git checkout master
git reset --hard HEAD^

就这样了,你已经准备好将该功能合并到开发分支中了。


我已经推送了合并。现在我正在学习Git的变基。 - Rafael P. Miranda

3

首先使用git checkout master检出主分支,然后从主分支创建一个名为feature的新分支:

git checkout -b feature

再次检出主分支,并运行以下命令:

git log

这应该会给出您在主分支上的提交列表。您需要滚动提交列表,以复制您想要还原到的提交ID。假设该ID为advcf456yhn8,那么您需要编写以下命令:

git reset --hard advcf456yhn8

这将撤销所有更改并恢复到特定提交 ID 的实际内容。

现在,您已创建了一个名为feature的分支,可以将其合并到develop中。只需执行git checkout develop,然后使用git merge feature命令合并feature分支即可。

此外,通过运行以下命令,您可以获取整个提交历史记录:

git reflog

1
不确定您是否知道,但您提供的示例ID无效;提交ID仅由十六进制数字(0-9和a-f)组成。此外,有一些更简单的命令可以完成此操作,而无需直接使用提交ID。我建议从两个分支中删除合并。 - Mark Adelsberger
我只是举了一个例子,没有别的意思。他提到他对git还很新,所以在我看来,给出一个基本的撤销更改的概述是一个更好的主意。 - Raza Mehdi
我曾经考虑过这样做。但是我担心主分支中的重置可能会改变新功能分支。 - Rafael P. Miranda

1

回退到之前的主分支提交的简单方法:

  1. 克隆你的主分支存储库
  2. 如果你在使用git的GUI界面,使用“还原”选项选择特定的提交ID
  3. 一旦还原完成,请提交并推送到主分支。

CMD命令:

  1. git clone master
  2. git reset --hard HEAD^
  3. git commit -m ""
  4. git push

涉及的提交是一个合并。尝试还原合并时会出现几个复杂情况,包括提供的命令不起作用。此外,即使没有合并,还原也不能返回到以前的提交;它只会将内容更新到以前的状态。 - Mark Adelsberger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接