読者です 読者をやめる 読者になる 読者になる

delalunaofficedaysのブログ

WORDPRESSとEC CUBEくらいしか触っていないWEBデザイナーの日記とかメモ。

Gitにもう少し慣れる

独り言

ゴールデンウィークに帰省しています。 DELLのLATITUDE E5500にGitを入れるついでに再度勉強。 あるWEBサービスを運営するために今後このノートが重要な役目を果たすことになると思う。 かなり古いノートPCだけど持ち運びとディスプレイ解像度・スペックの面を含めてメインノートに昇格させる。(本当はMacBookProとかでかっこつけたいお)15インチで結構重いけど重さに関しては気合で何とかなる方針。むしろこのボロいノートで限界を感じるまで頑張った方がかっこいい気すらする。

本題

そもそもEC Cube3の内部を弄ってみたくてついでにGitで管理しようかなって思い、この作戦を遂行する。

[code] $ git init $ git config –global user.email "メールアドレス" $ git config –global user.name "ユーザー名" [/code]

だけやっておきました。 git01

[code] $ git add . [/code]

ステージング作業。

  • 「.」 変更・新規作成分を登録
  • 「-A」フォルダの中身を一括登録
  • 「-u」変更したファイルのみ登録
  • 「-p」変更した部分を指定して登録

らしいです。

ちなみにWindowsではadd実行時に 「The file will have its original line endings in your working directory.」 「warning: LF will be replaced by CRLF in (パス).」 みたいなwarningが出ると思います。

[code] git config –global core.autoCRLF false [/code]

で改行コードの変換を無効にできますが個人的には特に気にならないのでそのままにしてあります。 ステージングができたら現在どのような状態になっているのかチェック。

[code] $ git status [/code]

git02

なんかnew fileたちがバーッと出ます。この画面かっこいいですね。 ってことはステージングできてるぜーって事みたいなので早速ローカルリポジトリにコミットしてみますか。 ひとまずこのコマンドだけ覚えておく。 [code] $ git commit -m "コメントを書けます" [/code] 間違ってコミットした場合は、git resetで取り消せる。

コメント付きでコミット git03 だーっと文字が流れてこの状態。 これでコミットできたかな。 ちょっとチェックしてみます。 [code] $ git log [/code]

  • git log --oneline
  • git log -p(変更した場所を見たい場合)
  • git log --stat(より詳しく変更した場所を見たい場合)

これでローカルリポジトリは完成。

後はリモートリポジトリの方にバックアップを取りたいので 予めBitBucketの方でリモートリポジトリを作成しておきます。 git04 作成の仕方についてはグーグル先生に聞けば無限に情報があります。

[code] git remote add origin https://あなたのアカウント@bitbucket.org/あなたのアカウント/eccube3.git [/code]

みたいな感じで登録できるはず・・・ 登録できたみたいなので [code] $ git push origin master [/code] git05 おやっなんか動き始めた。

git06 BitBucketにログインしてくれやってことでしょうか。

ログインしてみたら git07 出来たっぽいです(?) BitBucketのサイトで確認(30秒くらい反映されないです)

git09

git08

出来てるゥー!

ブランチを作ります。 複数の作業履歴を並行して保存していく場合のための手法。

[code] $ git branch first [/code]

こんな感じで"first"って名前のブランチを作ります。

[code] $ git checkout first [/code]

これで"first"ブランチに切り替え。

masterに戻りたいときはこんな感じ git10

[code] $ git branch -a [/code] これで今現在カレントブランチがどこなのか、今存在するブランチはどれだけあるのかが確認できます。 切り替えて遊んでみました。

ほんでブランチってのは何なのか。 “ブランチとは、履歴の流れを分岐して記録していくためのものです。分岐したブランチは他のブランチの影響を受けないため、同じリポジトリ中で複数の変更を同時に進めていくことができます。” という分かりやすい説明があった。

masterというブランチに基本的にメインのバージョンを置いていくことになりますねはい。

firstのブランチを更新してcommitした時点でHEADがfirstにいる状態になる。 現時点で最新版であるfirstブランチでの更新をmasterにmergeしてみる [code] $ git checkout master Switched to branch ‘master’ $ git merge first Updating なんとか Fast-forward 更新内容~みたいな [/code]

これでマージ完了。 あとは更新されているかどうかファイルをチェックする。

masterブランチの指すコミットがfirstと同じ位置に移動しました。 firstブランチは更新用として用意したのでこちらはもう要らない、という判断になったとします。

ブランチを削除したい場合 [code] $ git branch -d first Deleted branch issue1 (wasなんとか) [/code]

masterに最終的に統合する目的でバグフィックスや追加機能などをトピックブランチとして用意して使う、という目的が自分には向いているようです。 追加機能等うまくいかなかったら一旦masterに戻って考え直す・・・みたいな感じです。

後はpullコマンドだけ覚えようと思う。

  • second
  • third
  • master(もともと存在する)

とbranchを作って secondを更新してaddしてcommit。 そしてthirdも更新してaddしてcommit。 これでsecondとthirdは違う内容になってそれぞれの道を歩んでいく・・・。

masterにsecondで追加した機能をmergeする。 [code] $ git checkout master $ git merge second [/code]

さらにmasterにthirdで追加した機能をmergeする。 [code] $ git checkout master $ git merge third Auto-merging myfile.txt CONFLICT (content): Merge conflict in それぞれのbranchで更新したファイル Automatic merge failed; fix conflicts and then commit the result. [/code]

するとコンフリクトエラーが起きる。 同じファイルの同じ行に違う内容が更新されているから、 と言う事になる。

[code] secondとthirdで更新していた内容 <<<<<<< HEAD

secondのみで更新していた内容

thirdのみで更新していた内容 >>>>>>> third [/code]

このようにファイルの内容が変更されるので、 「ああ、なるほどsecondに他の誰かが機能追加したんだな。手動でマージしておこう」と呟きながら

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 thirdのみで更新していた内容 [/code]

と変更する。 これでsecondとthirdで更新していた内容が両方masterに追加された。 ここまで出来たらmasterをaddしてcommit -mする。 現時点で

second

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 [/code]

third

[code] secondとthirdで更新していた内容 thirdのみで更新していた内容 [/code]

master

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 thirdのみで更新していた内容 [/code]

こんな状態になる。

secondブランチをマージするとき、thirdブランチをあらかじめrebaseしていれば履歴を一本にすることもできた・・と言う事なのでやってみる。 [code] $ git reset –hard HEAD~ [/code]

これで先ほどのコミットをキャンセル。 この時点で

second

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 [/code]

third

[code] secondとthirdで更新していた内容 thirdのみで更新していた内容 [/code]

master

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 [/code] となってmasterとsecondが同じという状態、thirdだけがまだマージされていない状態となる。

thirdをマージしたいのでまずはthirdに移動する。 [code] $ git checkout third [/code]

thirdをrebaseする。 [code] $ git rebase master [/code]

これで何やかんや「現在のmasterと競合があるよ」というエラーが出る。 同時にthirdの競合があるファイルに自動的にどこが競合しているか追加される。

third

[code] secondとthirdで更新していた内容 <<<<<<< 6c7f072099714a5f91823df22f691e857df4bfd2

secondのみで更新していた内容

thirdのみで更新していた内容 >>>>>>> その時のコメント [/code]

みたいな表現になっています。 ので、修正します。

third

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 thirdのみで更新していた内容 [/code] はい、これをmasterの最新版としてmergeしたいわけです。 addしてcommit・・・ではなく、rebase –continueします。

[code] (third) $ git rebase –continue Applying: その時のコメント [/code]

これでmasterにマージ出来る状態です。 [code] $ git checkout master Switched to branch ‘master’ $ git merge third Updating 8f7aa27..96a0ff0 Fast-forward 更新したファイル | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) [/code]

これで

second

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 [/code]

third

[code] secondとthirdで更新していた内容 thirdのみで更新していた内容 [/code]

master

[code] secondとthirdで更新していた内容 secondのみで更新していた内容 thirdのみで更新していた内容 [/code] となる。

リモートにpush

[code] $ git push [リモートリポジトリ] [ローカルのブランチ名]:[リモートのブランチ名] [/code] ってな感じでリポジトリにpushするらしいです。 [code] git remote add origin https://ユーザー名@bitbucket.org/ユーザー名/リポジトリ名.git git push origin master [/code]

こんな感じ。なんかごちゃごちゃとやらかしていてfatal: remote origin already exists. エラーが出る場合は [code] $ git remote rm origin $ git remote add origin git@github.com:ユーザ名/リポジトリ名.git $ git push -u origin master [/code]