git 別リポジトリのコミットをできる限り安全に取り込む（同期する）


# 概要

- GitHub内の別リポジトリのコミットを取り込む（こちらで説明）
- GitHubとGitLabを跨いだ別リポジトリのコミットを取り込む

上記のようなパターンがあるかと思いますが、どちらにも適用できます。

# 手順

## （手順１）コマンドで登録

```:リモートアドレスの確認
% git remote -v
origin  git@github.com:hogehoge/repository_name_a.git (fetch)
origin  git@github.com:hogehoge/repository_name_a.git (push)
```

```:取り込み先リポジトリの登録
% git remote add copy_to_repo git@github.com:hogehoge/repository_name_b.git
```

```:再度リモートアドレスの確認
% git remote -v
copy_to_repo    git@github.com:hogehoge/repository_name_b.git (fetch)
copy_to_repo    git@github.com:hogehoge/repository_name_b.git (push)
origin  git@github.com:hogehoge/repository_name_a.git (fetch)
origin  git@github.com:hogehoge/repository_name_a.git (push)
```

```:ブランチの確認（mainブランチのコミットを対象とします）
% git branch
  develop
* main
```

```:新しくブランチを作成
% git checkout -b merge_repo_branch
Switched to a new branch 'merge_repo_branch'
```

```:再度ブランチの確認
% git branch
  develop
  main
* merge_repo_branch
```

```:取り込み先リポジトリへプッシュ
% git push copy_to_repo merge_repo_branch
...
Enumerating objects: 4321, done.
Counting objects: 100% (4321/4321), done.
Delta compression using up to 10 threads
...
remote: 
To github.com:hogehoge/repository_name_b.git
 * [new branch]      merge_repo_branch -> merge_repo_branch
```

新ブランチなのでプッシュするのも躊躇しなくて良い。（直接上書きされちゃう、とかない）

## （手順２）GitHubで確認

プッシュ先の `GitHub` > `repository_name_b` ページで確認。（お、届いていますね。:point_down:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/e5f06edf-f5d6-328f-c40c-c7701d7ed563.png)


## （手順３）コンフリクト解消

あとは、プルリクエストを作成・マージし終わり！...という簡単にはいきませんよね。
みなさん大好きのコンフリクトの面倒を見ていく必要があります。

`repository_name_b` リポジトリをクローンしてある場所へ移動し、コンフリクトを解消フェーズへ...

```
% cd repository_name_b

% git fetch 

% git branch -a
* main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/merge_repo_branch
```

↑出来立てほやほやの `merge_repo_branch` ブランチが見えますね。

```:コンフリクト解消用のブランチを作成（こちらもmainから分岐）
% git checkout -b confrict_resolve
Switched to a new branch 'confrict_resolve'
```

```:ブランチ確認
% git branch -a
* confrict_resolve
  main
  remotes/origin/HEAD -> origin/main
  remotes/origin/main
  remotes/origin/merge_repo_branch
```

```:いざマージ！そしてコンフリクト発生
% git merge origin/merge_repo_branch
CONFLICT (content): Merge conflict in aaaa/bbbb/コンフリクトしたファイルA.rb
CONFLICT (content): Merge conflict in aaaa/bbbb/コンフリクトしたファイルB.rb
CONFLICT (content): Merge conflict in aaaa/bbbb/コンフリクトしたファイルC.rb
....
Automatic merge failed; fix conflicts and then commit the result.
```

さて

```:コンフリクト解消中
コンフリクト解消がんばれ〜〜 VSCodeに頼ってください。
```

```:コンフリクト解消後はプッシュ
% git push origin confrict_resolve
```

## （手順４）プルリクエスト

プッシュ先の GitHub > repository_name_b ページで確認。（お、届いていますね。:point_down:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/91ddec4c-583e-ea97-f49e-eb1e6db4c071.png)


緑色のプルリクエストボタンから早速PR

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/4b59758e-81ec-4e80-a7b2-0f5a358d68d3.png)

ノーコンフリクト！（当たり前ですが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/72d8d5e7-2259-6ee3-e084-ab449e79ee5a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26033/1f7c96ac-4103-38bd-0f0f-641e4747c38d.png)

終了です。お疲れ様でした。

コツとしましては、常に確認することです。:wink: