43

我试图将 dev 分支合并到 master 中。

git checkout master    
git pull . dev

一切似乎都很顺利,尽管我修复了这些并提交了一些冲突。但是当我检查这个新合并的工作树时,缺少很多来自 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 分支中的文件/文件夹。这是为什么?不应该添加该文件夹及其所有内容吗?'文件夹'正在开发分支上被跟踪,所以当我进行合并时它不应该被拉过来吗?

当早些时候发生合并冲突时,git 是否停止了合并过程并跳过了一堆文件/文件夹?

dev 分支有很多变化,我过去是否可以用 git 搞砸现在某些文件/文件夹不会合并?

(当我第一次创建 dev 分支时,我不知道自己在做什么,并且做了一些疯狂的事情,比如重置、还原等。)

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

谢谢,广


回答

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

经过一番调查,我发现发生的事情有点复杂。事实证明。

  1. dev 从 master 分支,它拥有所有文件。
  2. 第三个分支,我们称之为“已清理”,从 dev 分支出来。
  3. 清理分支删除了所有文件。
  4. 清理的分支与 master 合并(或什么?)。此时文件已从 master 中删除。'清理'的分支消失了。
  5. 在 dev 上,文件仍然存在,我继续添加到这个分支,编辑文件很长一段时间。
  6. dev 与 master 合并,之前被 clean 删除的所有文件都消失了。

希望这对我以外的人有所帮助,他们了解了很多关于如何使用 git log、git show、git reflog 来尝试调试发生的事情。

谢谢!

怎么修

所以这就是我将 dev 中之前删除的所有内容合并回 master 的方法。

  1. 获取所有已删除的文件/文件夹(在 dev 上,但不在新合并的 master 上)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:)
4

1 回答 1

23

听起来 git 认为丢失的文件在 master 从 dev 分支到 pre-merge 头之间的某个时间点被删除了。这是我能想到的唯一原因,为什么 git 在合并期间会默默地删除跟踪的文件。

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

于 2010-08-12T23:54:23.347 回答