在 git 中变基后不要签出分支

Don't checkout branch after rebase in git

我在我的分支上(不是 master),我需要在本地获取最新版本的 master。我接下来仍然留在我的分支:

git fetch
git rebase origin/master master

master 签出后,我需要返回我的分支机构。有什么办法可以避免在 rebase 期间检查本地 master

不幸的是,简短的回答是没有

来自doc :

If is specified, git rebase will perform an automatic git switch before doing anything else. Otherwise it remains on the current branch.

这对于合并也是一样的:您只在这些操作的已签出分支上工作,因为它们理论上可能导致冲突状态,然后需要解决现场


一种解决方法是将随后的检出链接到别名中(如果变基 returns 出错,则 && 停止)。

# fm for "fresh master"
git config --global alias.fm '!git fetch && git rebase origin/master master && git checkout -'

如果您希望将更改重新定位到您的分支,则无需签出 master。你可以留在你的分支上做 -

git fetch

然后

git rebase origin/master

这会将您本地分支的提交重新设置为 origin/master 提交的基础。它不会更新您的本地 master.

接受的答案大部分时间都有效,但是如果 origin/master 和 master 是最新的,rebase 什么都不做,使用 git checkout - 会让你回到之前的任何分支。

解决方法是在 "rebasing".

之前检查两个引用之间的差异

此外,我认为我们可以通过使用函数别名使其更通用,即:

refresh = "!f() { \
  git fetch \
  && git diff origin/  \
  || { \
        git rebase origin/  \
        && git checkout - \
     ;} \
;}; f"

直接在配置文件中定义它更容易,因为 git config 命令会尝试转义引号并把事情搞砸。

通过这种方式,您可以执行 git refresh master 或任何其他分支。如有必要,您可以使用更短的名称重命名别名或使用双别名来同时拥有两者,即:

 git config --global alias.rf refresh

别名的好主意我一定会使用它。谢谢@vitalii