リモートリポジトリーに対する変更の競合とマージ
リモートリポジトリーの作成とクローン
リモート(GitHub)にリポジトリーを作成し、README.mdの内容を編集。
README.md : Test for conflict and merge
ローカルのuser1、user2ディレクトリーにリモートの内容をクローン(2人のユーザーが並行して作業するイメージ)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[vagrant@localhost git]$ git clone git@github.com:taustation/test user1 Cloning into 'user1'... remote: Enumerating objects: 16, done. remote: Counting objects: 100% (16/16), done. remote: Compressing objects: 100% (8/8), done. remote: Total 16 (delta 0), reused 6 (delta 0), pack-reused 0 Receiving objects: 100% (16/16), done. [vagrant@localhost git]$ git clone git@github.com:taustation/test user2 Cloning into 'user2'... remote: Enumerating objects: 16, done. remote: Counting objects: 100% (16/16), done. remote: Compressing objects: 100% (8/8), done. remote: Total 16 (delta 0), reused 6 (delta 0), pack-reused 0 Receiving objects: 100% (16/16), done. |
競合がないファイル追加
ユーザーによるファイルの追加
user1によるファイル追加・コミット・プッシュ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[vagrant@localhost user1]$ cat sample1.txt user1によるファイル追加 [vagrant@localhost user1]$ git add . [vagrant@localhost user1]$ git commit -m "Added sample1.txt" [main d1776cf] Added sample1.txt 1 file changed, 1 insertion(+) create mode 100644 sample1.txt [vagrant@localhost user1]$ git push Enumerating objects: 4, done. Counting objects: 100% (4/4), done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 315 bytes | 315.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To github.com:taustation/test c5f7ea7..d1776cf main -> main |
この結果、GitHub上でsample1.txt
の追加が確認できる。
別ユーザーによる別ファイルの追加
user1によりファイルが追加された後、user2によりファイルを追加・コミットし、プッシュしようとするとエラーになる。
リモートで他の作業が行われためと通知され、プルすることが提案されている。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[vagrant@localhost user2]$ cat sample2.txt user2によるファイル追加 [vagrant@localhost user2]$ git add . [vagrant@localhost user2]$ git commit -m "Added sample2.txt" [main 2bfb2af] Added sample2.txt 1 file changed, 1 insertion(+) create mode 100644 sample2.txt [vagrant@localhost user2]$ git push To github.com:taustation/test ! [rejected] main -> main (fetch first) error: failed to push some refs to 'git@github.com:taustation/test' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. |
ローカルでのマージ
user2でリモートからプルすると、エディター画面が開いて以下の様に表示される。
1 2 3 4 5 6 7 8 9 10 11 12 |
Merge branch 'main' of github.com:taustation/test into main # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. # # Lines starting with '#' will be ignored, and an empty message aborts # the commit. ~ ~ ..... ~ ~ "~/git/user2/.git/MERGE_MSG" 6L, 286C |
エディターを抜けてコマンドラインに戻り、プルの実行過程を確認。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost user2]$ git pull remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. From github.com:taustation/test c5f7ea7..d1776cf main -> origin/main Merge made by the 'recursive' strategy. sample1.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 sample1.txt |
ワーキングディレクトリーを確認すると、user1が追加したsample1.txt
が追加されている。
1 2 3 4 5 6 7 8 9 10 |
[vagrant@localhost user2]$ ls -Al 合計 12 drwxrwxr-x. 8 vagrant vagrant 220 8月 6 14:00 .git -rw-rw-r--. 1 vagrant vagrant 28 8月 6 13:49 README.md -rw-rw-r--. 1 vagrant vagrant 33 8月 6 13:58 sample1.txt -rw-rw-r--. 1 vagrant vagrant 33 8月 6 13:53 sample2.txt [vagrant@localhost user2]$ cat sample1.txt user1によるファイル追加 [vagrant@localhost user2]$ cat sample2.txt user2によるファイル追加 |
マージ後のステータス
マージ後のステータスは、2つのコミット(sample2.txt
の作成とマージ)がされていて、プッシュが提案されている。
1 2 3 4 5 6 |
[vagrant@localhost user2]$ git status On branch main Your branch is ahead of 'origin/main' by 2 commits. (use "git push" to publish your local commits) nothing to commit, working tree clean |
ログで確認した結果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
commit 5b0bd5067f20cb27932de1198b3b3e30d5de3f8c (HEAD -> main) Merge: 2bfb2af d1776cf Author: taustation <taustation@gmail.com> Date: Fri Aug 6 18:58:42 2021 +0900 Merge branch 'main' of github.com:taustation/test into main commit 2bfb2af10fac5ae7d895c6670be085496d2f16e3 Author: taustation <taustation@gmail.com> Date: Fri Aug 6 18:54:03 2021 +0900 Added sample2.txt ..... |
コミットのプッシュ
2つのコミットをプッシュ。この結果、GitHub上でもsample1.txt
とsample2.txt
が反映される。
1 2 3 4 5 6 7 8 9 |
[vagrant@localhost user2]$ git push Enumerating objects: 7, done. Counting objects: 100% (7/7), done. Compressing objects: 100% (4/4), done. Writing objects: 100% (5/5), 566 bytes | 566.00 KiB/s, done. Total 5 (delta 1), reused 0 (delta 0) remote: Resolving deltas: 100% (1/1), done. To github.com:taustation/test d1776cf..5b0bd50 main -> main |
同一ファイルへの変更の競合
ユーザーによるファイル編集
ワーキングディレクトリーuser1でプル。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[vagrant@localhost user1]$ git pull remote: Enumerating objects: 7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (3/3), done. remote: Total 5 (delta 1), reused 5 (delta 1), pack-reused 0 Unpacking objects: 100% (5/5), done. From github.com:taustation/test d1776cf..5b0bd50 main -> origin/main Updating d1776cf..5b0bd50 Fast-forward sample2.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 sample2.txt |
user1としてREADME.md
の内容を編集。
1 2 3 |
[vagrant@localhost user1]$ cat README.md Test for conflict and merge user1が1行追加 |
編集結果をステージング、コミット、プッシュ。
1 2 3 4 5 6 7 8 9 10 11 12 |
[vagrant@localhost user1]$ git add . [vagrant@localhost user1]$ git commit -m "Modified README.md by user1" [main 2d9f8f9] Modified README.md by user1 1 file changed, 1 insertion(+) [vagrant@localhost user1]$ git push Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 366 bytes | 366.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To github.com:taustation/test 5b0bd50..2d9f8f9 main -> main |
この結果、GitHub上でREADME.md
の内容が変更されているのを確認。
別ユーザーによる同じファイルの編集
user1によりREADME.md
が編集された後、user2により同じファイル編集し、コミット、プッシュしようとすると、ファイル追加の時と同じようにエラーになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[vagrant@localhost user2]$ cat README.md Test for conflict and merge user2が1行追加 [vagrant@localhost user2]$ git add . [vagrant@localhost user2]$ git commit -m "Modified README.md by user2" [main 01cd522] Modified README.md by user2 1 file changed, 1 insertion(+) [vagrant@localhost user2]$ git push To github.com:taustation/test ! [rejected] main -> main (fetch first) error: failed to push some refs to 'git@github.com:taustation/test' hint: Updates were rejected because the remote contains work that you do hint: not have locally. This is usually caused by another repository pushing hint: to the same ref. You may want to first integrate the remote changes hint: (e.g., 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. |
ローカルでのマージに競合
user2で編集した内容はそのままでリモートリポジトリーからプル。README.md
をマージしようとして、競合が発生したため、競合を解消してコミットするよう示唆している。
1 2 3 4 5 6 7 8 9 10 11 |
[vagrant@localhost user2]$ git pull remote: Enumerating objects: 9, done. remote: Counting objects: 100% (9/9), done. remote: Compressing objects: 100% (6/6), done. remote: Total 7 (delta 1), reused 6 (delta 0), pack-reused 0 Unpacking objects: 100% (7/7), done. From github.com:taustation/test 5b0bd50..380b550 main -> origin/main Auto-merging README.md CONFLICT (content): Merge conflict in README.md Automatic merge failed; fix conflicts and then commit the result. |
README.mdの内容を確認すると、user2の変更内容の反映を試み、その下に競合内容も追加されている。
1 2 3 4 5 6 7 |
[vagrant@localhost user2]$ cat README.md Test for conflict and merge <<<<<<< HEAD user2が1行追加 ======= user1が1行追加 >>>>>>> 380b550b9991d18edf4c56fbe8ba9200da312f5d |
手動で競合を修正してプッシュ
ファイルを修正し、コミット・プッシュ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[vagrant@localhost user2]$ cat README.md Test for conflict and merge user1が1行追加 user2が1行追加 [vagrant@localhost user2]$ git add . [vagrant@localhost user2]$ git commit -m "Manually merged" [main 31311a7] Manually merged [vagrant@localhost user2]$ git push Enumerating objects: 11, done. Counting objects: 100% (11/11), done. Compressing objects: 100% (6/6), done. Writing objects: 100% (7/7), 1.05 KiB | 1.05 MiB/s, done. Total 7 (delta 0), reused 0 (delta 0) To github.com:taustation/test 380b550..31311a7 main -> main |
README.mdをマージした結果はGitHub上で確認できる。