将主分支合并到当前分支的Git快捷方式

12

有时候我在一个分支上工作,想要合并自分支创建以来在origin/master上进行的更改。仅仅使用git merge master通常是不够的,因为本地的master可能没有来自远程master的更改,所以我发现自己必须这样做:

# save any uncommitted changes (if there are any)
git stash  
# update master first:
git checkout master
git pull
# back to where we were:
git checkout <previous branch>
git stash pop # omit if git stash not done
# and finally the actual merge: 
git merge master

当然,有一种更简单的方法,只需要一个或两个git命令吗?

为什么不使用 git 别名来创建自己的快捷方式呢?请参考 https://github.com/GitAlias/gitalias/blob/master/gitalias.txt 的示例。 - matt
3个回答

24

一个命令:

git pull origin master:master

让我把它分开并解释一下。git pull master:master 相当于

git fetch origin master:master
git merge master

git fetch origin master:master 意味着:从远程分支 origin 中获取新提交的master分支,并更新本地的master分支指向与远程master分支相同的提交。这是你可以执行的操作。

git checkout master
git pull
git checkout <previous branch>

但速度更快(无需进行 2 次结帐)。

如果您需要隐藏,则添加 --autostash

git pull --autostash origin master:master

太好了,我喜欢这个!比我的替代答案要好得多。无论如何,我还是会保留我的替代答案,以防有人对它感兴趣。 - joanis
非常好,甚至隐藏也适合于一个命令中,干得好! - Oliver
只是想知道,我知道这很旧了,但你能否将不同的合并策略添加到此命令中?比如让它执行一个变基操作? - Tosa
@Tosa 这个问题是关于合并的。 - phd
@phd,是的,这更多是一个问题,而不是对你答案的批评 :) - Tosa
@Tosa 试过 git pull --rebase master:master 吗?或者甚至 git config --global branch.autoSetupRebase always,然后 git config --local branch.master.rebase true,最后 git pull origin master:master - phd

1
我经常面对你描述的情况,很快就会厌倦,所以我创建了一个别名来快速推进master而不用切换到它。
我在~/.gitconfig[alias]部分创建了一个别名,可以更新master(或任何分支)到origin/master而无需检出。
这是一个简单的(但不安全的)版本别名:
    ff = !sh -c 'git update-ref refs/heads/$1 origin/$1' -

你可以通过输入git ff some_branch来调用它,并使用update-ref将该分支设置为origin/some_branch
一旦定义了这个别名,你的操作就变成了:
git fetch
git ff master
git merge master

然而,这种方法是不安全的,因为即使与快进合并不相等,它也会执行更新操作,因此可能会丢弃一些提交。以下是该别名的第二个版本,添加了保护措施,仅在快进情况下执行,并拒绝在其他情况下执行任何操作:
    # Do a fast-forward merge on the branch specified as argument, as long
    # as it's safe: $1 is not checked out, and a fast-forward merge is possible.
    ff = !bash -c '\
           if [[ `git symbolic-ref HEAD` = refs/heads/$1 ]] ";" then \
              echo $1 is checked out, use pull or merge instead. ";" \
           else \
              git update-ref refs/heads/$1 origin/$1 `git merge-base origin/$1 $1` ";" \
           fi' -

我经常发现不安全的别名也很有用,特别是当我想要丢弃本地分支副本上的一些工作时,我也将其保留为ff-force

    # Not safe - reset the specified branch to its state on origin, even if it's not a fast-forward merge and potentially throws away some commits
    ff-force = !sh -c 'git update-ref refs/heads/$1 origin/$1' -

我的两个别名都有一个已知的限制:远程必须被称为origin


我同意保留这个答案,尽管phd的答案是我想要的。你的回答可以改进的一点是解释在这种特定情况下update-ref如何工作;定义一个函数而不是别名,因为这样你就不必在各个地方放置所有这些引号,即代码将更简单易懂,并且你将能够处理不同的远程名称(通过可选的函数参数);为了让这个问题集中在OP问题上,我会把保护措施移到答案的末尾,作为一种改进。JM2CW! - Oliver
感谢您的反馈。我已经改变了答案的顺序并添加了一些解释。不过,我不确定如何在我的.gitconfig文件中定义一个函数,似乎这些必须作为我路径上的单独可执行文件完成。我更喜欢将所有Git自定义内容都放在一个地方,但我同意一个函数脚本看起来更干净。 - joanis

0

我做

  1. git fetch origin develop - 获取最新更改,但不将其合并到本地的 develop -
  2. git merge origin/develop - 合并

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