我在主分公司,我跑了git checkout -b ui.在一周的时间内完成了大量的工作,最后我跑了:
git add .
git commit -am 'ui'
git checkout master
git merge ui
git push
Run Code Online (Sandbox Code Playgroud)
然后我切换到我以前工作过的一个分支git checkout uploads- 那时我在ui分支中所做的每件事都丢失了.它没有列在git log,并git reset --hard HEAD^带我回到'ui'分支之前的分支.这是怎么发生的?
通过查看reflog并恢复到'ui'提交,我能够恢复大部分内容,但我想知道是什么导致这种情况发生?
它没有丢失,只是当你在git(用git checkout)中切换分支时,你的工作树被完全改变为在该分支上有文件.如果您运行:
git branch
Run Code Online (Sandbox Code Playgroud)
......你应该看到master,ui和uploads所有上市.
如果要查看ui分支的日志,则应运行:
git log ui
Run Code Online (Sandbox Code Playgroud)
在合并之前将您git reset --hard HEAD^移回提交的原因是您的合并提交(在哪里)有两个父项:masteruimaster
master 在合并之前ui 在合并之前当您^向提交名称添加单个时,会将您带回第一个父级 - 要引用第二个父级,您将使用HEAD^2.但是,我想你真的不想在git reset --hard这里做改变的地方master.(无论如何,这是一个应谨慎使用的命令,因为它会丢弃未提交的更改.)
无论如何,你在ui分支上所做的所有更改现在都已合并到了master,所以如果你对你所做的事情感到满意,你就不用再担心ui分支了. Greg Hewgill的回答提出了几个行动方案,如果你现在想要的是确保你的uploads分支包含所有这些工作.