ローカルブランチをリモートマスターでリベースする方法


934

リモートリポジトリのマスターブランチからクローンプロジェクトを作成していますremote_repo。新しいブランチを作成し、そのブランチにコミットします。他のプログラマーremote_repoはmasterブランチにプッシュしました。

次に、ブランチRBをremote_repoマスターにリベースする必要があります。

これを行う方法?端末に入力するコマンドは何ですか?


14
「with」はどちらの方向にもリベースする可能性があるため、私にとってこの質問はあいまいです。私は意図はあなたのブランチをリベースしていることがわかり答えを見てみると上にリモート・マスターではなく、他の方法の周り。誰かが以下の答えに従い、彼らが望むものの逆を得る場合に備えて、私はそれについて言及します。
グレンローレンス

8
@GlennLawrenceコメントを追加するよりも元の質問を編集する方が良いと思います。これは、stackoverflowによっても推奨されます。さらに、RBはマスターの履歴に依存しているため、マスターのRBへのリベースはおそらくいずれにしても失敗します。
ダニエル・カルマン2017年

回答:


1245

最初にアップストリームリポジトリから新しいマスターをフェッチしてから、それに基づいて作業ブランチをリベースします。

git fetch origin            # Updates origin/master
git rebase origin/master    # Rebases current branch onto origin/master

更新:同じことを行うためのより簡潔な方法については、Paul Draperの回答を参照してください。最近のGitバージョンでは、上記の2つのコマンドと同等の簡単な方法が提供されています。


16
これが、実際に尋ねられたことを実際に行う唯一の答えです
kayaker243

5
@ kayaker243いいえ、それはポール・ドレイパーズの回答と同じですが、長い形式だと思います。
erik 2013年

7
@erikポール・ドレイパーがkayaker243のコメントの約半年後(そしてこの回答からほぼ2年後)に彼の回答を書いたことに注意してください。
Frerich Raabe 2013

3
次のYour branch and 'origin/b1' have diverged, # and have 3 and 2 different commits each, respectively.ようにgit pullなります。別のものが必要なようです。これは正しいですか、またはここで何か不足していますか?
Dror

2
@RGCいいえは、git rebase master第2のコマンド(同じ仕事をしないであろうgit rebase origin/masterから)master及びorigin/masterウェル異なるコミットを指してもよい(特に最初のコマンドであったことを考えるとgit fetch origin、変更し得ます、origin/master)。
Frerich Raabe

816
git pull --rebase origin master
# where --rebase[=(false|true|merges|preserve|interactive)]

19
(Frerichの回答に相当)
Paul Draper 14

12
これは、フレリッヒの答えとわずかに異なります。これは、オリジンマスターからローカルマスターへの変更をコミットしますが、フレリッヒの答えはローカルマスターをそのままにしますか。(プルvs.フェッチ)
ジミー・ハッヒ

7
いいえ、Frerichの答えでは、リベースはローカルマスターを変更します。pull --rebaseは、フェッチの後にリベースが続くのと同じです
adhominem

9
FYIでインタラクティブなリベースを行うことができますgit pull --rebase=interactive origin master
emmby

14
@adhominem- git-pullのドキュメントを確認しましたが、ローカルマスターが変更されているという主張を裏付けるものは何もありません。というブランチdevでrunを実行するとgit pull --rebase origin master、ブランチだけdevが変更され、は変更されませんmaster--rebaseフラグのドキュメントは、それがしようとしていないと述べているrebase the current branch on top of the upstream branch after fetching地元の追跡ブランチの変更について、何も。
モニカ2331977の回復

227

変更をブランチにコミットした後、チェックアウトmasterしてプルし、リポジトリから最新の変更を取得します。

git checkout master
git pull origin master

次に、ブランチをチェックアウトして、変更をmaster次のようにリベースします。

git checkout RB
git rebase master

...または1行の最後の2つのコマンド:

git rebase master RB

にプッシュしようとするとorigin/RB、おそらくエラーが発生します。自分だけが作業しているRB場合は、強制的にプッシュできます。

git push --force origin RB

...またはgitが適切に構成されている場合は、次のようにします。

git push -f

4
origin / RBにプッシュバックしようとすると、おそらくエラーが発生します。RBで作業しているのがあなただけの場合は、git push --force origin RBを実行できます。ソース:stackoverflow.com/questions/8939977/...
ジョーイバルーク

1
あ....まさにこれがあります。「RB」は正しくリベースされていますが、リベース後にプッシュしようとすると、無限のエラーが発生します。push以外の--force origin RB-それを行うための「より良い」(強制されていない)方法はありますか?ここでgitの認識を理解しようとするだけで失敗します。
Motti Shneor 2017年

2
@MottiShneorいいえ、いい方法はありません。その間に誰かがブランチにプッシュすると、変更は失われます!gitのコミット履歴を使いたい場合は、masterをブランチにマージするほうが安全です(これはgit pushなしでも実行できます-f)。
ダニエル・カルマン2017年

110

注:リベースについてすでに幅広い知識がある場合は、1つ以下のライナーを使用して高速リベースを行ってください。 解決策: あなたがあなたの作業ブランチにいて、あなたがそれで作業している唯一の人であると仮定します。

git fetch && git rebase origin/master

競合を解決し、コードをテストし、コミットして、新しい変更をリモートブランチにプッシュします。

                            ~:   For noobs   :~

次の手順は、初めてでgit rebase、手間をかけずにそれをやりたいと思っている人を助けるかもしれません

ステップ1:この時点でYourBranchに対してコミットおよび変更が行われないと仮定します。YourBranchにアクセスしています。

git checkout YourBranch
git pull --rebase

どうした?ブランチで作業している他の開発者が行ったすべての変更をプルし、変更をブランチの上にリベースします。

ステップ2:存在する競合を解決します。

ステップ3:

git checkout master
git pull --rebase

どうした?リモートマスターからすべての最新の変更をプルし、ローカルマスターをリモートマスターにリベースします。私は常にリモートマスターをクリーンに保ち、リリースの準備をしています!また、ローカルでマスターまたはブランチで作業することを優先します。gitの変更またはコミットを手に入れるまで、これを行うことをお勧めします。注:ローカルマスターを維持していない場合、この手順は必要ありません。代わりに、ローカルブランチで直接リモートマスターをフェッチしてリベースすることができます。最初のステップで述べたように。

ステップ4:存在する競合を解決します。

ステップ5:

git checkout YourBranch
git rebase master

どうした?マスターのリベースが起こります

ステップ6:競合がある場合は、競合を解決します。git rebase --continue解決した競合を追加した後、リベースを続行するために使用します。いつでもgit rebase --abort、リベースを中止できます。

ステップ7:

git push --force-with-lease 

どうした?リモートYourBranchへの変更のプッシュ。--force-with-leaseあなたがリベースしている間、他の開発者からYourBranchへの他の着信変更があるかどうかを確認します。これは強制プッシュよりも非常に便利です。受信した変更がある場合は、変更をプッシュする前に、それらをフェッチしてローカルのYourBranchを更新します。

なぜ変更をプッシュする必要があるのですか?適切なリベースの後でリモートYourBranchのコミットメッセージを書き換えるか、競合が解決された場合は?次に、ローカルリポジトリで解決した変更をYourBranchのリモートリポジトリにプッシュする必要があります。

Yahoooo ...!リベースが完了しました。

また、次のことを検討している場合もあります。

git checkout master
git merge YourBranch

いつ、なぜ?あなたや他の共同開発者による変更が終わったら、ブランチをマスターにマージします。これにより、後で同じブランチで作業したいときに、YourBranchがマスターで最新の状態になります。

                            ~:   (๑ơ ₃ ơ)♥ rebase   :~

これの目的:「マスターからすべての最新の変更をプルし、マスターを最新のマスターにリベースします。」マスターをマスターにリベースしますか?最新のマスターをプルする必要はありませんか?
John Little、

@JohnLittleご指摘ありがとうございます。つまりPulls latest changes from remote master to local master. I always prefer keeping remote master clean and release ready always!。説明を更新します。
bh4r4th

21

ステップ1:

git fetch origin

ステップ2:

git rebase origin/master

ステップ3:(競合がある場合は修正する)

git add .

ステップ4:

git rebase --continue

ステップ5:

git push --force

5
どのブランチから開始するかについての説明はありません。良い答えではありません。
Karl Morrison

12

1.最初にマスターを更新...

git checkout [master branch]
git pull [master branch]

2. masterブランチでソースブランチをリベースする

git checkout [source branch]
git rebase [master branch]
git pull [source branch] (remote/source branch)
git push [source branch]

ソースブランチがリモートにまだ存在しない場合は、次のようにします。

git push -u origin [source branch]

「et voila ...」


この回答の段階的な性質が気に入っています。正確に何が起こっているかを分析するのに役立ちます。
Dave Liu

6

git fetch origin master:master チェックアウトする必要なく、マスターの最新バージョンを取得します。

したがって、必要なのは次のとおりです。

git fetch origin master:master && git rebase master 👌


git fetchそれもチェックアウトする必要なしにマスターを更新しませんか?それ以外は更新が正しくありgit fetchませんgit mergeか?したがって、チェックアウトmasterした場合、最新のアップデートはありません。だから、機能ブランチにしながら、やって短くはないgit fetch、その後git rebase origin/master?これはワークスペースgit rebase masterからリベースしようとするため、実行できません。マージされていないがローカルに座っているmaster必要がありますorigin/master
Noitidart
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.