我有一堆独立的分支,我想合并它们,因为它们中的每一个都是对程序不同部分的更新。
我想我应该合并它们,但是我在检查每个分支后运行git commit -a
。
然后我意识到整个程序都回到过去了,所以我运行了git reset --soft HEAD
(我在一篇文章中读到了这应该有帮助),但是没有做任何事情。
我也从git那里得到了关于手动删除一些./git/index.lock
的消息,所以我把它移到./git/backup_of_index.lock
,但这似乎也没有做任何事情。
如何修复我的存储库并合并所有分支?
答案 0 :(得分:14)
这种情况下最重要的git命令是git reflog
。 reflog会跟踪每个特定分支头的所有更改,git reflog
命令会列出分支头的所有更改。及时回溯。
如果你可以使用reflog识别一个“好的”提交ID(并且它会在那里,某处),那么你就远远超过你现在的位置。如果有一个好的提交ID,abc123
,那么命令:
git checkout -b rescue abc123
在提交ID rescue
处创建一个名为abc123
的新分支。
当我学习git时,我有类似的“我到底在哪里,我是怎么来到这里的?”时刻。我在different Stack Overflow question上了解了有关reflog的信息,了解Git是最有价值的事情。
答案 1 :(得分:4)
除非你已经攻击了.git
目录中的数据,否则你不可能丢失任何东西。你可能有一个可怕的混乱清理,可能需要做很多工作,你做了什么,它在哪里,但你可能没有丢失任何东西。
这是个好消息。
坏消息是任何人都很难帮助你。
您可能需要识别所有分支,并向后跟踪每个分支的提交。您需要确定所有这些“git commit -a
”操作是否是个好主意。这听起来不太可能 - 所以你可能需要正确地进行合并,从每个分支的下一次到最后一次提交工作。
您还需要确定您真正想要做的事情。
听起来你想要将一些分支 - 称为BranchA,BranchB和BranchC - 合并到主分支master上。但目前尚不清楚你的尝试是什么。
鉴于事情很糟糕,我建议创建另一个我们可以称之为“Fixup”的分支。从主分支的头部创建。然后,将BranchA,BranchB和BranchC中的每个的适当版本合并到Fixup分支中。在每个阶段,检查代码是否实际正常工作 - 通过其测试套件等。在Fixup分支上单独检查每个合并。
如果您对Fixup分支正确感到满意,请切换回主分支并将Fixup分支合并到master。
Charles Bailey提出了一个非常明智的建议(在对问题的评论中):在你做任何其他事情之前,制作一份你所拥有的备份副本,就像现在一样。然后才进行任何清理操作。他建议获得互动帮助也是明智的。
答案 2 :(得分:1)
错误:
当您的代码意味着什么时,您不应该玩不熟悉的领域。如果你想这样做,至少要有一个后备计划。
灾难恢复似乎只对那些最需要它的人来说很重要,但那时为时已晚。
我都是为了实验,但我讨厌看到这种情况,我觉得开发人员不好,因为我知道他的鞋子太好了,但是一旦你永远不会忘记它,你会学到这个错误。
在你决定玩之前,把你的代码扔到其他地方,这样当你击中风扇时你就可以回到你的舒适区继续作为一个快乐的开发者工作,并在你开始工作后回去玩完成。
答案 3 :(得分:1)
关于Git的一个很棒的事情是,您可以轻松复制整个工作存储库。这允许您在实验分支和合并时保留备份副本。
我建议的解决当前问题的方法:
此外,我希望您使用 gitk (或类似)来查看更改的效果 - 它可以真正帮助您可视化不同的代码行以及它们的相关方式。< / p>
gitk --all ## show me all the branches