如何在不覆盖数据的情况下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在结账时合并,这似乎显然是不必要的。
答案 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。