Git更改分支,但不要更改工作区中的文件
这与我的另一个问题类似(切换到另一个分支而不更改工作区文件),但在那里工作的解决方案现在不起作用。
我需要删除一些很久以前推送给远程主服务器的更改。 所以我不想删除master的提交,但是我想改变这些文件,就像这些修改被恢复一样。 所以我这样做了:
git branch limits
git checkout limits
git rebase --interactive <commit before the ones I wanted to remove>
所以现在有limits
我有代码,我喜欢它在主人。 我如何“移动”它来掌握? 通过limits
的代码,我想更改为master
分支,但不更改工作区中的任何文件,因此我可以将这些更改作为新的更改提交给master
。
而不是使用交互式底座,你可以恢复每个你不想要的提交。 当你使用git revert <object-name-of-commit>
,git会引入一个新的提交,它将你名字引入的变化作为回退。 所以,假设你想要删除的提交是abc123
和def456
,你可以这样做:
git checkout master
git revert abc123
git revert def456
但是,如果找到这些提交有很多工作要做,并且您对limits
的提示感到满意,那么您可以在master
上创建一个包含树状态的新提交。 首先,确保git status
是干净的,因为你要使用git reset --hard
,并且这会消除无法改变的变化:
git checkout master
git reset --hard limits
git reset --soft HEAD@{1}
git commit -m "Reverting unwanted commits"
这个配方是这个问题中的一个变体:
你提到的问题的答案是:
$ 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
:-)
我会回到master并且git-revert
每一个你不想申请的提交。 这会为每个人创建一个“不应用”提交 - 所以没有历史记录更改,但是您可以获得所需的效果。