Gitのpullとpushを試してみる

GitHubにリポジトリを作成してみる
の続き

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

GitHubリポジトリに反映される

$ 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