git:切换分支时自动暂存+恢复

27

如果我运行 git checkout my-super-branch 命令,git 会告诉我:

error: Your local changes to the following files would be overwritten by checkout:
    somedir/somefile.py
Please, commit your changes or stash them before you can switch branches.
Aborting

有没有一种简单的方法可以告诉git自动执行stash+pop操作?

1
创建一个别名或者一个 shell 脚本来为你完成这个操作。但是请注意,stash pop 可能是一种危险的操作,你真的不应该将其作为自动步骤。应用一个 stash 可能会导致冲突,需要手动解决,如果你使用了 stash pop,那么原始的 stash 就不存在了,所以你没有办法回到之前的状态。 - poke
2
你确定要让这个自动发生吗?在某些情况下可能会非常烦人(例如,你修改了一个在“my-super-branch”中不存在的文件)。 - Oliver Charlesworth
你可以使用 Git 钩子来实现。 - Ayushya
8
如果stash无法干净地应用,@poke stash pop不会删除stash条目。 - mmlr
1
@mmlr 哦,你说得对!出于某种原因,我总是认为它会在任何情况下都删除存储。好知道!(这个仍然适用,这就是为什么我个人避免使用pop的原因) - poke
显示剩余2条评论
6个回答

19

1
如此简单...需要成为被接受的答案。 - vernou
1
@vernou 这个命令不能用于暂存文件。> git checkout -m main fatal: 以下文件中有已暂存的更改,无法继续操作: src/util.test.ts - TMB

5

在 checkout 操作中,没有自动应用暂存的命令行选项。我创建了一个名为 checkout.sh 的脚本,内容如下:

#!/bin/bash
git stash && git fetch && git checkout $1 && git stash pop

因此,我可以使用它与我所选的分支一起使用:checkout.sh my-branch


1
我认为最优化的方法是将其简单地别名为 ~/.bash_profile 内部 :)。 - medik
1
为什么不使用 git stash --include-untracked 呢? - Denis Howe
1
如果一开始没有文件可以隐藏,那么使用stash pop将会弹出错误的隐藏条目。 - undefined

3

Git允许流水线操作:

git stash && git fetch && git checkout 你的分支 && git stash apply

由于我使用了git stash apply,所以你的更改仍然在stash中。

如有冲突,请解决。

如果你希望在上述调用后从stash中删除你的更改,请使用以下命令:

git stash drop

否则,你可以直接使用git stash pop


10
&& 是 shell 的一个特性,而不是 Git。 - cambunctious

1

要将您的更改存储并移动到另一个分支,请将以下内容添加到您的 .gitconfig 文件中:

[alias]
    stashonto = "!f() { if [ -z \"$1\" ] ; then echo 'Error: stashonto requires destination branch.\nExample: git stashonto master\nExample: git stashonto -b new-branch 98e7f99e' ; else git stash --include-untracked && git checkout $* && git stash apply ; fi;  }; f"

这将创建一个git别名,调用一个shell函数,以便我们可以链接多个git命令。以下是该函数的详细说明,以便更易于阅读:

f() {
  if [ -z \"$1\" ] ; then
    echo 'Error: stashonto requires destination branch.\nExample: git stashonto master\nExample: git stashonto -b new-branch 98e7f99e' 
  else
    # stash everything
    (git stash --include-untracked
    # switch branch
    && git checkout $*
    # apply stash (you must 'git stash drop' to delete the stash if everything goes well)
    && git stash apply)
  fi
}
f

警告:它不够精确,不能检测出是否有存储的内容,因此如果没有任何更改需要存储,它将打印“没有本地更改可保存”,然后应用您的以前的存储。这就是为什么我使用apply而不是pop的原因。

用法:

# stash changes and apply on master
git stashonto master
# stash changes and apply on new branch 'project' off of commit 98e7f99e
git stashonto -b project 98e7f99e

1
我制作了这个“智能开关”命令。在切换之前,它会尝试隐藏未提交的更改,并在消息中留下标记。
当您回来时,它会查找与该分支相关联的任何标记的隐藏内容并弹出它们。

https://gist.github.com/mgaitan/d9a3523d79cd5f9fbfd626f646f0560b

我希望它对其他人有用。


-1

GIT >= 2.27.0

存在未提交的更改:

git switch other_branch

现在我们在other_branch上,带有这些更改。


7
很遗憾,这给我带来了和使用“checkout”时相同的错误信息。 - Nicolai Weitkemper
1
这根本不起作用。据我所知,switchcheckout的别名。 - Mark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接