开发人员正在对两个文件进行小的更改。但在这次提交期间,他发生了合并冲突,删除了很多东西(可能没有最新的版本)。然后它被推送到共享仓库,其他一些开发人员做了其他一些提交。
现在,我们注意到,合并删除了重要文件,我们希望将其还原 如何在不丢失下一次提交的更改的情况下执行此操作?
我试图git revert commitsha
,但它没有带来改变。我需要还原mergesha
吗?我该如何确定?
答案 0 :(得分:27)
一般:
git revert --mainline 1 dd8cbe3e4
其中:
dd8cbe3e4
是要撤消的错误合并提交,--mainline
告诉您要恢复的多个先前提交中的哪一个(请记住,合并提交有多个父提交,您只能保留其中一个提交)。
1
含义的好解释,但我的猜测是1,2,3...
对应于dd8cbe3e4
之前的提交映射列表,排序依据升序时间顺序(最早的 - 通常是你想要恢复的)。来源:
http://thezencoder.com/2013/09/05/how-to-correctly-revert-a-bad-merge-in-git/
答案 1 :(得分:8)
简而言之,警告:除了实际重置 之外,没有真正的安全撤消合并的方式合并之前提交的分支。
让我现在解释和浏览现有的参考资料。
从How do you revert a faulty git merge commit
引用链接的答案基本上,还原合并会撤消数据更改,但不会撤消历史记录(图表)更改。因此,预计恢复错误的合并无效。
当然,重置分支将是最简单的方法,但如果合并的结果已被推送到共享仓库(因为您有效地重写了已发布的历史记录),则它有缺点。
以下是细分
git merge <someref>
合并(解决冲突后可选择提交)如果你发现马上你想在合并之前将分支重置为:
git reset HEAD@{1}
# optionally pass --hard to reset the working tree too
如果你以后才发现,
每次使用reflog来查找合并前的点。 (HEAD@{1}
是当前头部引用的先前值的缩写,但是reflog会跟踪头部引用的有限历史值。
git reflog
重置分支
git reset HEAD@{n} # substitute reflog entry index
可选择rebase / cherry-选择合并后提交的提交
git cherry-pick HEAD@{1} # just an example. interactive tools will make this easier
答案 2 :(得分:6)
另一种(更安全的)方法是在文件的最后一个版本和当前版本之间创建差异,然后通过复制和粘贴来恢复丢失的部分。
这总是有效,不需要任何奇怪的命令行选项,并且它不会篡改你应该单独留下的东西: - )
例如,Eclipse拥有很好的工具来挑选每个个体差异并将其复制到任一版本。只需使用“比较”菜单并排打开两个版本。答案 3 :(得分:0)
简而言之,您可以git reset --soft <commit>
其中commit可以是HEAD^
(previous),HEAD~2
(current-2),SHA等等。
使用--soft所有更改都可以提交,因此您可以实际更改提交。随着 - 硬,变化将全部丢失。
更改提交后,您必须强制将更改推送到共享仓库git push --force
。
请注意,您需要告诉其他开发人员他们应该将他们的回购重新绑定到共享仓库。 (使用git pull --rebase
)。他们可能会遇到一些合并冲突......请记住这一点。