git在不丢失其历史记录的情况下还原/隐藏更改
这是我的要求: 我有git在不丢失其历史记录的情况下还原/隐藏更改,git,github,git-checkout,git-stash,Git,Github,Git Checkout,Git Stash,这是我的要求: 我有a->b->c(头部)。 我正在添加一个新的提交d。现在,它变成了a->b->c->d(头部) 现在,我想返回到c(也就是说,撤消在d中所做的所有更改),并进行额外的更改并形成e。树应该看起来像a->b->c->d->e(HEAD)。注意:我不能丢失d历史记录。我必须将其还原并向e添加新的更改 更新: 我可以用一个更好的例子来解释。假设我有a->b->c(HEAD),这里c是主要的提交。我正试图用脚本实现自动化 初始步骤:我从git checkout开始,树看起来像:a->b
a->b->c(头部)
。
我正在添加一个新的提交d
。现在,它变成了a->b->c->d(头部)
现在,我想返回到c
(也就是说,撤消在d
中所做的所有更改),并进行额外的更改并形成e
。树应该看起来像a->b->c->d->e(HEAD)
。注意:我不能丢失d
历史记录。我必须将其还原并向e
添加新的更改
更新:
我可以用一个更好的例子来解释。假设我有a->b->c(HEAD)
,这里c
是主要的提交。我正试图用脚本实现自动化
初始步骤:我从git checkout
开始,树看起来像:a->b->c(分离的头部)
我真正的查询从这里开始:
d
。所以树应该是这样的:a->b->c->d(HEAD)
e
。所以树应该是这样的:a->b->c->d->e(HEAD)
e
=恢复提交d
+对c
的新更改。我不能盲目使用git revert HEAD
,因为c
被认为是主要提交。我在想我可以使用git stash
和git stash pop
删除旧的更改并插入新的更改。我可以做一些类似于git checkout stash的事情吗
简而言之:我正在尝试模糊测试提交c
大约50次(即提交和恢复50次)怎么样
首先提交对d所做的更改
$ git commit -d "Your message"
然后在c上创建新的分支e并签出如下内容
$ git checkout -b e c
那怎么办
首先提交对d所做的更改
$ git commit -d "Your message"
然后在c上创建新的分支e并签出如下内容
$ git checkout -b e c
git revert命令的作用正是您所希望的——它在当前分支的顶部创建了一个新的更改,该更改会反转一些先前的更改。就你而言
git revert HEAD
将在
HEAD
上创建一个新的更改(您的e
),该更改将反转HEAD
(d
)中更改的内容。git revert
命令完全按照您所需的方式执行操作-git revert
命令将在当前分支的顶部创建一个新的更改,以反转某些先前的更改。就你而言
git revert HEAD
将在
头
上创建一个新的更改(您的e
),该更改将反转头
(d
)中更改的内容,如果您还想对还原提交进行其他更改,请执行以下操作:
这将还原头中的更改,但不会创建提交,因此您可以进行其他更改并在完成后提交。如果您还想将其他更改放入还原提交,请执行以下操作:
这将还原头中的更改,但不会创建提交,因此您可以进行其他更改并在完成后提交。那么当您执行
git revert HEAD
时会发生什么情况?@Makoto:it(git revert HEAD^
)将c
中的更改作为新提交进行还原。他想让git回复头部@chrisddod:Fair point。我通常把这些弄混了。在我的辩护中,我不经常使用revert
…那么当你使用git revert HEAD
时会发生什么呢?@Makoto:it(git revert HEAD^
)将c
中的更改还原为新的提交。他想让git回复头部@chrisddod:Fair point。我通常把这些弄混了。在我的辩护中,我不经常使用revert
,这将创建一个撤销更改的提交。我需要向提交e
添加新的更改。也就是说,e
有新的更改+还原的代码如果需要向提交添加更改,请使用git commit--amend
。如果需要将最后两次提交合并为一次提交,请使用git rebase-i HEAD~2
这将创建一次提交,以撤消更改。我需要向提交e
添加新的更改。也就是说,e
有新的更改+还原的代码如果需要向提交添加更改,请使用git commit--amend
。如果需要将最后两次提交合并为一次提交,那么使用git-rebase-i HEAD~2
似乎可以。但这将导致处理许多分支机构。我用一个例子更新了这个问题,另一个选项是git-stash
,而不是commit。注意:-这将创建一个更改堆栈,意味着它将保留历史记录,但您不能直接在历史记录之间切换。您可以一个接一个地进入历史记录stash pop
,看起来这样做很有效。但这将导致处理许多分支机构。我已经用一个例子更新了这个问题,另一个选项将是git-stash
而不是commit它将注意:-这将创建一个更改堆栈,意味着它将保留历史记录,但您不能直接在历史记录之间切换您可以一个接一个地进入历史记录stash pop