我在主分支上,我跑了git checkout -b ui
。在一周的时间里完成了大量的工作,最后我跑了:
git add .
git commit -am 'ui'
git checkout master
git merge ui
git push
然后我切换到我以前工作的分支 - git checkout uploads
- 此时我在ui分支中所做的每件事都丢失了。它没有列在git log
中,git reset --hard HEAD^
将我带回'ui'分支之前的分支。这是怎么发生的?
通过查看reflog并恢复到'ui'提交,我能够恢复大部分内容,但我想知道是什么导致这种情况发生?
答案 0 :(得分:7)
它没有丢失,只是当你在git中切换分支时(使用git checkout
),你的工作树被完全改变为在该分支上有文件。如果您运行:
git branch
...您应该看到所有列出的master
,ui
和uploads
。
如果要查看ui
分支的日志,则应运行:
git log ui
在合并git reset --hard HEAD^
之前master
将您移回ui
上的提交的原因是您的合并提交(其中master
所在的位置)有两个父项:
master
ui
当您向提交名称添加单个^
时,会将您带回第一个父级 - 要引用第二个父级,您将使用HEAD^2
。但是,我想你真的不想在这里做git reset --hard
来改变master
的位置。 (无论如何,这是一个应谨慎使用的命令,因为它会丢弃未提交的更改。)
无论如何,您在ui
分支上所做的所有更改现已合并到master
,因此,如果您对在此处所执行的操作感到满意,则无需担心{ {1}}分支了。 Greg Hewgill的答案表明,如果您现在想要的是确保您的ui
分支包含所有工作,那么可以采取一些行动方案。
答案 1 :(得分:3)
您描述的所有内容都符合预期。当您切换到ui
分支时,您对uploads
分支上的工作没有出现感到惊讶。这是有道理的,因为ui
工作在您创建uploads
时不存在。你可以在这里采取两种方法:
master
合并到uploads
:git merge master
uploads
重新投放到master
:git rebase master
这两个命令都将在uploads
分支上运行。