4

好的,所以我搞砸了!我正在使用具有以下结构的存储库

                master
                  |
                  v
A--B--C--D--E--F--G
       \
        \
         H--I
            ^
            |
         feature

我在feature分支上工作,一旦完成,我就合并到master. 这导致了我必须手动修复的合并冲突……我认为我做得对。然而,今天,我的同事告诉我,我破坏了他们在F. 这些损坏的部分与我添加的内容无关——显然在解决冲突时我删除了一堆东西。

我怎样才能“恢复”回购,以便在保留我的同时恢复他们的更改?更糟糕的是,我已经删除了feature本地 repo 上的分支,并且它没有被推送到原点。这就是回购现在的样子

                   master
                     |
                     v
A--B--C--D--E--F--G--J

我努力了

git reset --hard HEAD~
git merge origin/master --no-ff

希望这能让我手动编辑合并的文件,但它总是自动拉最新的......

4

2 回答 2

4

不用担心。没有什么重要的东西丢失了,它是 git。

如果你合并了,你应该有一个合并提交(一个有两个父母的提交)。你确定历史是怎样的吗?用于git log --graph查看合并的结构。

由于您已经将合并发布到公共 repo 并且其他开发人员拥有它,我不建议使用硬重置和变基。

因此,您应该找到您的合并提交并执行git revert <sha1ofmerge> --mainline 1 --no-commit,它将修改您的本地文件以撤消您通过合并所做的所有更改。然后查看更改,git checkout <files>为您想要保留的内容做一些更改,只留下您需要做的更改,让其他开发人员更快乐。当刚git commit.

合并提交后,您可以通过 恢复您的分支git branch feature <sha1ofmerge>^2,这里的“^2”表示第二个父级,即当您将功能合并到主控时。

于 2013-06-11T19:07:58.323 回答
1

您可以执行git cherry-pick <SHA-F>并重新应用该提交中的更改。

如果受影响的文件跨越多个提交,您也可以这样做

git checkout <SHA> -- <filename>

然后,您可以创建一个提交来修复所有损坏的文件。

由于您已推送更改,因此重做合并不是一个好的选择。因为您想避免重写推送的历史记录。

于 2013-06-11T19:06:05.017 回答