Make IT Adventcalendar 22日目です。@moya0423が担当します。
この記事はGit(Hub) Private Repository 作成からConflict解消まで学生初心者向け(前編)の続きとなります。
まだ読んでいない方はこちらから読んでいただけると幸いです。
##リポジトリ関連・用語解説
master(マスター)やbranch(ブランチ)・push(プッシュ)など分からない用語が増えてきたので用語解説をします。
###Git cloneとは
git clone
とはリモートリポジトリ(共有セーブデータ)を丸ごと自身のローカルリポジトリ(個人セーブデータ)に持って来て保存するよ という命令文です。
文字だとイメージが付きにくいので実際にcloneしてみましょう。
Githubにあるリモートリポジトリから早速cloneしてみます。 画面右側にあるClone or DownloadからコードをコピーしてGit-Bashに貼り付けます。
cloneするコマンドは以下の通りです。
$ git clone "Githubからコピーしてきたコード"
実際にcloneした結果です。リモートリポジトリにあるファイルが全てローカルリポジトリに送信・保存されている事が確認できます。
###add/commitとは
$ git add
とはインデックスにファイルを追加するためのコマンドです。
$git commit
とはインデックスに追加されているファイルをコミット(個人セーブデータにセーブ)するためのコマンドです。
インデックス?コミット?とはなんぞやって話ですが文字だけでは説明が難しいので画像を交えて説明します。
Gitの管理下で実際に作業しているファイル/フォルダのことをワークツリーと呼びます。
Gitではワークツリーとリポジトリの間にインデックスが存在しています。
このインデックスでは$git add
されたファイルを保持します。
インデックスに保持された内容からリポジトリにコミット(個人セーブデータにセーブ)します。
####pull(プル)とは
リモートリポジトリ(共有セーブデータ)からデータをローカルリポジトリに送り込み、送り込んだデータをローカルリポジトリに反映させる(書き込む)処理です。
####push(プッシュ)とは
ローカルリポジトリにコミット(セーブ)されたファイル/フォルダをリモートリポジトリ(共有セーブデータ)にデータを送り込む処理です。pushの対はpullだと思われがちですが、正確にはfetchが対です。
####fetch(フェッチ)とは
リモートリポジトリ(共有セーブデータ)のファイル/フォルダをローカルリポジトリ(個人セーブデータ)にデータを送り込む処理です。
####merge(マージ)とは
pushやfetchされたデータを送信先へ取り込む・ブランチを統合する処理のことです。 直訳すると併合や合併です。
##branch(ブランチ)とは
直訳すると枝・支流です。
枝分かれさせることを「ブランチを切る」と言います。
ブランチには並行して別の作業を進める。
特定の課題を解決するためのブランチ(トピックブランチ)など使い方は多岐に渡ります。
画像のように中年ちゃんからブランチを切り、Aでは仕事をしている中年ちゃんを、Bでは筋トレをしている中年ちゃんを。のように中年ちゃんを分身させ別の作業を同時に進めるイメージです。
またmerge(結合)することによって「筋トレもして仕事もした中年ちゃん」を作成することが出来ます。
##早速リポジトリ操作からコンフリクト解消まで
実際にリポジトリの操作からコンフリクト解消までしていきます。
リモートリポジトリからcloneした後に差分ファイルをリモートリポジトリから持ってきます。
リモートリポジトリから二通りの方法でファイルを持っていきます。
A君はpull,Bちゃんはfetchした後にmergeをします。
持ってきたいファイルはhuman.txtです。
早速A君がPullしたようです。
$git pull
human.txtがワークツリー内に入っていることが確認出来ます。
git pullはデータを受け取った後に、そのデータを取り込む処理です。 すなわち fetchした後にmergeをしています。続いてBちゃんもデータを取り込んだようです。
#$ git fetch
でリモートリポジトリから差分データを受け取った後に
$ git diff
でローカルリポジトリと最新データとの差分を確認しています。
「human.txtが追加されていて、中身はこんな内容ですよ」 と表示されているのが確認できます
これを確認した後に$ git merge origin/master
で最新データをローカルリポジトリにmerge(合併)させているのが確認出来ます。
A君もBちゃんもやっていることは同じです。 A君の場合は、データを受け取り、その後すぐにデータをcommitしているので、持ってきたくないファイルもマージしてしまう恐れがあります。 git pullするときは慎重にしましょう。
##conflict(競合)とは
「衝突」とも言われています
マスター側と別のブランチ、別のブランチ同士で同じファイルの同じ部分を変更した時に、どっちをマージすればいいのか分からなくなってしまいます その時の事象を「コンフリクト」と呼びます。
========
で挟んだ上と下の部分が競合を起こしているところです。
どちらをマージするべきか吟味した上でどちらかを消して競合を解決しましょう。
###解決方法その2
force(フォース)のちからを利用する
git push -f
*非推奨
git push -f
でgit pushを強制出来ます。
競合先を強制的に上書きされてしまうので、あまりおすすめできません
#最後に
Calendarの概念をぶち壊す勢いで期限が過ぎてしまいました 過ぎた割に雑
しっかり勉強した上で前後編合わせて編集して行く予定です。
間違いだらけだと思われますのでご指摘をいただけると幸いです。
読んでくださってありがとうございました。