【问题标题】:Git Merge - Incomplete, Missing files and FoldersGit Merge - 不完整,缺少文件和文件夹
【发布时间】:2011-03-29 05:15:08
【问题描述】:

我试图将 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 分支中的文件/文件夹。这是为什么?不应该添加该文件夹及其所有内容吗? 'folders' 正在 dev 分支上被跟踪,所以当我进行合并时它不应该被拉过来吗?

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

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

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

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

谢谢, 广


回答

谢谢 Walter,是的,事情就是这样。

在做了一些调查后,我发现发生的事情有点复杂。原来如此。

  1. dev 从 master 分支,它拥有所有文件。
  2. 第三个分支,我们称之为“已清理”,从 dev 分支出来。
  3. cleaned 分支删除了所有文件。
  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 显示所有文件都已复制。然后就像 Walter 说的那样,修改提交 git commit --amend :)

【问题讨论】:

  • 您实际上可以使用cat deleted_files | awk '{ print $2 }' | xargs -I haha git checkout develop haha,这样更快。感谢您的回答!
  • 请将您的答案移到答案帖中。

标签: git file merge pull


【解决方案1】:

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

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

【讨论】:

  • 是的,事情就是这样。在做了一些调查后,我发现发生的事情有点复杂。事实证明。看上面的解释。
  • 另一种解决方案是混合重置到分支中文件被删除之前的时间,然后合并,并强制推送新的历史记录。如果您提交了错误的合并,每个人都可能需要恢复到之前的提交并重新拉取。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-03
  • 2021-07-09
  • 2014-09-20
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多