【问题标题】:To git checkout without overwriting datagit checkout 不覆盖数据
【发布时间】:2009-08-18 02:16:52
【问题描述】:

你如何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 在结帐时合并,这显然是不必要的。

【问题讨论】:

    标签: git git-merge git-checkout


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您提及git-stash! - 我不知道它的目的是用于这种情况。
    • 无论出于何种原因,我都无法使用 git-stash 命令。相反,我不得不使用“git stash”(没有连字符)。
    • 如果您只想检查不同的修订版本,同时保留未提交的更改(在寻找引入错误的修订版本时有时会出现这种情况),Jakub 的建议 (git checkout -m) 要容易得多。
    【解决方案2】:

    您可以使用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】:

      Git 在切换分支(使用git checkout &lt;branch&gt;)时对未提交的更改进行双向合并,但通常它只进行微不足道的(树级)合并。

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

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

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

      【讨论】:

      • 谢谢。第二个 (git checkout -f master) 帮助我找回了状态。我不知道我丢失了哪些更改,但它们并不重要,因为这是我只想检查的一个非常旧的 repo 副本。
      • 可以做git checkout -f的“相反”吗?基本上我希望 Git 放弃检查会导致冲突的文件。
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-11
        • 1970-01-01
        • 2013-04-30
        • 2018-03-25
        • 1970-01-01
        • 2021-03-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多