5

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

我需要删除一些很久以前推送到远程主机的更改。所以我不想从 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.

4

4 回答 4

6

您提出的问题的答案是:

$ 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您尝试撤消的每个更改。

于 2012-07-13T15:40:12.173 回答
5

与其使用交互式变基,您可以只还原您不想要的每个提交。当您使用 时git revert <object-name-of-commit>,git 将引入一个新的提交,以撤销您命名的那个引入的更改。因此,假设您要删除的提交是abc123and 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"

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

于 2012-07-13T15:42:45.343 回答
1

这要求revert:-)

我会回到 master 和git-revert你想要取消应用的每个提交。这会为每个创建一个“未应用”的提交——所以历史不会改变,但你会得到你想要的效果。

于 2012-07-13T15:43:11.677 回答
0

移动分支指针

如果您实际尝试做的是在复杂的变基或合并到单独的分支之后将分支指针移动到 master ,您可以通过多种方式做到这一点。例如,要强制移动某个临时分支以使其成为新的主分支,您可以执行以下操作之一:

# 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 视为一个反向补丁(从根本上说,它是在幕后),您可以看到可能出现潜在冲突的地方。

您的里程肯定会有所不同。

于 2012-07-13T15:33:59.840 回答