32

你怎么能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

4 回答 4

59

Git 警告您 forms/answers.php 在您的工作副本或索引中有尚未提交的更改。

您可以使用git-stash保存更改,然后git-stash apply来恢复它们。

git-stash的常见用例是您正在处理更改,但随后必须临时签出不同的分支以进行错误修复。因此,您可以将更改存储在索引和工作副本中,签出另一个分支,进行错误修复,提交,签出原始分支,然后git-stash 应用以恢复您的更改并从您离开的地方继续。

于 2009-08-18T02:21:31.143 回答
19

Git在切换分支时(使用)对未提交的更改进行 2 路合并git checkout <branch>,但通常它只进行微不足道的(树级)合并。

除了git-stash Karl Voigtland 的解决方案,您还可以为git checkout提供其他选项,选择以下选项之一:

  • 告诉 git更加努力地将未提交的更改合并-m到您使用/--merge选项切换到的分支中。使用此选项,当前分支、工作树内容和新分支之间的三向合并完成,您将位于新分支上。

  • 告诉 git覆盖-f未提交的更改,使用选项丢弃本地更改。警告:未提交的更改将丢失!

于 2009-08-18T09:26:30.693 回答
2

您可以执行 agit reset --softHEAD说明新分支,但保留所有文件原样(包括在新分支中更改的文件)。然后,您可以使用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.
于 2019-05-26T09:20:49.143 回答
0

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

于 2021-05-11T18:17:12.490 回答