I was trying to merge a dev branch into master.
git checkout master
git pull . dev
Everything seemed to go well, although there were conflicts I fixed these and commited. But when I checked this newly merged working tree is missing a lot of folders and files from 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
Produces:
D folders/lm.gif
D folders/lmh.gif
...
So the files/folders that didn't show up on 'git status'. It also didn't show up at the end when I fixed the merged conflicts.
Also when I try to merge again it says:
git merge dev
Already up-to-date.
Yet the master branch clearly is missing files/folders from the dev branch. Why is that? Shouldn't that folder and all it's contents be added? 'folders' is being tracked on the dev branch, so shouldn't it have gotten pulled over when I did the merge?
When there was a merge conflict earlier did git stop the merge process and skipped a bunch of files/folders?
The dev branch had quite a lot of changes, could I have messed something up with git in the past that now certain files/folders wouldn't have merged?
(When I first created the dev branch I didn't know what I was doing and did crazy things like reset, reverts etc.)
Hoping one of you git guru's here on stack overflow knows the answer. :)
Thanks,
Quang
Answer
Thanks Walter, Yes this is what happened.
After doing some investigating I found out it was a little complicated what happened. It turned out that.
- dev branched from master, it had all the files.
- A third branch, lets call it "cleaned", branched off of dev.
- cleaned branch deleted all the files.
- cleaned branch merged (or something?) with master. At this point the files were deleted off of master. And the 'cleaned' branch disappeared.
- on dev, the files are still there and I continued adding to this branch, editing files for quite some time.
- dev merged with master and all the files that was deleted previously by cleaned were gone.
Hope this helped someone besides me who learned quite a lot about how to use git log, git show, git reflog trying to debug what happened.
Thanks!
How to Fix
So this is what I did to merge all of the contents in dev that was previously deleted back onto master.
- Got all the files/folders that was deleted (on dev but not on the newly merged master)
git diff dev --name-status | grep D > deleted_files
- Output list of all files and folders
git log --name-status > file_history
Gonna be using this to figure out the last updated version of the deleted file.
- Go through the list of deleted_files one by one, find the the most updated version in file_history and restore it. Example:
git checkout 25b8a44 view.php
25b8a44... was the commit with the last updated version of view.php. I tried cherry-pick
and just a straight git checkout dev view.php
but i found explicitly using the commit id, it merge more of it's history. (Including the commit that cause the file to be deleted in the first place.)
- Once all the deleted files are back a quick check
git diff dev --name-status | grep D
shows that all files are copied over. Then like Walter said an ammend commit git commit --amend
:)
question from:
https://stackoverflow.com/questions/3472804/git-merge-incomplete-missing-files-and-folders 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…