【问题标题】:git: Switch branch and ignore any changes without committinggit:切换分支并忽略任何更改而不提交
【发布时间】:2010-11-21 05:40:00
【问题描述】:

我在一个 git 分支上工作并准备好提交我的更改,所以我提交了一个有用的提交消息。然后,我心不在焉地对不值得保留的代码进行了微小的更改。我现在想改变分支,但是git给了我,

错误:您对“X”进行了本地更改;无法切换分支。

我可以在不提交的情况下更改分支吗?如果是这样,我该如何设置?如果没有,我该如何摆脱这个问题?我想在不提交的情况下忽略微小的更改,而只是更改分支。

【问题讨论】:

  • 我相信这只发生在他们的更改被提交但未提交时?如果您尚未使用 git add 等暂存文件,则 git checkout 可以很好地更改分支。
  • 嗨杰里米,你所说的“上演”是什么意思?强制用户在更改分支之前提交文件似乎不是一个很好的工作流程。例如,如果我在主存储库中并且想快速检查分支中的某些内容。我必须先将代码提交给大师,即使代码写了一半!您是说确实,在这种情况下应该可以结帐一个分支?
  • @boyfarrell 您可以使用“Git stash”临时保存更改而不提交。
  • 当你切换到一个分支而不在旧分支中提交更改时,git 会尝试将更改合并到新分支中的文件中。如果合并完成没有任何冲突,则切换分支将成功,您可以看到新分支中的更改。但是如果发生冲突,你会得到error: You have local changes to '<filename>'; cannot switch branches. 并且分支不会改变。您可以使用git checkout -m <branch-name> 合并冲突并结帐到分支并自己解决冲突,或者使用git checkout -f <branch-name> 忽略更改。

标签: git branch git-checkout


【解决方案1】:

你需要一个干净的状态来改变分支。只有在不影响“脏文件”(如 cmets 中的Charles Bailey 备注)的情况下,才允许分支结帐。

否则,您应该:

  • stash您当前的更改或
  • reset --hard HEAD(如果您不介意丢失这些小改动)或
  • checkout -f(切换分支时,即使索引或工作树与 HEAD 不同,也要继续。这用于丢弃本地更改。)

或者,最近:

即使索引或工作树与 HEAD 不同,也要继续。
恢复索引和工作树以匹配切换目标。

这与git switch -m <branch-name> 不同,后者会触发当前分支、您的工作树内容和新分支之间的三向合并:您不会以这种方式丢失正在进行的工作。

【讨论】:

  • "你需要一个干净的状态来改变分支。"仅当分支更改影响“脏文件”时才为真。
  • 对于 stash 方法,我输入了“git stash save”、“git checkout otherbranch”,最后输入了“git stash pop”。
  • 目前我没有看到这条错误消息,当我执行“git status”时,我在一个分支上所做的更改会显示在另一个分支上。有什么变化吗?
  • 谢谢。 checkout -f 是我需要的。我做了 git reset --hard git clean -f git checkout mybranch -f
  • 这是 Git 完全错误的一件好事,因为它违反了分支的基本定义。不像 git branch 意味着两个完全不同的工作区从一个存储库中分叉出来。
【解决方案2】:

如果您想放弃更改,

git checkout -- <file>
git checkout branch

如果您想保留更改,

git stash save
git checkout branch
git stash pop

【讨论】:

  • 确实是 Romerun 所说的(要完整):git stash save(在工作分支中时)然后 git checkout branchX 做一些事情 git add/commit -m 等等。git checkout branchYgit stash pop 拿回藏匿处
  • 也许是这样。我有一种情况,如果我理解正确的话,我想做答案所说的:存储更改,从 Y 切换到 X,然后弹出更改并在 X 上提交它们。
  • 请注意,git stash save 现在已弃用,取而代之的是 git stash push
  • This alias 简化了更改分支时保持更改的情况。
【解决方案3】:

应该是这样的

git stash save
git checkout branch
// do something
git checkout oldbranch
git stash pop

【讨论】:

  • 是的,stash 是全局的,而不是特定于分支的,如果我在切换分支后存储 pop,我将得到与其他分支相同的存储
  • 应注意git stash将默认为git stash save
  • 谢谢,对我很有帮助
【解决方案4】:

关注,

$: git checkout -f

$: git checkout next_branch

【讨论】:

    【解决方案5】:

    请注意,如果您已合并远程分支或有本地提交并想返回远程 HEAD,您必须这样做:

    git reset --hard origin/HEAD
    

    HEAD 仅指本地提交/合并——有几次我忘记了当我完全打算对所有更改/提交进行核对时并返回远程分支。

    【讨论】:

      【解决方案6】:

      这些答案都没有帮助我,因为即使在重置和存储之后我仍然有未跟踪的文件。我必须这样做:

      git reset --hard HEAD
      git clean -d -f
      

      【讨论】:

        【解决方案7】:

        如果您更改了 Git 在切换分支时也需要更改的文件,它不会让您更改。要放弃工作更改,请使用:

        git reset --hard HEAD
        

        然后,你就可以切换分支了。

        【讨论】:

          【解决方案8】:

          git checkout -f your_branch_name

          git checkout -f your_branch_name
          

          如果您在还原更改时遇到问题:

          git checkout .
          

          如果要删除未跟踪的目录和文件:

          git clean -fd
          

          【讨论】:

            【解决方案9】:

            按照以下步骤操作:

            1. 即使您在分支之间切换,Git stash save 也会保存您的所有更改。
            git stash save
            
            1. Git 检出任何其他分支,现在既然您保存了更改,您就可以在任何分支中移动。上述命令将确保您的更改已保存。
            git checkout branch
            
            1. 现在,当您返回分支时,使用此命令恢复所有更改。
            git stash pop
            

            【讨论】:

              【解决方案10】:

              切换到丢失更改的新分支:

              git checkout -b YOUR_NEW_BRANCH_NAME --force
              

              切换到丢失更改的现有分支:

              git checkout YOUR_BRANCH --force
              

              【讨论】:

                【解决方案11】:

                简单回答:

                是强制结帐一个分支

                git checkout -f <branch_name>
                

                强制签出分支是告诉 git 删除您在当前分支中所做的所有更改,并签出所需的更改。

                或者如果你正在检查一个提交

                git checkout -f <commit-hash>
                


                "认为我可以在不提交的情况下更改分支。如果是这样,如何 我可以设置吗?如果没有,我该如何摆脱这个问题?”

                答案是,这实际上是 Git 的哲学,即您跟踪所有更改,并且每个节点(即提交)必须与最新的您所做的更改,当然除非您进行了新的提交。


                您决定保留更改?

                然后使用

                git stash
                

                然后要在所需分支中取消隐藏更改,请使用

                git stash apply
                

                这将应用您的更改,但也将它们保留在存储队列中。如果您不想将它们保留在存储堆栈中,请使用

                弹出它们
                git stash pop
                

                这相当于apply,然后是drop

                【讨论】:

                  【解决方案12】:

                  如果您想保留更改并在单行命令中更改分支

                  git stash && git checkout <branch_name> && git stash pop
                  

                  【讨论】:

                    【解决方案13】:

                    将未提交的更改移动到新分支

                    我为此创建了一个.gitconfig 别名:

                    [alias]
                    spcosp = !"git stash push && git checkout \"$@\" && git stash pop --index #"
                    

                    要更改为new-branch-name,请使用:

                    git spcosp new-branch-name
                    

                    并且任何未提交的文件和索引更改都将被保留。

                    【讨论】:

                      【解决方案14】:

                      关闭终端,删除你的项目所在的文件夹,然后再次克隆你的项目,瞧。

                      【讨论】:

                      • git 并非旨在推动您删除项目并再次克隆!如果你想从 origin 获取最新版本,你只需 reset --hard!
                      • 这个解决方案可以完成这项工作,但就像您想从纽约开车到波士顿,但决定途经蒙特利尔。
                      【解决方案15】:

                      当 git stash 不起作用时切换到其他分支而不提交更改。您可以使用以下命令:

                      git checkout -f 分支名称

                      【讨论】:

                        【解决方案16】:

                        为了你的精神平静 (为了更轻松地访问您在分支切换时未提交的更改)

                        切换前:

                        git checkout <next_branch>
                        

                        使用

                        git stash save "brief description of changes"
                        

                        代替默认值:

                        git stash    
                        // or
                        git stash save
                        

                        如果您的git stash list 是一个较长的列表,这是值得的 并且必须切换回从那里开始的某个先前的想法。

                        【讨论】:

                          猜你喜欢
                          • 2018-01-23
                          • 2020-12-27
                          • 2022-11-02
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2012-08-15
                          • 1970-01-01
                          • 2020-10-23
                          相关资源
                          最近更新 更多