Git Merge - 不完整,缺少文件和文件夹

时间:2010-08-12 23:28:47

标签: git file merge pull

我试图将dev分支合并为master。

git checkout master    
git pull . dev

一切似乎进展顺利,虽然有冲突我修好了这些并且承诺了。但是当我检查这个新合并的工作树时,缺少来自开发的很多文件夹和文件。

git status  // Shows conflicts & doesn't list some files/folders.    
git commit -a 

Created commit 55ffdd1: Merge branch 'dev' into master  

git diff dev --name-status

产地:

D       folders/lm.gif
D       folders/lmh.gif
...

所以没有出现在'git status'上的文件/文件夹。当我修复合并的冲突时,它也没有出现在最后。

当我再次尝试合并时,它说:

git merge dev    
Already up-to-date.

然而,master分支显然缺少dev分支中的文件/文件夹。这是为什么?不应该添加该文件夹及其所有内容吗?在dev分支上正在跟踪'文件夹',所以当我合并时它不应该被拉过来吗?

当先前发生合并冲突时,git会停止合并过程并跳过一堆文件/文件夹吗?

开发分支有很多变化,过去我可以用git弄乱一些东西,现在某些文件/文件夹不会合并吗?

(当我第一次创建开发分支时,我不知道我在做什么,并且做了重置,恢复等疯狂的事情。)

希望你们中的一个git guru在这里堆栈溢出知道答案。 :)

谢谢, 广


答案

感谢沃尔特,是的,这就是发生的事。

在做了一些调查之后,我发现发生的事情有点复杂。事实证明。

  1. dev从master分支,它拥有所有文件。
  2. 第三个分支,我们称之为“已清理”,分支开发。
  3. clean branch删除了所有文件。
  4. 清理分支与master合并(或什么?)此时文件已从master中删除。并且'清洁'分支消失了。
  5. 在dev上,文件仍在那里,我继续添加到这个分支,编辑文件很长一段时间。
  6. dev与master合并,之前删除的所有文件都已删除。
  7. 希望这能帮助我以外的人,他们学到了很多关于如何使用git log,git show,git reflog试图调试发生的事情。

    谢谢!

    如何修复

    所以我这样做是为了将以前删除的dev中的所有内容合并到master中。

    1. 获取已删除的所有文件/文件夹(在开发时但不在新合并的主文件上)git diff dev --name-status | grep D > deleted_files
    2. 所有文件和文件夹的输出列表git log --name-status > file_history将使用此列表来确定已删除文件的最新更新版本。
    3. 逐个浏览deleted_files列表,在file_history中找到最新版本并恢复它。示例:git checkout 25b8a44 view.php 25b8a44 ...是view.php的最新更新版本的提交。我尝试了cherry-pick并且直接git checkout dev view.php但我发现显式使用了提交ID,它合并了更多的历史记录。 (包括首先导致文件被删除的提交。)
    4. 快速检查所有已删除的文件后git diff dev --name-status | grep D显示所有文件都已复制完毕。然后像沃尔特所说的那样提交了git commit --amend:)

1 个答案:

答案 0 :(得分:19)

听起来git认为丢失的文件在主服务器上从dev开始分支和合并前头部之间的某个时刻被删除了。这是我能想到为什么git会在合并期间默默地丢弃跟踪文件的唯一原因。

不幸的是,我不知道解决这个问题的好办法。我可能只是手动(或者使用一点bash脚本)从dev分支中重新添加所有已删除的文件,然后再到git commit --amend修改合并提交以包含它们。