我试图将 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 在这里的堆栈溢出知道答案。:)
谢谢,广
回答
谢谢沃尔特,是的,这就是发生的事情。
经过一番调查,我发现发生的事情有点复杂。事实证明。
- dev 从 master 分支,它拥有所有文件。
- 第三个分支,我们称之为“已清理”,从 dev 分支出来。
- 清理分支删除了所有文件。
- 清理的分支与 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.php
25b8a44... 是 view.php 的最后更新版本的提交。我试过cherry-pick
了,只是直截了当git checkout dev view.php
,但我发现明确地使用了提交 ID,它合并了更多的历史。(包括首先导致文件被删除的提交。) - 一旦所有删除的文件都回来了,快速检查
git diff dev --name-status | grep D
显示所有文件都被复制了。然后就像沃尔特说的修改提交git commit --amend
:)