Git Merge - 不完整、丢失的文件和文件夹

标签 git file merge pull

我试图将一个开发分支 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 大师在堆栈溢出上知道答案。 :)

谢谢, 广


回答

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

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

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

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

谢谢!

如何修复

这就是我所做的,将之前删除的 dev 中的所有内容 merge 回 master。

  1. 得到所有被删除的文件/文件夹(在 dev 但不是在新 merge 的 master 上) git diff dev --name-status | grep D > deleted_files
  2. 所有文件和文件夹的输出列表 git log --name-status > file_history 将使用它来找出已删除文件的最后更新版本。
  3. 逐一检查已删除文件列表,在文件历史记录中找到最新版本并恢复它。示例:git checkout 25b8a44 view.php 25b8a44... 是 view.php 的最新更新版本的提交。我尝试了 cherry-pick 和直接的 git checkout dev view.php 但我发现明确使用提交 ID,它 merge 了更多的历史记录。 (包括导致文件首先被删除的提交。)
  4. 一旦所有删除的文件恢复正常,快速检查 git diff dev --name-status | grep D 显示所有文件都被复制过来。然后就像 Walter 说的那样 ammend commit git commit --amend :)

最佳答案

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

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

关于Git Merge - 不完整、丢失的文件和文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3472804/

相关文章:

java - 如果发生异常,使用 newBufferedReader 打开的文件是否会关闭?

python - 在python中将两个整数变量合并到一个 float 中

asp.net - asp.net 如何获取文件的最后修改时间?

javascript - Jquery 文件大小验证不起作用

python - 部署 python 应用程序以通过 venv 使用特定版本的 Python 的最佳实践

git - 如何知道 Git 标签是否已被移动?

google-apps-script - 在 Google Apps 脚本中取消合并

git - 将更改 origin/development 复制到 origin/master

git - 在 Visual Studio 2015 中同步时使用 rebase

windows - Windows下的git svn clone large repo : out of memory - not a large file issue