在git合并期间,如果我“放弃更改”,为什么文件被删除?

时间:2013-07-03 15:58:36

标签: git git-merge

我在项目回购中将同事的分支与master分支合并。当我fetched他的更改并尝试merge他们进入主分支时,我遇到了一些冲突,所以我运行了git mergetool来解决它们。

完成merge后,我正在查看GitHub GUI应用程序中的更改。从我同事的分支合并的所有文件都标记为“新”,即使它们根本不是新文件。如果我右键单击任何文件并单击“放弃更改”,如果我提交merge,它将从存储库中删除该文件。我确信有合理的解释。如果我“放弃更改”,为什么要删除文件?为什么在合并期间文件被标记为“新”,即使它们已经存在了很长时间?

1 个答案:

答案 0 :(得分:0)

不确定这是你遇到的问题,但听起来像是这样。 Git不跟踪文件,但跟踪其内容。例如,如果您移动文件。使用git status,您会看到文件已被删除,并且有一个新的未跟踪文件。

如果您将两个更改添加到提交,git将检查其内容并假定该文件已重命名。这很好。您甚至可以复制文件并添加它,它会将其标记为副本,因为内容是相同的。每个文件将在内部指向相同的Object。这意味着副本或移动的文件将继承历史记录。

现在让我们说,在提交期间,您删除了一个提交的文件,并在合并期间将其添加回来。 (这可能是丢弃变更时发生的事情)。 Git会看到该文件已被删除,然后创建了一个新文件。由于该文件在先前的提交中不存在,因此将其标记为新的,这是完全正确的。

其他可能的原因是新文件有100%的更改。我不能肯定地说,但如果它发生了。如果git认为该文件已被新文件替换,我不会感到惊讶。

另外,我建议对标记为新的文件进行git blame。这将使您对文件的名称进行更改。如果在每一行上,只有一个人和一个日期。这可能意味着该文件确实是新的,并且github不会错误地将该文件标记为新文件。如果有变化,那么github会出现问题。

修改

如果不迟到,我会考虑重做合并。如果没有任何新内容被推送到合并树,那么修复它将不是一件可怕的事情。执行合并时,请确保将所有更改添加到更改集。在合并期间,冲突的文件将不会添加到暂存区域。我不能说mergetool会自动将合并文件添加到暂存。在任何情况下,对所有这些文件执行git add {file}。如果文件已存在,则不会更改任何内容。一旦你确定一切都是正确的。推它。您可能有一个错误,您正试图推送将覆盖提交的非快速提交。如果不起作用,请尝试使用“git push -f”。它应该工作。