ローカルリポとリモートリポのリンク
ローカルとリンクしてるリモートリポの確認
git remote -v
cloneすると、自動的に登録されるはず。
ローカルトリンクしてるリモートリポの追加
git remote add <ref_name> <repository_url>
upstream
最新情報のやり取り
それぞれ情報を送ることを、次のようにいう。
ローカル → リモート:push
リモート → ローカル:fetch
なお、fetch + merge = pull である。
ローカルがリモートから遅れていると、pushできない。
pullしてリモートの情報を最新にしてからpushする必要がある。
pullしたときにコンフリクトが起こることはよくある。
リモート → ローカル:fetch
fetchをすると、ローカルの次のブランチが更新される。
remotes/<remote_ref>/<branch_name>
<remote_ref>は、大体origin。
git fetch remote_ref
remote_ref:
originとか.デフォはorigin.
プルする
ローカル→リモートへ更新する前に,リモートで更新されている分をローカルに反映させる.
git pull remote branch
# よく使うやつ
git pull origin main
今のワーキングブランチに反映される.
remoteは,リモートリポのこと.git remote -v
で出力されるものを指定すれば良い.大体origin
のはず.
branchは,リモートリポのブランチのこと.大体main
のはず.
この時はどうなる?
ローカルで別のブランチを切った
初期状態:
リモート:A←(main)
ローカル:A←(main)
編集後の状態:
リモート:A-B←(main)
ローカル:A ←(main)
┗C ←(test)
(リモートで誰かがコミット、同時にローカルで自分がtestブランチを作成してコミット)
この状態でmainをpullするとコンフリクト生じる。
ローカルのAが、リモートで初期状態でAだったのに、Bに変更されてるからと考えればよいか。
Cの変更を適用して、コンフリクトを解消(Cはマージコミット)すると、編集後の(ローカルが遅れた)状態になった。pushすれば、リモート:A-Bでなく、A-Cになる。
リモート、ローカルで別々のブランチを切ってる。
初期状態:
リモート:A←(main)
ローカル:A←(main)
編集後の状態:
リモート:A←(main)
┗B←(remote-test)
ローカル:A ←(main)
┗C ←(local-test)
この状態でmainをpullするとコンフリクト生じない。
この状態でremote-testをpullするとコンフリクト生じる。(←これをpullする必要がないのか)
Cの変更を適用して、コンフリクトを解消(Cはマージコミット)すると、編集後の状態になった。
とにかく同じファイルを別のブランチで編集するのはあまりよくないということ。
別の人のリモートリポを自分のリモートリポにコピーする:フォーク
相手のGitHubにあるFolkボタンをクリックする.
ローカルにクローンするときは,この自分のリモートリポにフォークしたものをクローンする。
フォーク元のリポジトリに変更を適用していく場合は、フォーク元のリポをupstreamとしてローカルに登録することが多い。また、フォーク元のリポジトリのものをプルする場合もある。
git remote add upstream http/or/ssh.git
リモートでマージ:プルリクエスト
別の人のリモートリポをフォークしている場合、プルリクエストを送ると元のリモートに行く場合があるので要注意。baseとcompareを要チェック。
プルリクエスト時は、チームメンバーのレビューを受けることができる。
gitではフォーク元のリポジトリへの作成するのがデフォになってるので注意.
プルリクエスト作成画面で,自分のリモートリポに出すようにする.
ローカルのブランチをリモートリポにマージしたら,
ローカルのmasterにそのリモートリポと足並みを揃えたいので,pullしましょう.
フォーク元へのプルリクエスト
1.ローカルリポでcommit
2.フォーク元をpull
3.自リモートリポにpush
4.フォーク元にプルリクエスト
git