Git によるバージョン管理入門
GitHub との連携
GitHub は作成したソースコードなどをクラウド上で管理・公開することのできる Web サービスです.Git で管理しているファイル群をリポジトリ (Repository) という単位で管理できます.GitHub では public リポジトリと private リポジトリの2つのタイプのリポジトリを作成することができ,public リポジトリは全世界にファイルがされます.
特に public リポジトリの中にパスワードなどの情報が含まれるファイルをアップしてしまうと重大なインシデントに繋がるので,利用時には十分に注意してください.もちろん private リポジトリであってもパスワードなどの情報はアップすべきではありません.
GitHubアカウントの作成
GitHub を利用するにはアカウントを作成する必要があります.GitHub のトップページから「Sign up」のページに移動し,アカウントを作成してください.通常は Git で登録したメールアドレスと同じメールアドレスで登録すると良いでしょう.
リポジトリの作成
GitHub で新規のリポジトリを作成します.リポジトリを作成するには GitHub にログインした状態で「Repositories」のリンクを開き,「New」ボタンを押します.あるいは https://github.com/new にアクセスします.
次のような画面が表示されるので,リポジトリの名前を入力します.ここでは手元の PC で開発中のプロジェクト名(つまりフォルダ名)と同じ名前を設定すると良いでしょう.また,その下では「Public」が選択されているはずなのでこれを「Private」に変更します.
画面を下方向にスクロールすると「Create repository」というボタンが現れるのでこのボタンを押すと GitHub 上で新規のリポジトリが作成されます.
リモートリポジトリの追加
GitHub でリポジトリを作成したので,手元の PC で管理しているプロジェクトにリモートリポジトリを追加することで GitHub のリポジトリと連携させます.
GitHub でリポジトリを作成すると次のような画面が表示されているはずです.この画面では「HTTPS」が選択されていることを確認します.
画面を下方向にスクロールすると,連携のためのコマンドが表示されます.赤枠で囲った3行のコマンドのうち,1行目をコピー&ペーストして実行すればリモートリポジトリを登録できます.なお,2行目の git branch -M main
はブランチの名前を強制的に main
に変更するコマンドですので,すでに main
ブランチを使っている状況では必要ありません.
実際に次の通りコマンドを実行します.(このページのコマンドをコピーせずに,自身の GitHub のページに記載されたコマンドを利用してください.)
C:\Users\student\Documents\myReport>git remote add origin https://github.com/rinsaka/myReport.git ⏎
C:\Users\student\Documents\myReport>
正しく登録できたかどうかは次のコマンドで確認できます.origin
という名前でリモート追跡ブランチが作成されていることがわかります.ここで fetch
はリモート (GitHub) からローカルにコード取り込む,push
はローカルからリモートにコードを送信することを意味しています.
C:\Users\student\Documents\myReport>git remote -v ⏎
origin https://github.com/rinsaka/myReport.git (fetch)
origin https://github.com/rinsaka/myReport.git (push)
C:\Users\student\Documents\myReport>
ブランチの一覧で --all
オプションや -a
オプションを追加すると上で作成したリモート追跡ブランチを見ることができます.
C:\Users\student\Documents\myReport>git branch ⏎ * main C:\Users\student\Documents\myReport>git branch --all ⏎ * main remotes/origin/main C:\Users\student\Documents\myReport>git branch -a ⏎ * main remotes/origin/main C:\Users\student\Documents\myReport>
リモートリポジトリへのプッシュ(1)
git push
コマンドを利用すると,ローカルで管理している内容をリモートリポジトリに反映させることができます.リポジトリに対して最初にプッシュするときにはこの画面の3行目に表示されているように it push -u origin main
コマンドを実行します.(このとき,Macでは「ターミナル」アプリではなく,Visual Studio Code 内の「ターミナル」から実行するようにしてください.)
C:\Users\student\Documents\myReport>git push -u origin main ⏎
そのデバイス (PC) で初めて上のコマンドを実行したときには,次のような画面(ログインしていなければログイン画面)が表示されます.Web ブラウザでサインインするとデバイスが登録されて GitHub へプッシュできるようになります.次の画面では「Sign in with your browser」ボタンをクリックします.
ブラウザが起動して次の画面が表示されます.表示された内容を確認して「Authorize git-ecosystem」をクリックします.
ブラウザでの認証に成功すると次のような画面が表示されて登録完了です.
上の画面まで進むと,ターミナルでプッシュのコマンドが完了しているはずです.
C:\Users\student\Documents\myReport>git push -u origin main ⏎ # すでに入力済みのコマンド info: please complete authentication in your browser... Enumerating objects: 20, done. Counting objects: 100% (20/20), done. Delta compression using up to 3 threads Compressing objects: 100% (17/17), done. Writing objects: 100% (20/20), 1.96 KiB | 167.00 KiB/s, done. Total 20 (delta 6), reused 0 (delta 0), pack-reused 0 (from 0) remote: Resolving deltas: 100% (6/6), done. To https://github.com/rinsaka/myReport.git * [new branch] main -> main branch 'main' set up to track 'origin/main'. C:\Users\student\Documents\myReport>
GitHub のリポジトリページを再読み込みするとコードの一覧が表示され,「chapter1.txt」と「chapter2.txt」の2つのファイルが登録されていることが確認できます.また,7つのコミット履歴があることもわかります.
なお,初めてリモートリポジトリにプッシュするときには -u origin main
というオプションを付与しましたが,2回目以降は git push
だけで可能です.詳細は後ほど説明します.
C:\Users\student\Documents\myReport>git push ⏎
また,Macに標準搭載された「ターミナル」アプリでは,git push -u origin main
を実行したときに,ターミナルの中でユーザ名を入力するプロンプトが表示されるかもしれません.このような場合は,「Visual Studio Code」の中でターミナルを開き,同じコマンドを実行してください.実行後に次のような画面が表示されたら「許可」を押して次へ進みます.
内容を確認して「Authorize Visual-Studio-Code」ボタンを押します.
「許可」をクリックします.
次の画面が表示されたら認証が完了してリモートリポジトリへプッシュされます.
同時にターミナルにもその実行結果が表示されます.
GitHub上での編集とコミット
GitHub上でリポジトリに登録されているファイルをブラウザで編集しコミットすることも可能です.上の画面で「chapter1.txt」というファイル名をクリックすると次の画面に移動します.さらに右上にある「Edit this files」という「鉛筆」のアイコンをクリックして編集モードに移行します.
編集画面に移動しました.
ファイルを適当に編集します.例えば最後の行に追記します.編集が終われば右上にある「Commit changes...」ボタンをクリックします.
コミットメッセージが自動的に生成されています.必要に応じてこのメッセージを編集して(今回は編集せずにそのまま)「Commit changes」という右下のボタンを押してコミットします.
コミットできると次の画面に移動します.左上にある「< > Code」リンクをクリックします.
コード一覧のページに移動しました.chapter1.txt のファイルが直前 (now) にコミットされたこと,コミット履歴の数が8に変化したことが確認できました.「8 Commits」と表示された部分をクリックします.
コミット履歴が一覧で表示され,さきほどGitHub 上で行ったコミットも確認できました.更にリンクを辿るとコミットの内容を詳細に確認することも可能です.
GitHubからローカルリポジトリに取り込む
GitHub上でコミットを行ったので,ローカルリポジトリよりも GitHub 上のリモートリポジトリの方が進んだ状態になりました.ここでは,リモートリポジトリの内容をローカルリポジトリに取り込む方法を説明しますが, ポイントは fetch
と merge
を続けて実行するということです.
手元 PC のターミナルでブランチの一覧を確認します.これまで利用してきた git branch
コマンドではローカルリポジトリのブランチだけが表示されます.このコマンドに --all
オプションを追加すると,リモート追跡ブランチという特殊なブランチの存在も確認できます.remotes/origin/main
という名称のリモート追跡ブランチは,リモートリポジトリの状態を保持するための特殊なブランチです.
C:\Users\student\Documents\myReport>git branch ⏎ * main C:\Users\student\Documents\myReport>git branch --all ⏎ * main remotes/origin/main C:\Users\student\Documents\myReport>
手元 PC のターミナルでローカルリポジトリのコミットログを確認すると main
ブランチには7件のコミットログがあることがわかります.これと同時に,リモート追跡ブランチ origin/main
(remotes/
は省略可能)が main
ブランチと同じ状態であることもわかります.
C:\Users\student\Documents\myReport>git log --oneline ⏎ 72f5e41 (HEAD -> main, origin/main) Merge branch 'new_func2' 2035fb1 edit chapter2 5074a02 edit chapter1 bea88fe update chapter2 c779f65 chapter1修正とchapter2追加 804abdc 1行追加 ce2533a initial commit C:\Users\student\Documents\myReport>
リモート追跡ブランチのコミットログを参照してみます.上の手順では GitHub 上で新たなコミットを追加しましたが,その変更をまだ取り込んでいません.したがって,ここの手順でプッシュした時点の状態になっているはずです.
C:\Users\student\Documents\myReport>git log origin/main --oneline ⏎
72f5e41 (HEAD -> main, origin/main) Merge branch 'new_func2'
2035fb1 edit chapter2
5074a02 edit chapter1
bea88fe update chapter2
c779f65 chapter1修正とchapter2追加
804abdc 1行追加
ce2533a initial commit
C:\Users\student\Documents\myReport>
それでは GitHub のリモートリポジトリにある最新の内容をローカルリポジトリに取り込みます.取り込みには git fetch
コマンドを使用します.これにより,リモートリポジトリの内容がリモート追跡ブランチ origin/main
に取り込まれます.
C:\Users\student\Documents\myReport>git fetch ⏎ remote: Enumerating objects: 5, done. remote: Counting objects: 100% (5/5), done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), 983 bytes | 163.00 KiB/s, done. From https://github.com/rinsaka/myReport 72f5e41..d5840e6 main -> origin/main C:\Users\student\Documents\myReport>
リモートリポジトリからの取り込みができていることを確認します.これはリモート追跡ブランチのコミットログを確認するとわかります.その結果,標準ブランチ main
よりもリモート追跡ブランチ origin/main
が1コミットだけ先に進んでいることを確認できます.
C:\Users\student\Documents\myReport>git log origin/main --oneline ⏎ d5840e6 (origin/main) Update chapter1.txt 72f5e41 (HEAD -> main) Merge branch 'new_func2' 2035fb1 edit chapter2 5074a02 edit chapter1 bea88fe update chapter2 c779f65 chapter1修正とchapter2追加 804abdc 1行追加 ce2533a initial commit C:\Users\student\Documents\myReport>
メインブランチの状態を確認すると,リモート追跡ブランチよりも1コミット分遅れていることがわかります.
C:\Users\student\Documents\myReport>git status ⏎ On branch main Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded. (use "git pull" to update your local branch) nothing to commit, working tree clean C:\Users\student\Documents\myReport>
リモート追跡ブランチの内容を main
ブランチにマージします.このとき,--no-ff
オプションは不要です.
C:\Users\student\Documents\myReport>git merge origin/main ⏎
Updating 72f5e41..d5840e6
Fast-forward
chapter1.txt | 1 +
1 file changed, 1 insertion(+)
C:\Users\student\Documents\myReport>
コミットログを表示するとリモートリポジトリと同じ状態になったことを確認できました.
C:\Users\student\Documents\myReport>git log --oneline ⏎
d5840e6 (HEAD -> main, origin/main) Update chapter1.txt
72f5e41 Merge branch 'new_func2'
2035fb1 edit chapter2
5074a02 edit chapter1
bea88fe update chapter2
c779f65 chapter1修正とchapter2追加
804abdc 1行追加
ce2533a initial commit
C:\Users\student\Documents\myReport>
現在の状態を確認します.
C:\Users\student\Documents\myReport>git status ⏎ On branch main Your branch is up to date with 'origin/main'. nothing to commit, working tree clean C:\Users\student\Documents\myReport>
つまり,リモートリポジトリから取り込むには fetch
と merge
を続けて実行します.
C:\Users\student\Documents\myReport>git fetch ⏎ C:\Users\student\Documents\myReport>git merge origin/main ⏎
なお,git fetch
と git merge
のコマンドをまとめて実行するためのコマンドが git pull
です.
C:\Users\student\Documents\myReport>git pull ⏎
また,git fetch
の後,git merge
の代わりに git pull
を実行しても問題ありません.実際 git fetch
をした後に git status
を実行したときには,ヒントとして git pull
コマンドが表示されていました.
C:\Users\student\Documents\myReport>git fetch ⏎ C:\Users\student\Documents\myReport>git pull ⏎
リモートリポジトリへのプッシュ(2)
次はローカルリポジトリでファイルを編集してコミットした後,リモートリポジトリへプッシュする方法を説明します.これによりローカルリポジトリで行った変更をリモートリポジトリへ反映させることができます.
まず,ローカルリポジトリでファイルを編集します.例えば chapter1.txt の最後に適当な内容で1行追加してみます.
chapter1.txt
Gitのお勉強
神戸学院大学経営学部
Python
React
ブランチをマージしたという記録も残したい
GitHubで編集します
Visual Studio Codeで編集します
「VSCodeで編集」というコミットメッセージを付けてファイルの変更をコミットします.
C:\Users\student\Documents\myReport>git status ⏎ On branch main Your branch is up to date with 'origin/main'. 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: chapter1.txt no changes added to commit (use "git add" and/or "git commit -a") C:\Users\student\Documents\myReport>git add . ⏎ C:\Users\student\Documents\myReport>git commit -m"VSCodeで編集" ⏎ [main 6ec7640] VSCodeで編集 1 file changed, 1 insertion(+) C:\Users\student\Documents\myReport>
コミットログと現在の状態を確認します.いずれのコマンドでも現在の main
ブランチがリモートリポジトリ(厳密にはリモート追跡ブランチ)よりも1コミット分だけ先にいることがわかります.
C:\Users\student\Documents\myReport>git log --oneline ⏎ 6ec7640 (HEAD -> main) VSCodeで編集 d5840e6 (origin/main) Update chapter1.txt 72f5e41 Merge branch 'new_func2' 2035fb1 edit chapter2 5074a02 edit chapter1 bea88fe update chapter2 c779f65 chapter1修正とchapter2追加 804abdc 1行追加 ce2533a initial commit C:\Users\student\Documents\myReport>git status ⏎ On branch main Your branch is ahead of 'origin/main' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean C:\Users\student\Documents\myReport>
リモートリポジトリの内容を GitHub で表示すると,ローカルリポジトリよりも1コミット分だけ遅れていることがわかります.
git push
コマンドを使ってローカルリポジトリの内容をリモートリポジトリへ反映させます.なお,初めてプッシュするときには git push -u origin main
というコマンドを利用しましたが,2回目以降は git push
だけで構いません.
C:\Users\student\Documents\myReport>git push ⏎
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 3 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 373 bytes | 373.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/rinsaka/myReport.git
d5840e6..6ec7640 main -> main
C:\Users\student\Documents\myReport>
リモートリポジトリを再読込すると内容が反映されたことが確認できました.