我试图将一个开发分支 merge 到主分支中。
git checkout master
git pull . dev
一切似乎都很顺利,尽管我解决了这些冲突并提交了冲突。但是当我检查这个新 merge 的工作树时,它缺少了很多来自 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”上的文件/文件夹。当我修复 merge 的冲突时,它也没有在最后出现。
此外,当我再次尝试 merge 时,它说:
git merge dev
Already up-to-date.
但是 master 分支显然缺少 dev 分支中的文件/文件夹。这是为什么?不应该添加该文件夹及其所有内容吗? “文件夹”在开发分支上被跟踪,所以当我进行 merge 时它不应该被 pull 过来吗?
当早些时候发生 merge 冲突时,git 会停止 merge 过程并跳过一堆文件/文件夹吗?
dev 分支有很多变化,是不是我过去用 git 搞砸了,现在某些文件/文件夹不会 merge ?
(当我第一次创建 dev 分支时,我不知道自己在做什么,做了一些疯狂的事情,比如重置、还原等)
希望你们中的一位 git 大师在堆栈溢出上知道答案。 :)
谢谢, 广
回答
谢谢沃尔特,是的,这就是发生的事情。
在做了一些调查之后,我发现发生的事情有点复杂。原来如此。
- dev 从 master 分支出来,它有所有的文件。
- 第三个分支,我们称之为“已清理”,从 dev 分支出来。
- cleaned 分支删除了所有文件。
- 已清理的分支与 master merge (或什么?)。此时文件已从 master 中删除。并且“清理过”的分支消失了。
- 在 dev 上,文件仍然存在,我继续添加到这个分支,编辑文件很长一段时间。
- dev 与 master merge ,之前被 cleaned 删除的所有文件都消失了。
希望这对除我以外的学习了很多关于如何使用 git log、git show、git reflog 尝试调试发生的事情的人有所帮助。
谢谢!
如何修复
这就是我所做的,将之前删除的 dev 中的所有内容 merge 回 master。
- 得到所有被删除的文件/文件夹(在 dev 但不是在新 merge 的 master 上)
git diff dev --name-status | grep D > deleted_files
- 所有文件和文件夹的输出列表
git log --name-status > file_history
将使用它来找出已删除文件的最后更新版本。 - 逐一检查已删除文件列表,在文件历史记录中找到最新版本并恢复它。示例:
git checkout 25b8a44 view.php
25b8a44... 是 view.php 的最新更新版本的提交。我尝试了cherry-pick
和直接的git checkout dev view.php
但我发现明确使用提交 ID,它 merge 了更多的历史记录。 (包括导致文件首先被删除的提交。) - 一旦所有删除的文件恢复正常,快速检查
git diff dev --name-status | grep D
显示所有文件都被复制过来。然后就像 Walter 说的那样 ammend commitgit commit --amend
:)
最佳答案
听起来 git 认为丢失的文件在它从 dev 分支到预 merge 头之间的某个点在 master 上被删除了。这是我能想到的唯一原因,为什么 git 会在 merge 期间悄悄地删除跟踪的文件。
不幸的是,我不知道解决这个问题的好方法。我可能只是手动从 dev 分支重新添加所有已删除的文件(或使用一些 bash 脚本),然后到 git commit --amend
修改 merge 提交到包括他们。
关于Git Merge - 不完整、丢失的文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472804/