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

Qua*_*Van 37 git merge pull file

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

git checkout master    
git pull . dev
Run Code Online (Sandbox Code Playgroud)

一切似乎进展顺利,虽然有冲突我修复了这些并承诺.但是,当我检查这个新合并的工作树时,从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
Run Code Online (Sandbox Code Playgroud)

生产:

D       folders/lm.gif
D       folders/lmh.gif
...
Run Code Online (Sandbox Code Playgroud)

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

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

git merge dev    
Already up-to-date.
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

谢谢,Quang


回答

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

在做了一些调查之后,我发现发生的事情有点复杂.结果表明.

  1. dev从master分支,它拥有所有文件.
  2. 第三个分支,我们称之为"已清理",分支开发.
  3. clean branch删除了所有文件.
  4. 清理分支合并(或东西?)与主人.此时文件已从master中删除.'清洁'分支消失了.
  5. 在开发,文件仍然存在,我继续添加到这个分支,编辑文件很长一段时间.
  6. dev与master合并,之前删除的所有文件都已消失.

希望这能帮助除了我以外的人,他们学到了很多关于如何使用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.php25b8a44 ...是view.php的最新更新版本的提交.我试过cherry-pick并且只是直接git checkout dev view.php但我发现显式使用提交ID,它合并了更多的历史.(包括首先导致文件被删除的提交.)
  4. 删除所有已删除的文件后,快速检查会git diff dev --name-status | grep D显示所有文件都已复制完毕.然后就像沃尔特说的那样提交git commit --amend:)

Wal*_*ndt 20

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

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