Gitのpullとpushを試してみる
Gitのpullとpushを試してみる。
準備
GitHubのリポジトリのcloneを、ディレクトリ名を変えて2つ作成する。
$ git clone https://github.com/ユーザー名/sample.git sample1 $ git clone https://github.com/ユーザー名/sample.git sample2
configを編集し「ユーザー名@」を追加しておく。(詳細は前回の記事参照)
$ vi sample1/.git/config $ vi sample2/.git/config
現在、sample.txtのファイルが1つある状態。
$ cd sample1 $ cat sample.txt 111 222 333
push
変更してコミットする。
$ vi sample.txt 111 222 333 444 $ git commit -a -m '444を追加'
git push
$ git push Password: Counting objects: 5, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 304 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To https://yk5656@github.com/yk5656/sample.git e779498..d0cf66f master -> master
pull
2つ目のほうに移動。
$ cd ../sample2
git pull
でリポジトリが最新の状態になる。
$ git pull Password: remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 3 (delta 0) Unpacking objects: 100% (3/3), done. From https://github.com/yk5656/sample e779498..d0cf66f master -> origin/master Updating e779498..d0cf66f Fast-forward sample.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
444が追加されているのが確認できる。
$ cat sample.txt 111 222 333 444
同時に更新した場合
まず、1つ目のほうで修正してコミット。
$ cd ../sample1 $ vi sample.txt 111 OOO OOO 444 $ git commit -a -m 'OOOに修正'
次に、2つ目のほうで修正してコミット。
$ cd ../sample1 $ vi sample.txt 111 XXX XXX 444 $ git commit -a -m 'XXXに修正'
1つ目のほうをpushすると成功する。
$ cd ../sample1 $ git push Password: Counting objects: 5, done. Compressing objects: 100% (2/2), done. Writing objects: 100% (3/3), 303 bytes, done. Total 3 (delta 0), reused 0 (delta 0) To https://yk5656@github.com/yk5656/sample.git d0cf66f..75b1edf master -> master
2つ目のほうをpushしようとするとエラーになる。
$ cd ../sample2 $ git push Password: To https://yk5656@github.com/yk5656/sample.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://yk5656@github.com/yk5656/sample.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details.
競合の解消
pullで最新の情報を取得すると競合が発生する。
$ git push Password: To https://yk5656@github.com/yk5656/sample.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://yk5656@github.com/yk5656/sample.git' To prevent you from losing history, non-fast-forward updates were rejected Merge the remote changes before pushing again. See the 'Note about fast-forwards' section of 'git push --help' for details. [dev@localhost sample2]$ git pull Password: remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 3 (delta 0) Unpacking objects: 100% (3/3), done. From https://github.com/yk5656/sample d0cf66f..75b1edf master -> origin/master Auto-merging sample.txt CONFLICT (content): Merge conflict in sample.txt Automatic merge failed; fix conflicts and then commit the result.
sample.txtの中身は下記のようになっている
$ cat sample.txt 111 <<<<<<< HEAD XXX XXX ======= OOO OOO >>>>>>> 75b1edfe4d9539ff4cdd8d229056b755bb6ce52d 444
修正しなおして、コミットする。
$ vi sample.txt 111 XXX XXX 444
$ git commit -a -m '改めてXXXに修正' [master 4863a23] 改めてXXXに修正
改めてpushすると成功する。
$ git push Password: Counting objects: 8, done. Compressing objects: 100% (3/3), done. Writing objects: 100% (4/4), 438 bytes, done. Total 4 (delta 1), reused 0 (delta 0) To https://yk5656@github.com/yk5656/sample.git 75b1edf..4863a23 master -> master
一応、1つ目のほうでもpullしておくと、反映されているが確認できる。
$ cd ../sample1 $ git pull $ cat sample.txt 111 XXX XXX 444
fetchとmerge
git pullの中身は
git fetch + git merge origin/master
1つ目のほうで修正し、コミットして、pushする。
$ cd ../sample1 $ vi sample.txt 111 XXX XXX 444 555 $ git commit -a -m '555を追加' $ git push
2つ目のほうでリモートのログを確認すると下記のようになっている。
$ cd ../sample2 $ git log origin commit 4863a23b90ccaa9a5d181e429cb5257d8ecfa0ac Merge: c14c963 75b1edf Author: Your Name <you@example.com> Date: Mon Mar 3 14:02:08 2014 +0900 改めてXXXに修正 ・・・
fetchする。
$ git fetch Password: remote: Counting objects: 5, done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 3 (delta 0) Unpacking objects: 100% (3/3), done. From https://github.com/yk5656/sample 4863a23..fae6c92 master -> origin/master
ログをみるとリモートのほうに反映されているが、
ファイルは更新されていない。
$ git log origin commit fae6c9291cbaf45d8fe59c49bdfbc9db4116a103 Author: Your Name <you@example.com> Date: Mon Mar 3 14:12:19 2014 +0900 555を追加
$ cat sample.txt 111 XXX XXX 444
merge するとファイルが更新される。
$ git merge origin/master Updating 4863a23..fae6c92 Fast-forward sample.txt | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
$ cat sample.txt 111 XXX XXX 444 555