Azure DevOps Services |Azure DevOps Server 2022 |Azure DevOps Server 2020
Visual Studio 2019 |Visual Studio 2022
Git では、新しい各コミットを先行コミットにリンクすることで、ブランチでの開発の履歴が自動的に保持されます。 あるブランチを別のブランチに マージ すると、履歴の単純性が低下する可能性があります。 たとえば、 早送りなしのマージ では、複数の先行タスクを含むマージ コミットを作成することで、開発の異なる行が結合されます。 逆に、Git リベース では、マージ コミットを作成せずにさまざまな開発ラインが結合されるため、コミット履歴は単純になりますが、マージに関する情報は失われます。 マージの種類の選択は、マージのレコードを保持するか、コミット履歴を簡略化するかによって影響を受ける可能性があります。
この記事では、高速転送なしのマージではなくリベースを使用する場合について説明し、次のタスクの手順について説明します。
- ローカル ブランチのリベース
- リベース後にローカル ブランチを強制的にプッシュする
- ローカル コミットをスカッシュするための対話型リベース
Git ワークフローの概要については、 Azure Repos Git チュートリアルを参照してください。
[前提条件]
カテゴリ | Requirements |
---|---|
プロジェクトへのアクセス権 | プロジェクトのメンバー。 |
アクセス許可 | - プライベート プロジェクトのコードを表示する: 少なくとも Basic アクセス。 - プライベート プロジェクトのコードを複製または投稿する: 共同作成者 セキュリティ グループのメンバー、またはプロジェクト内の対応するアクセス許可。 - ブランチまたはリポジトリのアクセス許可を設定する: ブランチまたはリポジトリの アクセス許可を管理 します。 - 既定のブランチを変更する: リポジトリ のポリシー のアクセス許可を編集します。 - リポジトリをインポートする: プロジェクト管理者 セキュリティ グループのメンバーまたは Git プロジェクト レベルの [リポジトリ の作成 ] アクセス許可が [許可] に設定されています。 詳細については、「Git リポジトリのアクセス許可を設定する」を参照してください。 |
サービス | リポジトリが有効になっています。 |
ツール | Optional. az repos コマンドを使用する: Azure DevOps CLI。 |
注
パブリック プロジェクトでは、 利害関係者 アクセス権を持つユーザーは、コードの表示、複製、投稿など、Azure Repos へのフル アクセス権を持ちます。
カテゴリ | Requirements |
---|---|
プロジェクトへのアクセス権 | プロジェクトのメンバー。 |
アクセス許可 | - コードの表示: 少なくとも 基本 アクセス。 - コードの複製または投稿: 共同作成者 セキュリティ グループのメンバー、またはプロジェクト内の対応するアクセス許可。 |
サービス | リポジトリが有効になっています。 |
ローカル ブランチのリベース
Git リベース は、ソース ブランチからのコミットを現在のローカル ブランチ (ターゲット ブランチ) に統合します。 ソース ブランチは変更されません。 比較のために、Git リベースとその他のマージの種類を次の図に示します。
Git リベースでは、ターゲット ブランチのコミット履歴が再シーケンスされるため、すべてのソース ブランチコミットが含まれ、最後の共通コミット以降のすべてのターゲットブランチコミットが格納されます。 これを表示するもう 1 つの方法は、ソース ブランチ履歴の上にターゲット ブランチの変更をリベースで再生することです。 特に、Git リベースでは、既存のターゲット ブランチ コミットのシーケンスが変更されます。これは、他のマージ戦略の場合ではありません。 上の図では、コミット K' には K と同じ変更が含まれていますが、C ではなくコミット E にリンクするため、新しいコミット ID が含まれています。
リベース中に、ソース ブランチの変更がターゲット ブランチの変更と競合する場合、 Git はマージの競合を解決するように求められます。 リベース中のマージ競合は、マージ中のマージ競合を解決するのと同じ方法で解決できます。
Rebase vs. no-fast-forward merge
Git リベースを行うと、 高速 なマージ ( 3 方向 または真のマージと呼ばれる) よりも単純だが正確 な コミット履歴が得られます。 コミット履歴にマージのレコードが必要な場合は、早送りなしのマージを使用します。
機能またはバグ修正ブランチで作業している唯一のユーザーの場合は、リベースを使用して、最近の main
ブランチの作業を定期的に統合することを検討してください。 この戦略は、他のユーザーによる最近の作業を常に把握し、発生したマージの競合を迅速に解決するのに役立ちます。 リベースすることで、最新の main
ブランチ作業の上に新しい機能を実装し、線形コミット履歴を維持するのに役立ちます。
Git のリベースとそれを使用するタイミングの詳細については、「 Rebase と merge」を参照してください。
リベースと強制プッシュのガイドライン
以前 にプッシュしたローカル ブランチをリベースし、既定の Git プッシュ コマンドをもう一度実行すると、プッシュは失敗します。 既定の Git プッシュ コマンドでは、高速マージを適用して、ローカル ブランチをリモート ブランチに統合します。 リベースによってローカル ターゲット ブランチ内の既存のコミットのシーケンスが変更されるため、そのコマンドはリベース後に失敗します。そのため、リモート の対応するコミットの履歴と一致しなくなります。 このシナリオでは、リモート ブランチを上書きすることで 強制プッシュ が成功します。
Git のリベースと強制プッシュは強力なツールですが、使用するかどうかを決定するときは、次のガイドラインに留意してください。
- 誰も共有ブランチを使用していないと確信している場合を除き、プッシュされて他のユーザーと共有されているローカル ブランチをリベースしないでください。 リベース後、ローカル ブランチは、対応するリモートブランチの履歴と一致しなくなります。
- リモート ブランチのローカル バージョンが更新されたリモート ブランチ履歴と一致しなくなったため、他のユーザーが使用しているリモート ブランチにプッシュを強制しないでください。
- チームは、リベースと強制プッシュの使用シナリオに同意する必要があります。
ヒント
コラボレーション レビュー プロセスの場合は、 pull request を使用して、リモート リポジトリの既定のブランチに新しい作業をマージします。
リベースする方法
Visual Studio 2022 では、Git メニュー、Git の変更、およびソリューション エクスプローラーのコンテキスト メニューを使用して、Git バージョン管理エクスペリエンスが提供されます。 Visual Studio 2019 バージョン 16.8 には、 チーム エクスプローラー の Git ユーザー インターフェイスも用意されています。 詳細については、「 Visual Studio 2019 - チーム エクスプローラー 」タブを参照してください。
[ Git] > [ブランチの管理 ] を選択して、[ Git リポジトリ] ウィンドウを 開きます。
[Git リポジトリ] ウィンドウで、ターゲット ブランチを右クリックし、[チェックアウト] を選択します。
ソース ブランチを右クリックし、[ rebase <target-branch> を選択 <source-branch>。
再ベースが成功すると、Visual Studio に確認メッセージが表示されます。
マージの競合が原因でリベースが停止した場合、Visual Studio から通知されます。 競合を解決するか、リベースを取り消して、事前リベース状態に戻すことができます。
リベース後にローカル ブランチを強制的にプッシュする
以前にプッシュしたローカル ブランチをリベースすると、後続の既定の Git プッシュは 失敗します。 代わりに、ローカル ブランチを強制的にプッシュして、対応するリモートブランチを上書きして、コミット履歴が一致するようにすることができます。
Warnung
他のユーザーが作業しているブランチを強制的にプッシュしないでください。 詳細については、「 リベースと強制プッシュのガイドライン」を参照してください。
Visual Studio で強制的にプッシュするには、最初に強制プッシュ オプションを有効にする必要があります。
Tools>Options>Source Control>Git グローバル設定に移動します。
[プッシュ --force-with-lease を有効にする] オプションを選択します。
Git プッシュ --force-with-lease
フラグは、強制的にプッシュするローカル ブランチ内に統合されていないコミットを持つリモート ブランチを上書きしないため、 --force
フラグよりも安全です。
ローカル コミットをスカッシュするための対話型リベース
通常、ローカル機能ブランチで新しい機能に取り組む際に、複数のコミットを作成します。 新しい機能を発行する準備ができたら、コミット履歴を簡略化するために、それらのコミットを 1 つのコミットに統合することができます。 対話型のリベースを使用して、複数のコミットを 1 つのコミットに スカッシュ することができます。
Visual Studio 2022 では、対話型リベイシングはサポートされていません。 代わりに Git コマンド ラインを使用してください。
注
Azure DevOps ユーザーは マージをスカッシュ して、プル要求中にトピック ブランチのコミット履歴を要約できます。