Git:合并冲突腐败后如何恢复

时间:2014-03-21 17:11:11

标签: git merge

好的,作为20年的SVN和CVS专家,我发现git非常具有挑战性。我已经阅读了很多指南,没有找到可以理解的指南。很多道歉因为我对git的愚蠢。

我们只使用master,没有分支。 Git被逼到了我们身上。

我有一个js文件,我自己"没有其他人应该接触它。但有人做了,并检查了它。我试图检查我的副本,并失败。所以我拉出了更新版本,其中#34;腐败"我的副本有很多<<<和>>>条目。

基本上,我想拒绝他所有的改变,并用我的改写覆盖它们。使用SVN,我只需复制我的本地js文件,删除它,从repo结账以获取有问题的文件,复制我的副本,然后检查结果。真的很简单。

我还没有找到一种方法在git中执行此操作,就像删除文件一样,它认为您要删除它。

所以我尝试编辑合并的文件,但混淆了哪些行是新的,哪些是旧的。所以现在该文件无法使用。我已经失去了#34;我的本地副本。

我读到了这个:" git push origin master --force"但是:

  1. 为时已晚,我已经丢失了我的版本。
  2. 我读了另一篇帖子,上面写着从不这样做,因为它打破了人们的拉扯,但他们没有提供另一种选择"正确的"方式拒绝某人签到,并用你自己的文件替换一个文件。
  3. 所以我假设我必须回到之前的本地提交来恢复那个文件。我能找到的唯一方法就是" git checkout [revision]。"。但是,如果我这样做,我就不再是大师了,也不知道怎么回事。此外,我希望它不会让我,因为我编辑并保存了问题文件,所以它不会让我结帐前一个。版。我假设我必须提交损坏的文件,然后尝试返回两次提交,备份文件,然后再次在新的目录checkout master中,覆盖文件,然后检查它。

    所以我有两个问题:

    1. 如何取回我的档案。
    2. 一旦我收回了它,我如何覆盖其他人用我自己检查的文件,而不影响他们检查的其他内容&推?

3 个答案:

答案 0 :(得分:17)

你的两个问题可以用同样的方式解决:

git checkout HEAD my/filename.js

其中HEAD是文字(当前分支名称的git简写),my / filename.js应替换为文件的实际文件名。这会将您的文件恢复到更新前的状态,从而有效地“撤消”来自其他人的更改。在本地提交此结果,然后正常推送(如果您从中央仓库更新,则不需要--force)

通常,解决合并冲突的方法是编辑文件,直到它按照您希望的方式运行,然后运行git add。 git(和svn)之所以留下“<<<<<和“>>>”合并或更新失败后,您的文件中的结果是帮助您或您的工具解决合并问题。设置一个工具来帮助你做到这一点可能是值得的,但遗憾的是它不是开箱即用的。

顺便说一下,你从SVN用你已知的好文件替换不需要的文件的初始本能可以正常工作一步:删除文件后,恢复好文件并运行git add my / filename.js。在这种情况下,checkout还会将它添加到索引中(使用git状态进行双重检查),这样您就可以立即提交(本地),然后将(现在已解决的)合并冲突推回到中央存储库。

答案 1 :(得分:5)

你可能只想恢复其他人的提交。如果您有未提交的本地更改,那么使用git非常重要。如果你这样做,你可以以非常难以退出的合并结束。

git merge --abort

将通过将其他更改添加到您的代码中来中止您已启动的合并。这个可以恢复您在开始拉动之前所做的更改中未经检查的内容。如果您对文件进行了大量更改,请在其他地方进行备份,如果不起作用,请在之后手动合并。

运行

git log --stat

找到更改文件的提交。运行

git revert <commit id>

然后提交更改文件的id。这将进行提交,以回滚其他人的提交,推动该更改。如果其他人在提交中有其他内容,那么他​​们可以通过恢复您的恢复并编辑提交以删除文件中的更改然后再次推送更改来重新修改补丁。

将来,当你拉动时,永远不会有未经检查的变化,这会带来麻烦。

您还可以考虑在服务器上设置一个提交挂钩,以阻止除您以后提交该文件以外的其他人。

答案 2 :(得分:3)

要完全删除合并冲突中的外部更改,您可以使用

git checkout --ours -- <path-to-file> && git add <path-to-file>

这解决了使用您的版本与特定文件的冲突。添加是告诉git冲突得到解决的必要条件。

相关问题