Git change branch, but don't change files in workspace
这类似于我的另一个问题(切换到另一个分支而不更改工作区文件),但在那里工作的解决方案现在不起作用。
我需要删除一些更改,这些更改很久以前就被推到了远程主机上。所以我不想从master中删除提交,但我想更改文件,就像恢复这些更改一样。所以我这样做了:
所以现在在
您可以只恢复不需要的每一个提交,而不必使用交互式的REBASE。当您使用
1 2 3 | git checkout master git revert abc123 git revert def456 |
但是,如果查找这些提交是一项大量工作,并且您对EDOCX1的提示(0)感到满意,那么您可以在
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 |
号
这将使您的工作树和索引与您签出
然而,这样做的正确方法是对
这要求
我会回到大师和埃多克斯(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想象成一个反向补丁(从根本上说是,在引擎盖下),你可以看到潜在的冲突可能出现在哪里。
你的里程数肯定会有所不同。