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

amo*_*fis 4 git branch git-branch

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

我需要删除一些很久以前推送到远程主服务器的更改.所以我不想删除master中的提交,但我想更改文件就像这些更改被还原一样.所以我这样做了:

  1. 在掌握时, git branch limits
  2. git checkout limits
  3. git rebase --interactive <commit before the ones I wanted to remove>
  4. 在交互式控制台中,我删除了我想要还原的更改提交

所以现在limits我已经拥有了像我想要的那样的代码.我如何"移动"它掌握?使用limits我希望更改为master分支的代码,但不更改工作空间中的任何文件,因此我可以将更改作为新更改提交到master.

ver*_*nzt 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
Run Code Online (Sandbox Code Playgroud)

这将使您的工作树和索引与您limits签出时完全一样,但您将master在其原始位置的分支上.


但是,执行此类操作的正确方法是对git revert要尝试撤消的每个更改.


Mar*_*air 5

您可以只恢复您不想要的每个提交,而不是使用交互式rebase.当你使用时git revert <object-name-of-commit>,git将引入一个新的提交来支持你所命名的那个引入的更改.因此,假设你要删除的提交是abc123def456,你可以做:

git checkout master
git revert abc123
git revert def456
Run Code Online (Sandbox Code Playgroud)

但是,如果找到这些提交需要做很多工作,并且您对提示感到满意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"
Run Code Online (Sandbox Code Playgroud)

该食谱是这个问题中的一个变体: