git checkout而不覆盖数据

时间:2009-08-18 02:16:52

标签: git git-merge git-checkout

如何在不覆盖数据的情况下git-checkout

我跑

 git checkout master

我得到了

error: Entry 'forms/answer.php' would be overwritten by merge. Cannot merge.

这是令人惊讶的,因为我不知道Git在我git-checkout时合并。 我总是单独执行命令git merge new-feature。 如果Git在结账时合并,这似乎显然是不必要的。

4 个答案:

答案 0 :(得分:53)

Git警告你,forms / answers.php的工作副本或索引中有未更改的内容。

您可以使用 git-stash 保存更改,然后 git-stash apply 进行恢复。

git-stash 的常见用例是您正在进行更改,但必须临时检出其他分支以修复错误。因此,您可以隐藏您的索引和工作副本中的更改,签出其他分支,修复错误,提交,签出原始分支,然后 git-stash apply 从中断的地方恢复你的变化和接送。

答案 1 :(得分:19)

Git在切换分支时使用git checkout <branch>进行未注释的更改的双向合并,但通常只进行简单(树级)合并。

除了git-stash solution by Karl Voigtland,您还可以为git checkout提供其他选项,选择以下选项之一:

  • 告诉git 尝试更加合并未经注释的更改到您使用-m / --merge选项切换到的分支。使用此选项,当前分支,工作树内容和新分支之间的三向合并已完成,您将进入新分支。

  • 告诉git 覆盖未经注释的更改,使用-f选项丢弃本地更改。警告:未经修改的更改将会丢失!

答案 2 :(得分:0)

您可以执行git reset --soft来使HEAD指向新分支,但是保留所有文件(包括在新分支中更改的文件)。然后,您可以使用git checkout从新分支中仅签出您真正想要的文件。

       git reset [<mode>] [<commit>]
           This form resets the current branch head to <commit> and possibly updates the index (resetting it to the
           tree of <commit>) and the working tree depending on <mode>. If <mode> is omitted, defaults to --mixed.
           The <mode> must be one of the following:

           --soft
               Does not touch the index file or the working tree at all (but resets the head to <commit>, just like
               all modes do). This leaves all your changed files "Changes to be committed", as git status would put
               it.

答案 3 :(得分:0)

Jakub 也提到了 git checkout --merge,但在撰写本文时,我不推荐此选项。就我而言,它失败并显示“错误:脏索引:无法合并”和销毁了我的整个工作副本,没有将其备份在任何藏匿处或类似的东西中。不要使用它,而是使用传统的 stash。