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)
  • 通过运行初始步骤还原#1中的更改,并修改其他文件(同样,我不添加任何新文件),并添加新提交
    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