Gitを理解する
こんにちはjukiです。初めての執筆になります。今回はGitについて自分なりに完全に理解しようと考えています。
1-1.Gitとは何か?
一言で言えば、バージョン管理ツール。プログラムのソースコードなどの変更履歴を追跡・記録したりすることができる。
なぜGitが誕生したのか?
理由として次のような理由があります。
・ファイル編集が大変
・チーム作業の際に不便
Git以前の方法(アナログ式)だと次のような問題が起こってしまう可能性があります。
・人による確認ミス。(余分なファイル・ルールの統制)
・大規模な開発だと、アナログ的な手段ではきつい
・同時に開発をしていた場合変更内容が差異が生じ、先に編集した内容が上書きされてしまう。
この問題を解決するために生まれてきたのがアメリカのプログラマ、リーナスによって開発されたGitです。大体なぜGitが生まれてきたのか分かってきたと思います。次は似ているようで似ていないGitHubについて紹介していきます。
1-2.GitHubとは
世界中の人が書いたコードを公開してそれらを管理するサービスのこと。アプリもありますが、こちらは基本的にはウェブサービスです。次にGitを操作する上で重要になってくる用語を紹介します。コマンド系はあとで実際に実行しながら説明するので、それ以外の場所や操作から紹介します。
2-1.Gitの用語説明
・リポジトリ:データを保存しておく場所。貯蔵庫
・ローカルリポジトリ:自分1人が利用するためのリポジトリ。GitHubに送信するデータを保存する場所。
・リモートリポジトリ:GitHub上のデータを保存している場所。
・ワークツリー:作業場所。自分が実際に作業している場所。
・インデックス:コミットする前に更新内容の一時的な保存をする場所。ワークツリーとローカルリポジトリの間にある一時的な保存領域。
・ステージ:インデックとほぼ同義。
・コミット:ステージにある新規作成ファイルや変更情報をローカルリポジトリに反映させる操作。
・プッシュ:ローカルリポジトリに保存しておいたデータをGitHubに送信するための操作。
・ブランチ:作業を枝分かれさせるので、複数の記録を並列的に管理できる。複数人で作業する際に便利。
・プル:リモートリポジトリの変更を自分のローカルリポジトリに反映させる操作のこと。フェッチ+マージ
・フェッチ:リモートで更新された最新情報をローカルリポジトリに持ってくるコマンド。しかしファイル自体は更新されない。
・マージ:ブランチを統合すること
・コンフリクト:プッシュやマージ行った際に他人と変更箇所が被ってしまうこと。「競合」とも言う。
・クローン:リモートリポジトリにある情報を元にローカルリポジトリを作成する操作のこと。
・.gitignore:Git の管理対象から対象外としたファイルやフォルダを定義する設定ファイル。(主にパスワードが入力しているファイルを定義したりする。)
2-2.GitHubの用語集
・プルリクエスト:コードレビュー機能のこと。これによってバグの混入を防いだり、より良いソースコードに修正したりできる。
・フォーク:他の開発者のリポジトリをGitHub上で複製し、自分で編集できるようにする機能。
・イシュー:課題管理機能。プロジェクトやソースコードの課題を管理することができる。
3-1.Gitの流れ(インストールや初期設定が完了している前提で紹介します。)
まずは全体の流れを理解していきましょう。
まずGitHunのページに行って新しいリモートリポジトリを作成します。下記のようなページに飛んでください。Repository nameと言うところに好きなリポジトリ名を入力してください。Descriptionsは書いても書かなくてもどちらでも大丈夫です。その下にpublicとprivateといった欄があります。ここではこのリポジトリを全体に公開するか、公開しないか選択することができます。以前は確かprivateは有料だった?ような気がします。その下に3個ほど?チェック欄があると思いますが今回は無視して大丈夫です。最後に一番したのCreate Repositoryと言う緑のボタンを押してください。
そしたら次にたくさんコードが出てくると思います。そしたら一旦ターミナルにいきます。ここに大体の流れが記入されています。またGitの始め方は二種類あります。
・ローカルディレクトリにGitを導入する
・サーバに公開されているGitプロジェクトを導入する。
3-2.ローカルにリポジトリを作成
ターミナルに移ったら、フォルダーとファイルを作成してください
ここでコードの解説をします。
git init
touch touch sample.txt
git status
git add .(git add sample.txt)
git commit
git initコマンドはリポジトリを新規に作成するときに使用するコマンド。これを使用したら現在のディレクトリまたは指定したディレクトリに.gitと言うディレクトリが作成されます。このディレクトリ内にはGitに必要なファイルが全て含まれています。試しに覗いてみましょう。ls -a .gitコマンドをすれば一覧が出てきます。
ls -a .git
. HEAD description info refs
.. branches hooks logs
COMMIT_EDITMSG config index objects
軽く見ていきます。
・HEAD:現在のブランチの参照
・description : GitWebで使われる。
・info:このリポジトリに対する追加情報
・refs:Gitの各参照先が保存されている場所
・branches:git fetch git pull git pushのURLを省略形を指定するために使用される。
・hooks:Gitの各コマンドを実行したときに呼び出されるスクリプトを設定できる。
・config:Gitの初期設定の際に入力されたものなどが入っている。(メールアドレスなど)
・objects:Gitの実体が保存されて場所
・COMMIT_EDITMSG:コミットメッセージが入ります。
・logs:参照に加えられた変更が残る。
・index:git add されたコミットするまのステージングエリアとして利用される。
これらの情報がgit initするだけで生成されます。
はい、次に行きます。次にtouchコマンド使用して好きなファイルを作成してください。作成したら次にgit statusコマンド使用して見ます。
git status
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: sample.txt
このように表示されます。use git addと書かれているのでgit addコマンドを入力します。このコマンドはワークツリー(作業場)の情報をステージングエリア(インデックス)に一時的に保存します。
addする際下記のコマンド入力の方法があります。今回はどちらも結果は同じです。一つ目はそのディレクトリの変更内容を全てステージに保存します。二つ目は選択したファイル。フォルダーをステージに保存します。基本的には指定した方が良いと思います。(個人的な感覚として).gitignoreファイルを作成していなかった場合、一つ目のコマンドを実行すると余計なファイルも追加してしまうからです。(やり直しするコマンドはあるので後で紹介します。)
git add .
git add sample.txt
ここでgit diff --stagedコマンド使用してみてください。diffはdifferenceの略で差異を表示するコマンドです。そうするとファイルに何か記述した場合にはその内容が表示されます。そしたら次にコミットしていきましょう。
git commit -m "first commit"
git commit --amend -m "second commit"
コマンドは上記のように実行します。git commitだけでもいいのですが、一々エディターが起動するのが鬱陶しいので基本的には上記のコマンドで入力してます。git commitのみで実行した際は初期設定でエディターを指定しなかった場合、vimと言うエディターが起動します。この-mがメッセージを指定するオプションです。もしここでコメントを打ち間違えてしまったら、2個目のコマンドを実行してください。--amendは直前のコミットーメッセージを修正するオプションです。
さて今どこにsample.txtはあるでしょう。
正解はローカルリポジトリにいます。コミットはステージにある変更内容をリモートリポジトリに反映させる操作でしたね。
次にプッシュしていきましょう。GitHubにコードを送信するまで後少しです。先にコマンドだけ紹介しておきます。
git remote add origin "自分のGitHubのURL"
git remote
git remote -v
git remote show origin
まず最初のコマンドですがこちらは現在のローカルリポジトリにリモートリポジトリを追加するコマンドです。このコマンドではremote名はoriginとなっていますがこちらは自分で変更しても大丈夫です。こうすることによって、originと言う名前で自分のリモートリポジトリにアクセスすることができるようになります。ではリモートリポジトリについての情報を見てみましょう。下に行けば行くほど詳しい情報を得ることができます。試しに2番目のコマンドを実行すると、追加したリモートの一覧を見ることができます。リモートは複数追加することができます。
さてプッシュしていきましょう。
git push origin master
あれ?masterて何と思うかもしれません。これがブランチです。ブランチの役割は以下の三つです。
・プロジェクト本体に影響を与えることなく作業ができる
・目的別に作業することができる
・バグの修正にも役立つ
試しに作成してみましょう。下記のコマンドで作成することができます。1番目のコマンドを実行すると、sampleというブランチができました。では次に二番目のコマンドを実行してみてください.実行してみると、masterとsampleと出てきてmasterが緑色になっていて✳︎がついています。これは今いるブランチを示しています。ではsampleブランチに移ってみましょう。三番目のコマンドを実行してみてください。これでsampleブランチに移行することができたと思います。再度二番目のコマンドを実行してみてください。今度はsampleが緑色になっていると思います。今回はsample使用しないので再度masterに戻ってください。次にブランチ名を変更してみます。四番目のコマンドを実行してみましょう。そしたらブランチを確認してみましょう。masterとtestに変わっていると思います。最後にこのtestブランチはいらないので削除します。五番目のコマンドを実行してください。これで削除できました。
Git branch sample
Git branch
Git branch checkout
Git branch -m sample test
Git branch -d test
このブランチというオプションは開発をする上では必須なのでその時にもう一度詳しく説明します。
他にも様々なコマンドがありますが、ここであれこれ説明するよりも次回説明する共同開発で実際にやった方が理解しやすいので簡単に載せておきます。
git push origin master
これでGitHub上にアップすることができました。確認してみてください。次に共同開発での流れを見てみましょう。
4-1.共同開発でのGitの流れ
共同開発の手法は沢山あると思いますが、今回は自分が実際に使ったことのある『GitHub Flow』について紹介していきます。
4-2.GitHub Flowとは
共同開発の一つの手法であり2011年にGitHub社が提唱したワークフローのこと。
・基本原則
・masterブランチは常にデプロイ可能な状態にする
・作業ブランチをmasterから作成
・作業ブランチを定期的にプッシュする
・プルリクエストを活用
・プルリクエストが承認されたらmasterへマージする
・masterが完了したら直ちにデプロイ
今回のgithub flow方式では次のブランチを主に使用します。
・Master-リリース済みのソースコードを管理する
・Developー開発中のソースコードを管理する
・Featureー機能の実装やバグの修正
・Releaseーリリースの準備を行う
・Hotfixー緊急の修正を行う
簡単に流れを説明すると、まずmasterブランチからdevelopブランチを切りその後featureブランチを作成します。featureブランチで機能を実装し終わったらdevelopブランチにマージして、そのfeatureブランチは削除します。そしたらdevelopブランチをreleaseブランチにマージします。その後masterブランチにマージしてそのreleaseブランチは削除します。また緊急のバグが生じた場合はmasterブランチからhotfixブランチを切り修正後masterブランチとdevelopブランチにマージしてそのhotfixブランチは削除します。文字だとわかりにくいので実際にやってみましょう。
・まず最初にリモートリポジトリを作成します。(今回は先程作成したリポジトリを使うので作らなくて大丈夫です。)次に ターミナルを開いて新たにブランチを作成してください。その後作成したブランチに切り替えてください。ここでファイルを作成します。
git branch test
git checkout test
touch test.txt
保存し終わったら先程のようにコミットまでしてください。
git add .
git commit -m "third commit"
そしたらプッシュをしていきます。先程と少し違う点がブランチ名がtestになっていることです。これはtestと言う名前でリモートブランチを作成することができます。下記のコマンドを実行してGitHubのページへ移動しましょう。
git push origin test
githubのページを見てもらうと、上の方に黄色い枠が表示されていると思います。
そして緑色のcompare & pull requestと言うボタンを押してください。次のように表示されます。
ここでプルリクエストを送ります。上のbaseとcompareはbaseがマージしたいブランチ、compareがマージさせたいブランチを選択します。また右側のreviewersの所でコードレビューを頼みたい人を選択します。それらが終わったらCreate pull requestを押してこれでコードレビューの依頼が完了します。今回は1人なので全部1人でやります。
プルリクエストを送られた人はコードを確認して問題がなければMerge pull requestを押してtestブランチをmasterブランチをマージします。そしてtestブランがこれ以上必要なければ削除しても大丈夫です。(成功したらDelete branchと出てきます。)
マージし終わったらターミナルに戻ってmasterブランチを最新の状態にします。今lsコマンドを実行しても先程プッシュしたsample.txtしか残っていないと思います。最新の状態にするためにリモートリポジトリからローカルリポジトリに移行してくる必要があります。
まずブランチをmasterブランチに切り替えてください。その後pullコマンドを実行して自分のローカルブランチを最新状態にします。これで再度lsコマンドを実行すればtest.txtが追加されています。最後に使用していることこのブランチがいらなくなったらgit branch -d testで消してください。これで一通り完了です。また最新の masterブランチからブランチを切って内容の更新してプッシュしてマージしてもらって最新状態に更新するというのを繰り返していきます。
git checkout master
git pull origin master
git branch -d test
今回は1人で勝手にやりましたが、次はプロジェクトの参加者側からやっていきます。基本的にはさっきと変わりません。
4-3.参加者側からの流れ
まず新しくフォルダーを作ります。念のためgit branchとlsコマンドを実行しますが何もファイルはないと思います。ブランチは masterブランチだけだと思います。ではこのフォルダーにリモートリポジトリの情報を取ってきます。ここで使うコマンドはcloneコマンドというものです。文字通りリポジトリを複製するコマンドです。これを実行して再度lsコマンドを実行してもらえば先程作成したテキストファイルができていると思います。ここで内容を更新した後は基本的には同じです。
git clone 先程のgithubのURL
5.その他エラーなど困ったとき用の対処方法などを紹介
今回のメインは正直ここかと思っています。様々なエラー(自分が経験した)を紹介していきます。あくまで個人的に解消できただけなのでこれだけで解決できるとは思っていませんので、参考程度に見てください。今後エラーに遭遇したら更新していきます。
5-1.git addをやり直したい
間違えてgit add .コマンドをして全部ステージングエリアに移動してしまったことがあると思います。その場合は次のコマンドを実行してください。これによって指定したファイルをステージングエリアから取り除かれます。2番目のコマンドを実行すると、全てのファイルを取り消すことができます。HEADというのは先程紹介しましたが、現在のブランチを指しています。コミットを指定する際に~(チルダ)と^(キャレット)を使ってコミットからの相対位置をしてすることができます。
git reset HEAD ファイル名
git reset HEAD
このようなことが内容にaddについて少し紹介します一番目のコマンドを実行することで、バージョン管理されていて変更があった全てのファイルがaddされる。逆に新しく作られたファイルはaddされません。2番目のように✳︎と拡張子を追加することで特定の拡張子が含まれているファイルだけaddすることができます。今回の場合txtファイルのみaddされます。また3番目のコマンドを実行することで変更された全てのファイルをaddすることができます。つまり削除・変更・新規全てのファイルをaddできます。
git add -u
git add *.txt
git add -A
5-2.コミットを取り消したい
一番目のコマンドを実行することで、直前のコマンド打ち消すことがです。またaddと同様にHEADオプションの〜と^を使うことで打ち消したいコミットの位置を指定することができます。二番目のコマンドを実行することで直前のコミットを取り消し、インデックスとワーキングツリーはそのままになります。三番目のコマンドを実行することで、コミットを取り消しインデックスとワーキングツリーの変更を全て打ち消すことができる鬼のようなコマンドです。なのであまりおすすめしないです。
git revert HEAD
git reset --soft HEAD^
git reset --hard HEAD^
・プッシュできない
・プルできない
・ブランチを切り替えることができない