ブランチをヘッドに早送りする方法は?


249

私は長い間ブランチで開発した後、マスターに切り替えました。ログは示しています:

あなたのブランチは167コミットで 'origin / master'の後ろにあり、早送りすることができます。

私は試した:

git checkout HEAD

影響はありません。これは、マスターで中間コミットをチェックアウトしているためです。

マスターを頭に留める方法は?


6
git checkout HEAD何もしません。HEAD既にチェックアウトされたコミットを意味します。
EmreTapcı2018

回答:


244

実行:

git checkout master
git pull origin

origin/masterブランチをフェッチしてマージします(git pullデフォルトはoriginであるため、単に言うこともできます)。


52
ロブの答えの方がいいと思います。私は通常、プル終えた直後に別のブランチに切り替えるという状況に遭遇します。このブランチは早送りする必要があります。別の(no-op)プルを実行し、それが完了するのを待つ必要がある場合、それは私にとって迷惑です。ローカルのみの操作を行う方が速く、とにかく私が欲しいものです。
シュヴァルツ男爵、

353

お試しくださいgit merge origin/master。早送りだけを実行したい場合は、と言うことができますgit merge --ff-only origin/master


4
これは、リモートにジャンプする認証フープがある場合に使用すると便利です。1つのブランチを取得するときは、認証を受ける必要があります。次に、別のブランチに切り替える(つまり、変更をチェリーピックする)ときは、このmergeコマンドを使用して、再認証する必要がないようにします。
RustyTheBoyRobot

30
--ff-only非常に便利です。
ルーク

4
場合、私は知らないorigin/master部分が必要とされるか、賢明デフォルトそれならば、私は早送りのエイリアスを作成することが有用であることが判明ので、私は上流の枝が代わりにそれをハードコーディングの使用されていることを確認したかったorigin/masterff = merge --ff-only @{u}@{u}上流にあります) 。
Thor84no

2
オフラインの場合、推奨される回答よりも良い
Jacek Pietal

1
単純なプルが同じことをしない理由を説明できますか?また、これを行う場合、プルはまだ必要ですか?
Zuzu Corneliu

40

あなたの状況でgit rebaseは、トリックも行います。マスターが持っていない変更がないので、gitは早送りします。リベースワークフローを使用している場合は、混乱した場合にマージコミットが行われないため、より推奨される場合があります。

username@workstation:~/work$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.
#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean
username@workstation:~/work$ git rebase
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/origin/master.
# On branch master
nothing to commit, working directory clean

1
そして、私たちはgit pullを使用することになっていないので、私にとって非常に便利です!
Stefan

保留中の変更がある場合でも、いつでも隠してリベースできます。これが「適切な」方法であるかどうかはわかりませんが、不思議に機能します。
fn。

28
git checkout master
git pull

仕事をする必要があります。

masterとは異なるブランチで作業、誰かがmasterに変更を加え、git pullするたびに、「ブランチが遅れています」というメッセージが表示されます。

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

これで、オリジン/マスターリファレンスがプルされますが、マスターはマージさません。

(branch) $ git checkout master
(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

今あなたのマスターとオリジン/マスターは同期しています


13

別のブランチに立っていて、マスターの最新バージョンをチェックアウトしたい場合は、次のこともできます

git checkout -B master origin/master


9

彼らは早送りにしたい人には上にないそのブランチをチェックアウトせずに(自身を含む)別のリモートブランチに、あなたが行うことができます。

git fetch origin master:other

これは、ブランチにいない場合、基本的にotherto のインデックスを早送りしorigin/masterますother。この方法で複数のブランチを早送りできます。

しばらく別のブランチで作業していて、古いブランチをリモートからそれぞれのヘッドに更新したい場合:

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

2

複雑さは必要ありません、ブランチに立ってgit pullを実行するだけ です

または、 最初のコマンドで運が悪かった場合にのみ、2番目にgit pull origin masterを試してください


0

最新のリモート状態の上にローカル変更を移動する現在のローカルトラッカーブランチをリベースするには:

$ git fetch && git rebase

より一般的には、ローカルの変更を早送りして削除するには(ハードリセット)*:

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

早送りやローカルな変更(キープリベースを):

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

*-意図しないハードリセットによって引き起こされた変更を元に戻すにgit reflogは、HEADの状態を逆の順序で表示し、リセット操作の前にHEADがポイントしていたハッシュを見つけ(通常は明白)、ブランチをそのハッシュにハードリセットします。


0

あなたの場合、早送りするには、以下を実行します:

$ git merge --ff-only origin/master

質問では「早送り」を具体的に要求するため、これにはの--ff-onlyオプションを使用しますgit merge

以下は、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

-2

ブランチポインターをHEADに移動します。

git branch -f master

あなたのブランチはmasterすでに存在しているので、あなたが使用しない限り、gitはそれを上書きすることを許可しません... -f(この引数はを意味します--force

または、リベースを使用できます。

git rebase HEAD master

あなた自身の責任でそれをしてください;)


1
これを試みないでください。次のような状況では、悪いことが起こります:C0 --- C1 --- C2 --- C3 --- C4(マスター)。C0 --- C1 --- C2 --- B1 --- B2 --- B3(dev)頭がB3(dev)にあり、git branch -f masterを実行すると、最終的にC0- -C1 --- C2 --- B1 --- B2 --- B3(dev)(マスター)。C3 --- C4はどのブランチからも到達できず、最終的にはガベージコレクションされます。この状況に陥った場合は、reflogを確認し、-b <branch>オプションを使用してC4コミットをチェックアウトして、新しいブランチを作成してください。
A_P 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.