web-dev-qa-db-ja.com

Gitは1つのブランチを別のブランチの上にリベースします

GitリポジトリにMasterブランチがあります。リモート開発者の1人がブランチBranch1を作成し、それに対して多数のコミットを行いました。 Branch1から分岐し、Branch2git checkout -b Branch2 Branch1)という新しいブランチを作成して、Branch2 headがBranch1:に追加された最後のコミットにあるようにしましたこの)

Master---
         \
          Branch1--commit1--commit2
                                   \
                                    Branch2 (my local branch) 

Branch1には多くの変更がありました。他の開発者は彼のコミットをつぶし、さらにいくつかのコミットを追加しました。一方、iveは私のブランチで多くの変更を行いましたが、まだ何もコミットしていません。現在の構造は次のようになります。

  Master---
             \
             Branch1--squashed commit1,2--commit3--commit4
                                       \
                                        Branch2 (my local branch)

次に、Branch1の上に変更をリベースする必要があります。私はこれをどうやって進めるかについて非常に混乱しています。最初のステップは、git add .およびgit commit -m "message"を使用して変更をコミットすることです。しかし、その後プッシュしますか? git Push Origin Branch2を使用して?またはgit Push Origin Branch2 Branch1?ヘルプが非常に必要であり、大いに感謝します。また、ブランチのバックアップを作成する方法があれば、何かを台無しにした場合に役立ちます

39
newkid101

最初に現在のBranch2をバックアップします:

# from Branch2
git checkout -b Branch2_backup

次に、Branch2Branch1をリベースします:

# from Branch2
git fetch Origin           # update all tracking branches, including Branch1
git rebase Origin/Branch1  # rebase on latest Branch1

リベース後、ブランチ構造は次のようになります。

master --
         \
          1 -- 2 -- 3 -- 4 -- Branch2'

上記の図では、Branch2のアポストロフィは、リベースされたBranch2のすべてのコミットafter commit 4が実際に書き換えであることを示しています。

Branch2の履歴を書き換えたことに留意してください。ブランチが既に公開されている場合は、強制的にリモートにプッシュする必要があります

git Push --force Origin Branch2

強制プッシュは、Branch2を使用する他の人に問題を引き起こす可能性があるため、これを行う場合は注意が必要です。

41
Tim Biegeleisen

git rebase branch1 branch2はブランチbranch2branch1にリベースします。操作上、これはbranch2のみに含まれる(branch1に含まれない)コミットがbranch1の上で再生され、branch2ポインターを一緒に移動することを意味します。この操作の図を含む詳細については、git rebase --helpを参照してください。

操作によって競合が発生する可能性があるため、手動で解決する必要があります。影響を受けるファイルを編集し、コンテンツをマージして、失敗したハンクを削除します。その後、git add <file>を使用してファイルをマージ済みとしてマークし、git rebase --continueを使用してリベースを続行します。完了するまで繰り返します。

完了したら、他に何もする必要はありません。プッシュする必要はありません。ただし、新しい変更を他のリポジトリにミラーリングする場合(たとえば、他のリポジトリと共有したり、それらの変更を自分の別のリポジトリに保存したい場合)は、最後のgit Pushを実行します。

15
dkasak

branch2の上に(ローカルbranch1から)変更をリベースします。

git checkout branch2   # Go to your local branch. Use -f to force the checkout.
git reset HEAD --hard  # Drop all non-committed changes.
git rebase branch1     # Rebase on top of branch1. Use -i for an interactive list.

注:ブランチがOriginなどのリモートにある場合、ブランチ名の前にOrigin/を付けます。

トラブルシューティング

  • rebaseの途中で止まってしまい、最初からやり直したい場合は、次を実行します。

    rm -fr .git/rebase-merge # Abort a rebase-merge mode.
    git reset HEAD --hard    # Reset everything to the current HEAD.
    
  • 切り離されたブランチ上にいる場合(実行:git branchでスター記号を探します)、次を実行します:

    git checkout branch2 -f # and start again.
    
  • 競合が発生した場合は、 修正 を使用し、別のリベースポイントを使用する必要があります。

  • ステップごとに手動でリベースを行いたい場合は、チェリーピッキングを使用します。例えば。

    git reflog              # Note hashes of for your commits.
    git checkout master     # Go to your base branch.
    git cherry-pick C0MM1T1 # Cherry pick first commit based on its hash.
    # Go to the next one or solve the conflicts.
    git cherry-pick C0MM1T2 # Cherry pick another commit and so on.
    
  • git rebase branch1 -iを実行した後、リベースでインタラクティブリストに多くのコミットが表示される場合、変更の直前に特定のコミットを指定してリベースを開始できます。 git rebase pr3v1ios

3
kenorb