Git更改分支,但不要更改工作区中的文件

Git change branch, but don't change files in workspace

这类似于我的另一个问题(切换到另一个分支而不更改工作区文件),但在那里工作的解决方案现在不起作用。

我需要删除一些更改,这些更改很久以前就被推到了远程主机上。所以我不想从master中删除提交,但我想更改文件,就像恢复这些更改一样。所以我这样做了:

  • 在master上时,git branch limits
  • 江户十一〔一〕号
  • 埃多克斯1〔2〕
  • 在交互式控制台中,我删除了提交,其中包含了我想要恢复的更改。
  • 所以现在在limits中,我有了代码,就像在master中一样。我怎样才能把它"移动"给大师?使用来自limits的代码,我希望更改为master分支,但不更改工作区中的任何文件,因此我可以将更改作为对master的新更改提交。


    您可以只恢复不需要的每一个提交,而不必使用交互式的REBASE。当您使用git revert 时,git将引入一个新的commit,它将取消由您所命名的commit所引入的更改。因此,假设您要删除的承诺是abc123def456,您可以这样做:

    1
    2
    3
    git checkout master
    git revert abc123
    git revert def456

    但是,如果查找这些提交是一项大量工作,并且您对EDOCX1的提示(0)感到满意,那么您可以在master上创建一个新的提交,其中包含树的状态。首先,确保git status是干净的,因为您要使用git reset --hard,这将清除未限制的更改:

    1
    2
    3
    4
    git checkout master
    git reset --hard limits
    git reset --soft HEAD@{1}
    git commit -m"Reverting unwanted commits"

    这个配方是这个问题的一个变种:

    • https://stackoverflow.com/a/1895095/223092


    你所提问题的答案是:

    1
    2
    3
    4
    5
    $ git checkout master             # switch to master branch

    $ git reset --hard limits         # hard-reset it to the limits commit
    $ git reset --soft master@{1}     # move the reference back to where it was, but
                                      #  don't modify the working tree or index

    这将使您的工作树和索引与您签出limits时的情况完全相同,但您将位于master分支的原始位置。

    然而,这样做的正确方法是对git revert,您试图撤消的每个更改。


    这要求revert—)

    我会回到大师和埃多克斯(11)那里,每一个你不喜欢的承诺。这会为每个人创建一个"未应用"的提交-所以历史记录不会改变,但您会得到想要的效果。


    移动分支指针

    如果您实际要做的是在一个复杂的钢筋网或合并到一个单独的分支之后移动master的分支指针,那么您可以用多种方法来实现这一点。例如,要强制移动某个临时分支以使其成为新的主分支,可以执行以下操作之一:

    1
    2
    3
    4
    5
    6
    7
    # Use git porcelain to move the branch over top of one that already
    # exists.
    git branch -M limits master

    # Explicitly move the branch pointer to wherever the head for limits
    # is pointing.
    git reset --hard refs/heads/limits

    还有一些方法可以执行各种管道命令,但这并不意味着是一个详尽的论述。它应该足以让你指向正确的方向。

    恢复承诺

    正如其他文章和评论正确指出的那样,如果您只想从master撤消目标提交,那么您可以使用git revert(1)。注意,这会在您的历史中留下最初的提交和恢复;这通常是您想要的。

    另外,请注意,git revert可能会导致冲突或您必须手动解决的不需要的更改,特别是如果您要还原的提交不是很小的原子更改。把git revert想象成一个反向补丁(从根本上说是,在引擎盖下),你可以看到潜在的冲突可能出现在哪里。

    你的里程数肯定会有所不同。