どぼじょのIT学習ブログ

高専卒土木女子がIT業界を目指してお勉強。

Git入門 part2 / リポジトリの共有, 変更履歴の統合

本日はサルでもわかるGit入門 リポジトリの共有から勉強していきます!
前回の記事はこちらになります。

目次

1.前回のおさらい

前回の記事では、様々な Git 用語が出てきました💡
記事の最後に用語の意味を一覧にまとめたので、おさらいとして再掲します。

用語 意味
repository データの状態を保存する場所
作業用のローカルリポジトリと共有用のリモートリポジトリがある
Push ローカルリポジトリからリモートリポジトリにアップロードすること
Pull リモートリポジトリからローカルリポジトリにダウンロードすること
commit ファイルやディレクトリの追加・変更をリポジトリに記録する操作
worktree 実際に作業をするディレクト
index リポジトリとワークツリーの間にあり、リポジトリにコミットするための準備をするところ

2.入門編

2-1. リポジトリの共有

早速サルでもわかるGit入門を進めていきます!

リポジトリとは、ファイルやディレクトリの状態を保存(コミット)しておく場所のことでしたね🙂
作業を行うためのローカルリポジトリと、他の人と共有するためのリモートリポジトリがありました。
前回の記事では、新規のローカルリポジトリを作成するところまでやったので、ここではリモートリポジトリの使い方を学びます!

Git では、ローカルリポジトリ内の変更履歴をリモートリポジトリにアップロードする操作を Push と言います。
逆に、リモートリポジトリの変更履歴をローカルリポジトリにダウンロードする操作を Pull と言います。

また、リモートリポジトリを複製する操作は、Clone と言います。
クローンを実行すると、リモートリポジトリの内容をまるまるダウンロードしてきて、別のマシンにローカルリポジトリとして作成できます👌

2-2. チュートリアル2 リポジトリの共有

チュートリアルにある「リモートリポジトリをBacklog上に作成する」というのは GUI環境でやるっぽいですね。
Backlogはどうやら有料サービスのようなので、 Github でやってみます!
Githubも非公開リポジトリを作るのは有料プランにする必要があるみたいなので、公開リポジトリにしちゃいます😊
勉強用だし、見られてもたぶん困らないでしょう笑
f:id:mistyrinth:20181222134252p:plain
何も設定されていない空のリポジトリが作成されました。名前はtutorialです。
前回の記事で作成したtutorialという名前のローカルリポジトリの履歴を、このリモートリポジトリに Push します!💪💪

Push する際に、対象のリモートリポジトリのアドレスを指定するのですが、毎回いちいちアドレスを入力しなくても済むように、アドレスに名前をつけて記録しておくことができます💡
ここではリモートリポジトリのアドレスにoriginという名前を付けて登録し、Pushを行います。
アドレスの登録にはremoteコマンドを使います👆

$ git remote add 登録名 リポジトリURL

先程Github上に作成したリモートリポジトリのURLはhttps://github.com/mistyrinth/tutorial.git です。
私の場合、以下のようになります👌
f:id:mistyrinth:20181222135637p:plain

いよいよローカルリポジトリのコミットをリモートリポジトリに Push します!
pushコマンドを使用します😊

$ git push プッシュ先URL ブランチ名

ブランチについては発展編で詳しく学習できるみたいなので、今はチュートリアルのとおり、ブランチ名をmasterにして進めてみます!
なお、空のリモートリポジトリに初めて Push するときはブランチ名を指定する必要がありますが、pushコマンドの-uオプションを指定すると、次回以降はブランチ名の指定を省略できます✨
プッシュ先URLは、先程originという名前で記録したので、originと書けばOKです!
実際にやってみました。
f:id:mistyrinth:20181222141145p:plain
成功したみたいですね〜🎉
ブラウザで Github を見てみると、空だった tutorial にsample.txtが追加されています!
前回作ったテキストファイルが反映されていますね。

今度はリモートリポジトリのクローンをしてみます😆
練習のため、先程自分で作ったリモートリポジトリをクローンします。
cloneコマンドを使用します。はリモートリポジトリのURL、は複製先のディレクトリ名を指定します。

$ git clone リモートリポジトリURL 複製先ディレクトリ

複製先ディレクトリに任意の名前を指定すると、カレントディレクトリにその名前のディレクトリ名を作って複製することができます。
ここでは複製先ディレクトリをtutorial2とします。今はtutorial2という名前のディレクトリは存在しないので、カレントディレクトリ(この場合ホームディレクトリ内のtutorial内)にtutorial2という名前のディレクトリが作成されます📁
f:id:mistyrinth:20181222142401p:plain

クローンが成功したか確認してみます。
f:id:mistyrinth:20181222143023p:plain
できました!🧸
tutorialの中にtutorial2というディレクトリが作成され、中にはsample.txtがあります。
誤解してはいけないのが、cpコマンドと同じようにローカルリポジトリ内で複製したのではなく、リモートリポジトリ(Github)から複製してきたという点ですね😊😊

更に、複製して作ったtutorial2からもリモートリポジトリに Push してみます。
tutorial2内のsample.txtに2行目を追記しました!
f:id:mistyrinth:20181222143628p:plain

前回と同じ流れで Push していきます。
振り返る場合は前回の記事をご参照ください🌝
f:id:mistyrinth:20181222145206p:plain
元々リモートリポジトリにあったものをクローンしたものなので、pushコマンドの際にPush先のURLやブランチ名は省略できました👌
Githubを見ると、tutorial2が反映されています✨
f:id:mistyrinth:20181222145433p:plain
注意点は、tutorial2の変更点をリモートリポジトリに Push したのであって、複製したわけではないということです。
Githubtutorialの中にtutorial2が入ったわけではなく、Githubtutorialtutorial2に更新した感じです💡そのため、前回からの変更点を見ることができます。

今度は、tutorial2からリモートリポジトリに Push した内容を、ローカルリポジトリであるtutorialに Pull します。
以下のようにpullコマンドを使用します。
リポジトリ名を省略すると、originの名前で登録されているリポジトリに対してpullを行います。

$ git pull リポジトリ名 参照仕様

参照仕様 (refspec) とは、この場合ブランチ名masterです。入門編のうちは、そのくらいの解釈で良いのだと思います!笑
実際に Pull を行い、正しくできているか確認を行いました。
f:id:mistyrinth:20181222160850p:plain
logコマンドで変更履歴を見ると、「addの説明を追加」という履歴が現れましたね!!これはtutorial2で行い、リモートリポジトリに Push したものなので、大成功です😆

2-3. 変更履歴の統合

今のところ一人で Push や Pull をしているので問題ありませんが、例えば、私が最後に Pull を実行してから次に Push するまでの間に別の人が Push をして、リモートリポジトリが更新されたとします。
こうなってしまうと、私は Push が拒否されてしまいます😖もし私が Push できてしまったら、せっかくの別の人の変更履歴を失ってしまうからですね。
この場合、マージという作業を行って自動的に他の変更履歴を取り込むことで、別の人による変更履歴を失わずに Push することができます🙌

ただし、リモートリポジトリ(別の人)とローカルリポジトリ(私)がたまたま同じ箇所を変更していた場合は、マージしようとしても、どちらの変更を取り込むかを自動で判断できず、エラーになります。
このように競合が発生した箇所は、エラーを見ながら手動で修正することになります💦

2-4. チュートリアル3 変更履歴の統合

競合を解決してマージする練習として、tutorialtutorial2を使ってセルフ競合してみます👣
現在、tutorialtutorial2それぞれにsample.txtが保存されており、中身はどちらも以下の2行です。

サルでもわかるGitコマンド
add 変更をインデックスに登録する

これをtutorialtutorial2で別の変更を行い、マージを試します!
それぞれ、最後の1行に次の異なる文章を追加します。

tutorial:commit インデックスの状態を記録する
tutorial2:pull リモートリポジトリの内容を取得する

以下がtutorialsample.txtの中身です。
f:id:mistyrinth:20181222155229p:plain
addコマンドでインデックスの追跡対象に登録し、commitコマンドでローカルリポジトリtutorialにコミットします。
f:id:mistyrinth:20181222155930p:plain

一方、以下がtutorial2sample.txtの中身です。
f:id:mistyrinth:20181222155259p:plain
こちらも同様にaddコマンドでインデックスの追跡対象に登録し、commitコマンドでローカルリポジトリtutorial2にコミットします。
f:id:mistyrinth:20181222160015p:plain

これらを同じリモートリポジトリに Push してみます!
まずはtutorial2のほうから。
f:id:mistyrinth:20181222160350p:plain
これにより、リモートリポジトリ側には3行目の変更履歴として pull の説明が追加されたことになりました!
f:id:mistyrinth:20181222160439p:plain
続いて、tutorialから Push してみると、競合が起きているためエラーになりました!!
f:id:mistyrinth:20181222160951p:plain

競合を解決するために、まずはエラーになってしまったtutorial側で Pull を行い、変更履歴を取得します。
f:id:mistyrinth:20181222161415p:plain
"Automatic merge failed"とのこと🔥🔥
あとは"Merge conflict in sample.txt"と書かれていますね👀
tutorialsample.txtを開いてみます!
f:id:mistyrinth:20181222161903p:plain
なんと、競合箇所を教えてくれています✨✨✨
読み方は以下のとおりです。

<<<<<<<
ローカルリポジトリ(ここでは競合により拒否されたほう)
=======
リモートリポジトリ(ここでは先に push されていたほう)
>>>>>>>

これをどう扱うか決めて、手動で解決していくこととなります。
今回は両方の変更を取り入れ、以下のように3行目に commit の説明、4行目に pull の説明がくるように編集します💪
f:id:mistyrinth:20181222162559p:plain
修正を Push に反映させるために、再度addcommitを行います。
f:id:mistyrinth:20181222163003p:plain

ここで Push の前に、logコマンドの--graphオプションと--onelineオプションを試してみます!
--graphオプションは、変更履歴の流れをテキスト表示することができます。
--onelineオプションは、コミットの情報を一行で表示します。
f:id:mistyrinth:20181222163827p:plain
logコマンドの表示から、2つの分岐が一つに統合されたことが分かります😆
無事pushは成功しました!!
f:id:mistyrinth:20181222163938p:plain
自作自演のため全部私のアイコンで一見わかりにくいのですが、tutorialをいじった人とtutorial2をいじった人が違う場合、このように履歴に残るので便利ですね〜!

Git入門編は以上です🌝