【发布时间】: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,是的,事情就是这样。
在做了一些调查后,我发现发生的事情有点复杂。原来如此。
- dev 从 master 分支,它拥有所有文件。
- 第三个分支,我们称之为“已清理”,从 dev 分支出来。
- cleaned 分支删除了所有文件。
- 已清理的分支与 master 合并(或什么?)。此时文件已从 master 中删除。 '清理'的分支消失了。
- 在 dev 上,文件仍然存在,我继续添加到这个分支,编辑文件很长一段时间。
- dev 与 master 合并,之前被 clean 删除的所有文件都不见了。
希望这对除了我之外的其他人有所帮助,他们学习了很多关于如何使用 git log、git show、git reflog 尝试调试发生的事情。
谢谢!
如何修复
这就是我将 dev 中之前删除的所有内容合并回 master 的方法。
- 获取所有已删除的文件/文件夹(在 dev 上,但不在新合并的 master 上)
git diff dev --name-status | grep D > deleted_files - 所有文件和文件夹的输出列表
git log --name-status > file_history将使用它来找出已删除文件的最后更新版本。 - 一一浏览deleted_files列表,在file_history中找到最新版本并恢复。示例:
git checkout 25b8a44 view.php25b8a44... 是 view.php 的最后更新版本的提交。我试过cherry-pick和直接git checkout dev view.php但我发现明确使用提交ID,它合并了更多的历史。 (包括导致文件首先被删除的提交。) - 一旦所有删除的文件都恢复了,快速检查
git diff dev --name-status | grep D显示所有文件都已复制。然后就像 Walter 说的那样,修改提交git commit --amend:)
【问题讨论】:
-
您实际上可以使用
cat deleted_files | awk '{ print $2 }' | xargs -I haha git checkout develop haha,这样更快。感谢您的回答! -
请将您的答案移到答案帖中。