在签出另一个分支后,无法在Git分支中找到工作

时间:2011-02-24 07:51:15

标签: git

我在主分支上,我跑了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'提交,我能够恢复大部分内容,但我想知道是什么导致这种情况发生?

2 个答案:

答案 0 :(得分:7)

它没有丢失,只是当你在git中切换分支时(使用git checkout),你的工作树被完全改变为在该分支上有文件。如果您运行:

git branch

...您应该看到所有列出的masteruiuploads

如果要查看ui分支的日志,则应运行:

git log ui

在合并git reset --hard HEAD^之前master将您移回ui上的提交的原因是您的合并提交(其中master所在的位置)有两个父项:

    合并前的
  1. master
  2. 合并前的
  3. ui
  4. 当您向提交名称添加单个^时,会将您带回第一个父级 - 要引用第二个父级,您将使用HEAD^2。但是,我想你真的不想在这里做git reset --hard来改变master的位置。 (无论如何,这是一个应谨慎使用的命令,因为它会丢弃未提交的更改。)

    无论如何,您在ui分支上所做的所有更改现已合并到master,因此,如果您对在此处所执行的操作感到满意,则无需担心{ {1}}分支了。 Greg Hewgill的答案表明,如果您现在想要的是确保您的ui分支包含所有工作,那么可以采取一些行动方案。

答案 1 :(得分:3)

您描述的所有内容都符合预期。当您切换到ui分支时,您对uploads分支上的工作没有出现感到惊讶。这是有道理的,因为ui工作在您创建uploads时不存在。你可以在这里采取两种方法:

  1. master合并到uploadsgit merge master
  2. uploads重新投放到mastergit rebase master
  3. 这两个命令都将在uploads分支上运行。