3

有时当工作目录发生本地更改时,切换分支会失败,但以下流程有效:

  • 存储保存
  • 切换分支
  • 隐藏流行音乐

怎么来的?git 不知道如何将本地工作目录更改应用到目标分支?什么样的设计选择使这个过程变得必要?有没有我可以使用的标志来避免这个稍长的过程?

更新:
假设我想在切换分支时将本地更改保留为本地更改。有时这是一个实际的场景......

4

3 回答 3

4

当前分支脏了,你尝试切换分支有两种情况:

  1. 您忘记提交更改。

    在这种情况下,git 会警告您切换到另一个分支会导致您丢失所做的更改。这基本上是默认假设,这就是错误消息按原样编写的原因。

  2. 您的更改是暂时的,无论如何您都想切换。

    在这种情况下,您需要存储更改,然后在切换后再次应用它。Git 从不认为这是你想要的。如果我不得不猜测为什么这可能是因为 Linus 不经常这样做。

由于 git 无法读懂您的想法,它会等待您告诉它提交或存储。虽然通过错误消息我会说如果 git 试图读懂你的想法,它会猜测你想要提交而不是 stash - 但在你的情况下这将是一个错误的猜测。


附加答案

很抱歉回复之间的长时间延迟,但我今天才注意到您更新的问题。

对于本地更改,我的策略是创建一个本地更改分支。然后从那个分支而不是 master 分支所有功能分支。这是可行的,因为本地更改通常适用于所有工作分支。

但是这样做会使 master 变基有点乏味,因为您基本上需要变基两次 - 一次到 local_changes,然后从 local_changes 到您的主题分支。但是你可以很容易地为此编写一个 shell 脚本:

# rebase_master.sh
git rebase master local_changes
git rebase local_changes

这样做的另一个优点是,如果您需要重新配置环境,那么更改 local_changes 会将您的更改传播到所有主题分支。

要合并回 master,您可以git rebase master在合并之前从主题分支中删除 local_changes。

于 2012-11-01T08:57:38.250 回答
3

为了涵盖您问题的最后一部分,如果您经常这样做,您可以创建一个别名来缩短该过程:

switch = !f() { git stash && git checkout $1 && git stash pop; }; f

用法:git switch branchName

于 2012-11-01T09:02:37.923 回答
3

只要您没有修改当前HEAD提交和目标提交之间不同的任何文件,使用脏工作树切换分支就会成功。如果不是这种情况,则需要合并对这些文件的更改,并且git checkout无法警告您您正在尝试做一些无法轻易撤消的事情。如果你想这样做,你可以使用--mergeor-m选项git checkout

git checkout -m branchName
于 2012-11-01T14:09:40.353 回答