在一个分支上开发了很长一段时间后,我切换到了master。日志显示:

你的分支比“origin/master”慢了167次提交,并且可以快进。

我试着:

git checkout HEAD

它没有任何效果。这是因为我在master上签出了一个中间提交。

我怎样才能使主人保持头脑清醒?


当前回答

在你的例子中,要快进,运行:

$ git merge --ff-only origin/master

这使用了git merge的——ff-only选项,因为问题特别要求“快进”。

下面是git-merge(1)的一个节选,展示了更多的快进选项:

--ff, --no-ff, --ff-only
    Specifies how a merge is handled when the merged-in history is already a descendant of the current history.  --ff is the default unless merging an annotated
    (and possibly signed) tag that is not stored in its natural place in the refs/tags/ hierarchy, in which case --no-ff is assumed.

    With --ff, when possible resolve the merge as a fast-forward (only update the branch pointer to match the merged branch; do not create a merge commit). When
    not possible (when the merged-in history is not a descendant of the current history), create a merge commit.

    With --no-ff, create a merge commit in all cases, even when the merge could instead be resolved as a fast-forward.

    With --ff-only, resolve the merge as a fast-forward when possible. When not possible, refuse to merge and exit with a non-zero status.

我经常快进,以至于它需要一个别名:

$ git config --global alias.ff 'merge --ff-only @{upstream}'

现在我可以快进:

$ git ff

其他回答

git checkout master
git pull

应该做这份工作。

每次当你在不同于master的分支上工作时,你都会得到“你的分支落后”消息,有人对master进行了更改,而你git拉。

(branch) $ //hack hack hack, while someone push the changes to origin/master
(branch) $ git pull   

现在,源/主引用被拉出,但您的主引用没有与其合并

(branch) $ git checkout master
(master) $ 

现在master在origin/master后面,可以快速前进了

this will pull and merge (so merge also newer commits to origin/master)
(master) $ git pull 

this will just merge what you have already pulled
(master) $ git merge origin/master

现在你的master和原点/master是同步的

要将当前本地跟踪器分支移动到最新的远程状态之上,需要重新设置本地跟踪器分支:

git fetch && git rebase

一般来说,快进和删除本地更改(硬重置)*:

git fetch && git checkout ${the_branch_name} && git reset --hard origin/${the_branch_name}

快进并保持本地更改(rebase):

git fetch && git checkout ${the_branch_name} && git rebase origin/${the_branch_name}

* -要撤消无意硬重置造成的更改,首先做git reflog。它以相反的顺序显示HEAD的状态。找到HEAD在重置操作之前指向的散列(通常是明显的),并将分支硬重置到该散列。

尝试git合并origin/master。如果你想确保它只做快进,你可以说git merge——ff-only origin/master。

对于任何想要快进的人来说,如果不签出该分支,他们就不能进入另一个远程分支(包括它本身)。你可以:

git fetch origin master:other

如果您不在其他分支上,这基本上会将other的索引快速转发到origin/master。您可以通过这种方式快速前进多个分支。

如果你在另一个分支上工作了一段时间,并且想要从远程更新过时的分支到它们各自的头:

git fetch origin master:master other:other etc:etc

不需要复杂。你就站在你的树枝上,做一个git拉。这对我很管用。

或者,作为第二次尝试,git拉origin master。但这只是以防万一,如果你第一个命令不走运的话。