git revert / stash更改而不会丢失其历史记录

时间:2017-10-18 04:10:48

标签: git github git-checkout git-stash

这是我的要求: 我有a -> b -> c (HEAD)。 我正在添加一个新的提交d。现在,它变为a -> b -> c -> d(HEAD)

现在,我想恢复为c(即撤消d中所做的所有更改)并进行其他更改并形成e。树应该看起来像a -> b-> c -> d -> e(HEAD)。注意:我不能丢失d历史记录。我必须将其还原并向e添加新的更改。

更新 我可以用一个更好的例子来解释。假设我有a->b->c(HEAD),这里c是主提交或主提交。 我正在尝试使用脚本进行自动化。

初始步骤:我从git checkout <SHA1 of c>开始,树看起来像:a->b->c(DETACHED HEAD)

我的真实查询从此处开始:

  1. 修改几个文件(我不添加任何新文件)并添加新的提交d。所以树应该看起来像:a->b->c->d(HEAD)
  2. 通过运行初始步骤修改其他文件(再次,我不添加任何新文件)来<还原#1 中的更改并添加新的提交e。所以树应该看起来像:a->b->c->d->e(HEAD)
  3. 注意:此处e =还原提交d +对c的新更改。我不能盲目地使用git revert HEAD,因为c被认为是主要提交。我以为我可以使用git stashgit stash pop删除旧更改并插入新更改。我可以做git checkout stash之类的事情吗?

    简而言之:我正在尝试模糊测试提交c大约50次(即)提交并恢复50次

3 个答案:

答案 0 :(得分:3)

git revert命令正好按照您的描述进行操作 - 它会在当前分支的顶部创建一个新的更改,以反转某些预先更改。在你的情况下

git revert HEAD

将在e之上创建一个新的更改(HEAD),以反转HEADd

中更改的内容

答案 1 :(得分:0)

怎么样?

首次提交对d

的更改
$ git commit -d "Your message"

然后在c上创建新分支e并结帐

之类的东西
 $ git checkout -b e c

答案 2 :(得分:0)

如果您想对还原提交进行其他更改,use -n flag in revert command

git revert -n HEAD

这将恢复HEAD中的更改但不会创建提交,因此您可以在完成后进行其他更改并提交。