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も非公開リポジトリを作るのは有料プランにする必要があるみたいなので、公開リポジトリにしちゃいます😊
勉強用だし、見られてもたぶん困らないでしょう笑
何も設定されていない空のリポジトリが作成されました。名前はtutorial
です。
前回の記事で作成したtutorial
という名前のローカルリポジトリの履歴を、このリモートリポジトリに Push します!💪💪
Push する際に、対象のリモートリポジトリのアドレスを指定するのですが、毎回いちいちアドレスを入力しなくても済むように、アドレスに名前をつけて記録しておくことができます💡
ここではリモートリポジトリのアドレスにorigin
という名前を付けて登録し、Pushを行います。
アドレスの登録にはremote
コマンドを使います👆
$ git remote add 登録名 リポジトリURL
先程Github上に作成したリモートリポジトリのURLはhttps://github.com/mistyrinth/tutorial.git
です。
私の場合、以下のようになります👌
いよいよローカルリポジトリのコミットをリモートリポジトリに Push します!
push
コマンドを使用します😊
$ git push プッシュ先URL ブランチ名
ブランチについては発展編で詳しく学習できるみたいなので、今はチュートリアルのとおり、ブランチ名をmaster
にして進めてみます!
なお、空のリモートリポジトリに初めて Push するときはブランチ名を指定する必要がありますが、push
コマンドの-u
オプションを指定すると、次回以降はブランチ名の指定を省略できます✨
プッシュ先URLは、先程origin
という名前で記録したので、origin
と書けばOKです!
実際にやってみました。
成功したみたいですね〜🎉
ブラウザで Github を見てみると、空だった tutorial にsample.txt
が追加されています!
前回作ったテキストファイルが反映されていますね。
今度はリモートリポジトリのクローンをしてみます😆
練習のため、先程自分で作ったリモートリポジトリをクローンします。
clone
コマンドを使用します。
$ git clone リモートリポジトリURL 複製先ディレクトリ
複製先ディレクトリに任意の名前を指定すると、カレントディレクトリにその名前のディレクトリ名を作って複製することができます。
ここでは複製先ディレクトリをtutorial2
とします。今はtutorial2
という名前のディレクトリは存在しないので、カレントディレクトリ(この場合ホームディレクトリ内のtutorial
内)にtutorial2
という名前のディレクトリが作成されます📁
クローンが成功したか確認してみます。
できました!🧸
tutorial
の中にtutorial2
というディレクトリが作成され、中にはsample.txt
があります。
誤解してはいけないのが、cp
コマンドと同じようにローカルリポジトリ内で複製したのではなく、リモートリポジトリ(Github)から複製してきたという点ですね😊😊
更に、複製して作ったtutorial2
からもリモートリポジトリに Push してみます。
tutorial2
内のsample.txt
に2行目を追記しました!
前回と同じ流れで Push していきます。
振り返る場合は前回の記事をご参照ください🌝
元々リモートリポジトリにあったものをクローンしたものなので、push
コマンドの際にPush先のURLやブランチ名は省略できました👌
Githubを見ると、tutorial2
が反映されています✨
注意点は、tutorial2
の変更点をリモートリポジトリに Push したのであって、複製したわけではないということです。
Githubのtutorial
の中にtutorial2
が入ったわけではなく、Githubのtutorial
をtutorial2
に更新した感じです💡そのため、前回からの変更点を見ることができます。
今度は、tutorial2
からリモートリポジトリに Push した内容を、ローカルリポジトリであるtutorial
に Pull します。
以下のようにpull
コマンドを使用します。
リポジトリ名を省略すると、originの名前で登録されているリポジトリに対してpullを行います。
$ git pull リポジトリ名 参照仕様
参照仕様 (refspec) とは、この場合ブランチ名master
です。入門編のうちは、そのくらいの解釈で良いのだと思います!笑
実際に Pull を行い、正しくできているか確認を行いました。
log
コマンドで変更履歴を見ると、「addの説明を追加」という履歴が現れましたね!!これはtutorial2
で行い、リモートリポジトリに Push したものなので、大成功です😆
2-3. 変更履歴の統合
今のところ一人で Push や Pull をしているので問題ありませんが、例えば、私が最後に Pull を実行してから次に Push するまでの間に別の人が Push をして、リモートリポジトリが更新されたとします。
こうなってしまうと、私は Push が拒否されてしまいます😖もし私が Push できてしまったら、せっかくの別の人の変更履歴を失ってしまうからですね。
この場合、マージという作業を行って自動的に他の変更履歴を取り込むことで、別の人による変更履歴を失わずに Push することができます🙌
ただし、リモートリポジトリ(別の人)とローカルリポジトリ(私)がたまたま同じ箇所を変更していた場合は、マージしようとしても、どちらの変更を取り込むかを自動で判断できず、エラーになります。
このように競合が発生した箇所は、エラーを見ながら手動で修正することになります💦
2-4. チュートリアル3 変更履歴の統合
競合を解決してマージする練習として、tutorial
とtutorial2
を使ってセルフ競合してみます👣
現在、tutorial
とtutorial2
それぞれにsample.txt
が保存されており、中身はどちらも以下の2行です。
サルでもわかるGitコマンド
add 変更をインデックスに登録する
これをtutorial
とtutorial2
で別の変更を行い、マージを試します!
それぞれ、最後の1行に次の異なる文章を追加します。
tutorial:commit インデックスの状態を記録する
tutorial2:pull リモートリポジトリの内容を取得する
以下がtutorial
のsample.txt
の中身です。
add
コマンドでインデックスの追跡対象に登録し、commit
コマンドでローカルリポジトリtutorial
にコミットします。
一方、以下がtutorial2
のsample.txt
の中身です。
こちらも同様にadd
コマンドでインデックスの追跡対象に登録し、commit
コマンドでローカルリポジトリtutorial2
にコミットします。
これらを同じリモートリポジトリに Push してみます!
まずはtutorial2
のほうから。
これにより、リモートリポジトリ側には3行目の変更履歴として pull の説明が追加されたことになりました!
続いて、tutorial
から Push してみると、競合が起きているためエラーになりました!!
競合を解決するために、まずはエラーになってしまったtutorial
側で Pull を行い、変更履歴を取得します。
"Automatic merge failed"とのこと🔥🔥
あとは"Merge conflict in sample.txt"と書かれていますね👀
tutorial
のsample.txt
を開いてみます!
なんと、競合箇所を教えてくれています✨✨✨
読み方は以下のとおりです。
<<<<<<<
ローカルリポジトリ(ここでは競合により拒否されたほう)
=======
リモートリポジトリ(ここでは先に push されていたほう)
>>>>>>>
これをどう扱うか決めて、手動で解決していくこととなります。
今回は両方の変更を取り入れ、以下のように3行目に commit の説明、4行目に pull の説明がくるように編集します💪
修正を Push に反映させるために、再度add
→commit
を行います。
ここで Push の前に、log
コマンドの--graph
オプションと--oneline
オプションを試してみます!
--graph
オプションは、変更履歴の流れをテキスト表示することができます。
--oneline
オプションは、コミットの情報を一行で表示します。
log
コマンドの表示から、2つの分岐が一つに統合されたことが分かります😆
無事push
は成功しました!!
自作自演のため全部私のアイコンで一見わかりにくいのですが、tutorial
をいじった人とtutorial2
をいじった人が違う場合、このように履歴に残るので便利ですね〜!
Git入門編は以上です🌝