从旧版本开始创建Git分支并回滚当前分支

5

我对Git不是很熟悉,但在我们的某个代码库中,我犯了一个错误。

我提交并推送了更改到名为“core”的分支。但后来我意识到我的更改不应该在那里 - 我应该在几次修订之前创建一个新的分支,比如说,“core-experimental”。

简单说明一下,我有:

A---B---C---D---E     "core"

但现在我想把它改为
A---B              "core"
    \
     C---D---E     "core-experimental"

目前我的团队中没有其他人拉取了我的更改,所以我进行的任何还原操作都不应该对任何人造成麻烦。

Git是否支持这个操作?

3个回答

9
其他两个答案都可以正常工作,但您实际上可以避免在工作树中做任何事情:
# create core-experimental using core as starting point
git branch core-experimental core
# move core
git branch -f core <SHA1 of B>

这样,即使您的工作树中有本地修改,也可以进行操作,而不需要在检出/重置期间更新大量时间戳,这将导致您必须重新构建(假设这是一个编译项目)。


不错,这是一种能够提升我的 Git 技能的小技巧。 - Benjol
我正在使用Ruby/Python/非编译的东西,所以我在文件时间戳方面比较随意;这个建议更好。 - Adam Vandenberg
@Adam:是的,我从来不确定。有时候reset --hard是免费的,有时在一个大型编译项目中,重置/检出需要20秒,并强制进行10分钟的编译。另一个区别是,reset会在reflogs中放入“<commit>:updating HEAD”,而branch -f会放入“branch: Reset to <commit>”。 - Cascabel

6
git checkout core
git branch core-experimental
git reset --hard <SHA of B>
git push -f <remote> core

更加详细地说...

  1. 检出核心代码
  2. 在核心代码的HEAD创建实验性分支
  3. 将核心代码的HEAD重置到所需位置
  4. 强制推送更新后的核心代码

这个很好地运作了,即使核心被推到了远程仓库(而提问者没有)。 - William Denniss

1

在核心中:

git branch core-experimental
git reset --hard <revision-B>

然后:

git push -f

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