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

q3qa4bjr  于 2023-06-20  发布在  Git
关注(0)|答案(4)|浏览(120)

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

我跑

git checkout master

我明白

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

这是令人惊讶的,因为我不知道当我git-checkout时Git会合并。我总是在命令之后分别运行git merge new-feature。如果Git在结帐时合并,这似乎是不必要的。

rta7y2nd

rta7y2nd1#

Git警告你forms/answers.php在你的工作副本或索引中有未提交的更改。
您可以使用**git-stash保存更改,然后git-stash apply**恢复它们。

git-stash的常见用例是,您正在处理更改,但随后必须临时 checkout 不同的分支以修复bug。所以你可以将你的修改隐藏在你的索引和工作副本中, checkout 其他分支,修复bug,提交, checkout 原始分支,然后git-stash apply来恢复你的修改并从你离开的地方恢复。

yshpjwxd

yshpjwxd2#

Git在切换分支时会对 * 未提交的更改 * 进行双向合并(使用git checkout <branch>),但通常它只做简单的(树级)合并。
除了Karl Voigtland的git-stash解决方案之外,您还可以为git checkout给予其他选项,选择以下选项之一:

  • 告诉gittry harder to mergeuncommitted changes to分支you switch to with -m / --merge option.使用此选项,将完成当前分支、工作树内容和新分支之间的三方合并,您将位于新分支上。
  • 告诉git覆盖未提交的更改,使用-f选项丢弃本地更改。警告:未提交的更改将丢失!
weylhg0b

weylhg0b3#

您可以执行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.
mtb9vblg

mtb9vblg4#

Jakub也提到了git checkout --merge,但是在写这篇文章的时候,**我不推荐这个选项。**在我的例子中,它失败了,出现了一个“error:脏指数:不能合并”,并销毁了我的整个工作副本,没有备份它在任何藏匿或类似的东西。不要使用它,而是使用传统的藏匿。

相关问题