Git Merge -不完整,缺少文件和错误

bjg7j2ky  于 5个月前  发布在  Git
关注(0)|答案(2)|浏览(148)

我试图将一个开发分支合并到主分支中。

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中搞砸了一些事情,现在某些文件/文件夹不会合并?
(When我第一次创建开发分支时,我不知道自己在做什么,做了一些疯狂的事情,比如重置、恢复等。
希望你们中的一个git大师在这里对堆栈溢出知道答案。:)
谢了,阿光

回答

谢谢你,沃尔特,是的,这就是发生的事情。
经过调查,我发现事情有点复杂。原来。

  1. dev从master分支出来,它有所有的文件。
    1.第三个分支,我们称之为“cleaned”,从dev分支出来。
    1.清理分支删除了所有文件。
  2. cleaned分支与master合并(或其他东西?)。此时文件从master中删除。“cleaned”分支消失。
    1.在dev上,文件仍然在那里,我继续添加到这个分支,编辑文件相当长的一段时间。
  3. dev与master合并,所有以前被cleaned删除的文件都消失了。
    希望这对除了我之外的人有帮助,他们学到了很多关于如何使用git log,git show,git reflog来调试发生的事情。
    谢谢你,谢谢

如何修复

这就是我所做的,将dev中以前删除的所有内容合并回master。
1.得到了所有被删除的文件/文件夹(在dev上但不在新合并的master上)git diff dev --name-status | grep D > deleted_files
1.所有文件和文件夹的输出列表git log --name-status > file_history将使用此来找出已删除文件的最后更新版本。
1.逐一查看已删除的_files列表,在file_history中找到最新的版本并将其恢复。示例:git checkout 25b8a44 view.php 25 b8 a44.是view.php最后更新版本的提交。我尝试了cherry-pick和一个直接的git checkout dev view.php,但我发现显式地使用提交ID,它会合并更多的历史记录。(包括导致文件首先被删除的提交。)
1.一旦所有被删除的文件都回来了,快速检查git diff dev --name-status | grep D显示所有文件都被复制了。然后像沃尔特说的一个修正提交git commit --amend:)

xdnvmnnf

xdnvmnnf1#

听起来git认为丢失的文件是在master上从dev分支到pre-merge head之间的某个时间点被删除的。这是我能想到的git在合并过程中默默删除跟踪文件的唯一原因。
不幸的是,我不知道一个好的方法来解决这个问题,我可能只是手动重新添加所有从dev分支删除的文件(或者使用一点bash脚本),然后修改合并提交以包含它们。

7uhlpewt

7uhlpewt2#

为了避免这种情况-使用合并--no-ff选项(合并不带快进)。更多关于--no-ff标志的细节请点击https://betterdev.blog/turn-off-git-fast-forward-merge/https://hackr.io/blog/difference-between-git-merge-and-git-merge-no-ff
一般来说-快进合并适合合并简单的功能或bug修复,但如果分支单独开发了一段时间(例如,大功能或发布分支)-您需要避免它。
对于你的情况,它看起来像:

git fetch origin cleaned
git fetch origin dev
git fetch origin master

git checkout master
git merge --no-ff origin/cleaned

字符串
修复冲突并提交
在这个时刻,一些文件从master中删除(从cleaned中更改),但仍然存在于dev中(并且可能被修改)

git merge --no-ff dev


在这里,您将面临从master删除但再次从dev接收的文件的冲突,需要通过接受dev的更改来修复它们

commit changes and push


最终你会收到透明的历史记录,如果你在解决冲突时错过或丢失了一些东西-你可以使用包含3个提交合并信息的合并提交轻松恢复它。

相关问题