使用pull而不是fetch - 不小心将远程主分支合并到本地分支

3
我刚刚执行了git pull而不是git fetch。我当时在一个本地分支上,我不想将其与origin/master合并。此外,我还有一些未提交的更改。
现在我的暂存区充满了来自origin/master的更改,我想要撤消这些更改,但如果我取消暂存,它们会混合在我的未暂存的未提交更改中。
那么我该如何解决这个问题呢?

并不是解决您问题的方法,但我有一个有用的提示:在进行任何稍微冒险的操作之前,请通过执行“git branch foo”来“检查点”您当前的状态。现在,无论发生什么事情,您都可以回到原来的地方。这个技巧再加上一个好的树形可视化工具,如gitg或gitx,使得我使用git轻松了10倍。 - Edward Falk
4个回答

3
我假设你的所有更改混乱是由于合并时的冲突。我建议您执行以下操作:
  1. 提交合并的更改(完成它)。你会得到一个暂时的提交(不要推送!!!)
  2. git stash 暂存未提交的更改,以防丢失。
  3. git log -3,这将显示您的合并提交以及前面的2个提交。在合并提交中,您将看到2个SHAS。一个是来自origin/master的最新提交,另一个是您分支上的最后一次提交。
  4. git reset --hard <SHA of YOUR last commit> 这将重置您的分支到合并之前,并摆脱您从master引入的所有提交/更改。
  5. git stash pop 将未提交的更改放回您的分支。
因为您的更改都在本地分支上,所以您可以修改历史记录,使事情回到您想要的状态,而不会出现任何问题。如果有任何已暂存的文件实际上需要,请使用 git reset -- <filenames> 取消暂存,然后按照上述步骤进行操作。

3
我认为你可能需要输入git merge --abort来中止当前的冲突解决过程,并尝试重建合并前的状态。
根据文档:
中止当前的冲突解决过程,并尝试重建合并前的状态。如果合并开始时存在未提交的工作区更改,则在某些情况下,git merge --abort将无法重建这些更改。因此建议在运行git merge之前始终提交或存储您的更改。
参考链接:http://git-scm.com/docs/git-merge

1
我使用TortoiseGit来管理我的git仓库,非常方便。以下是我会执行的步骤(使用TortoiseGit):
- 首先将您的更改存储到stash中(TortoiseGit->Stash),并适当命名,以便将所有未提交的更改保存到stash中。 - 其次,在您的repo上右键单击->TortoiseGit,“Show Log”,这将显示所有更改日志(假设您知道合并之前的位置-可能您已经完成了一些提交),找到它,并在该更改日志上右键单击,选择“reset to this commit”,在下一部分中选择“Hard Reset”,这将删除从所选提交到顶部的所有提交,并删除更改。 - 重新应用您的stash(右键单击,TortoiseGit->Stash),然后应用您之前保存的stash。

储藏操作不会保存合并所引起的更改吗? - brabec
@prasopes 您是正确的git stash也会存储已经暂存的文件。这就是为什么您实际上需要在暂存之前将它们提交,然后硬重置到您提交的版本。 - Schleis
好的,Stashing(入栈)将不会保存合并引起的更改。我假设没有冲突和已经解决冲突,否则 Stashing 应该可以保存未提交的修改。 否则,@Schleis 的说法是正确的,如果存在冲突并解决了,则提交合并。 - Ravi
另外,可能非常有帮助的另一件事是防止错误地将更改推送到错误的git存储库 -
  • 编辑./.git.config,
  • 查找您绝对不想推送到的远程存储库
  • 为要避免的每个远程存储库在末尾添加以下行。 推送= null pushurl = no_push
- Ravi

-1

您可以撤销合并步骤,这将追加一个新的提交,撤消合并时所做的所有文件更改。

$ git revert <merge_commit_hash>

如果你执行 $ git log --graph --oneline 命令,你需要查找类似于“Merge branch "foo" of "remote_x" blah blah”的提交。

当 OP 想要实际与主分支合并时,这将会导致问题。 - Schleis
为什么不呢?你可以再次执行完全相同的合并,如果你想要再次还原,也可以这样做。还原会安全地执行此操作,因为它会附加一个新的提交,你正在考虑重置。 - Bauhaus
1
不回滚是一条命令。为了不影响主分支更改,你现在需要执行另一个回滚操作,导致历史记录出现了回滚的混乱。此外,如果主分支上还有更多的更改,你现在必须解决这些更改的合并冲突... 而不是只合并你自己的更改,保持干净的合并状态。 - Schleis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接