例えば開発状態をまとめるdevelopブランチがあるとします。
次に、developからdevelop-customer(顧客管理)とdevelo-project(案件管理)という2つのブランチを同時に作りました。
同時に作ったので、2つのブランチの初期状態は同一です。
さて、ここからdevelop-customerを担当するAさんと、develop-projectを担当するBさんに分かれて作業します。
A&B(作業中……)
A「先に顧客管理が終わったので、develop-customerをdevelopにマージ(統合)します」
B「developが変更されたから、自分のブランチを最新のdevelopに合わせないとな」
さて、ここで派生元となるdevelopが更新されたので、develop-projectのスタート地点を最新バージョンに揃える必要があります。
お互いに異なるファイルだけを編集しているのであれば話は早いのですが、実際はお互いに同じファイルを編集することも珍しくありません。
そんなとき、異なるファイル同士を揃えて、さらに異なる編集を加えた同じファイルを統合する必要があります。
これを、gitではリベース(ベースの状態を最新すること)と言います。
VSCodeではGUIでやりやすくなっていますが、それでもコマンドを覚えたほうが、今自分が何をしているのか把握しやすいので是非覚えましょう。
コマンドと言っても手順は簡単です。
現在の作業内容をコミットしたら、以下を1行ずつ実行しましょう。
間違っても複数行をまとめて実行してはいけません。
// developブランチ(派生元)の最新情報を取得
git fetch origin
git checkout develop
git pull origin develop
// develop-projectブランチをdevelopブランチにリベース
git checkout develop-project
git rebase develop
さて、ここで同じファイルを編集していると、競合が発生してエラーが出てきます。
競合は手動で直しましょう。
競合を直したら、git add <修正したファイル名>
か、GUIでやるようにステージングします。
先程のリベースで一度失敗しているので、git rebase --continue
で再度リベースを実行します。
もし競合が残っていたら、同じように競合を直してステージング、リベースを再試行します。
さて、リベースが実行されると、おそらくvimなどでターミナル上に普段見かけない文字の羅列が表示されます。
// こんな文字列
編集:Task -> model, migrate, controller
作成:view/task
作成:Taxonomy -c -m
編集:Taxonomy -> model, migrate, controller
編集:view/taxonomy
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# interactive rebase in progress; onto 5936559
# Last command done (1 command done):
# pick df8490a 作成:Project -c -m 編集:web 編集:navigation 編集:Project -> model, migrate, controller 作成:view/project 作成:Task -c -m 編集
:Task -> model, migrate, controller 作成:view/task 作成:Taxonomy -c -m 編集:Taxonomy -> model, migrate, controller 編集:view/taxonomy
# No commands remaining.
# You are currently rebasing branch 'develop-project' on '5936559'.
#
# Changes to be committed:
# new file: app/Http/Controllers/ProjectController.php
# new file: app/Http/Controllers/TaskController.php
# new file: app/Http/Controllers/TaxonomyController.php
# new file: app/Models/Project.php
# new file: app/Models/Task.php
# new file: app/Models/Taxonomy.php
# new file: database/migrations/2024_08_26_195730_create_projects_table.php
# new file: database/migrations/2024_08_26_200521_create_tasks_table.php
# new file: database/migrations/2024_08_26_200536_create_taxonomies_table.php
# modified: resources/views/navigation-menu.blade.php
# new file: resources/views/project/create.blade.php
# new file: resources/views/project/edit.blade.php
# new file: resources/views/project/index.blade.php
# new file: resources/views/project/show.blade.php
# new file: resources/views/task/create.blade.php
# new file: resources/views/task/edit.blade.php
# new file: resources/views/task/index.blade.php
# new file: resources/views/task/show.blade.php
# new file: resources/views/taxonomy/index.blade.php
# new file: resources/views/taxonomy/project/edit.blade.php
# modified: routes/web.php
#
編集:Task -> model, migrate, controller
中身が分かる人はクソコメントを無視してください(汗)
さて、このようなのが表示されたら、vimと同じで:wq
を入力してEnterを押します。
もしINSERTというのが見えたら、インサート(入力)状態なので、一度escキーを押してインサートを脱出してから:wq
しましょう。
これで完了……するわけない。
リベースが実行されると、今度はプルが数件、プッシュがそれ以上出てくると思います。(逆のパターンもぼちぼちある)
プルはリベース語にリモートリポジトリとローカルリポジトリで内容に齟齬があるためですが、リモートリポジトリと同期すれば大体は解決できます。
プッシュはリベースによってローカルリポジトリに変更が加わったので、リモートリポジトリにこの変更を適用することで解決します。
ではまず、リモートリポジトリの内容をローカルリポジトリに反映するため、git pull
を実行します……が、またまたエラーです。
git pull
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
エラーの内容は「リモートブランチとローカルブランチに差異があるよ!」ということですが、んなこたぁ知ってらぁ。git config pull.rebase true
を実行してリモートリポジトリの内容をローカルブランチに適用させます。
そしたら再度git pull
を実行すると無事(?)解決できました。
コメント