GitリポジトリにMaster
ブランチがあります。リモート開発者の1人がブランチBranch1
を作成し、それに対して多数のコミットを行いました。 Branch1
から分岐し、Branch2
(git 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
?ヘルプが非常に必要であり、大いに感謝します。また、ブランチのバックアップを作成する方法があれば、何かを台無しにした場合に役立ちます
最初に現在のBranch2
をバックアップします:
# from Branch2
git checkout -b Branch2_backup
次に、Branch2
でBranch1
をリベースします:
# 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
を使用する他の人に問題を引き起こす可能性があるため、これを行う場合は注意が必要です。
git rebase branch1 branch2
はブランチbranch2
をbranch1
にリベースします。操作上、これはbranch2
のみに含まれる(branch1
に含まれない)コミットがbranch1
の上で再生され、branch2
ポインターを一緒に移動することを意味します。この操作の図を含む詳細については、git rebase --help
を参照してください。
操作によって競合が発生する可能性があるため、手動で解決する必要があります。影響を受けるファイルを編集し、コンテンツをマージして、失敗したハンクを削除します。その後、git add <file>
を使用してファイルをマージ済みとしてマークし、git rebase --continue
を使用してリベースを続行します。完了するまで繰り返します。
完了したら、他に何もする必要はありません。プッシュする必要はありません。ただし、新しい変更を他のリポジトリにミラーリングする場合(たとえば、他のリポジトリと共有したり、それらの変更を自分の別のリポジトリに保存したい場合)は、最後のgit Push
を実行します。
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
。