ここにも少し書きかけたが、git及びgithubについてまとめてみた。
概念・知識
・リポジトリとブランチ。
- リポジトリは、ローカルリポジトリとリモートリポジトリの2種類がある。前者には、作業領域である「ワーキングツリー」というものを伴っている。
- ブランチとは、履歴と流れを保存していくもの。ブランチはさらに、①リモートブランチ/②ローカルブランチ/③リモートトラッキングブランチ(リモート追跡ブランチ) に大別できる。②③はローカルリポジトリにある。またorigin/masterは③に該当。リモートトラッキングブランチはリモートブランチを参照するのに利用。(参考)
- ブランチの情報を確認:git branch -a
- ブランチ、HEADの理解については、https://qiita.com/ymzk-jp/items/00ff664da60c37458aaa がわかりやすい。
・ワークツリー、ステージ領域、ローカルリポジトリ、チェックアウト (参考)
- ワークツリーとは、作業ツリー/ワーキングツリーとも呼ばれ、プロジェクトディレクトリ配下の領域のこと。https://www.slideshare.net/matsukaz/git-28304397 のp72がわかりやすい。
⇒git initにより、リポジトリデータが格納される.gitディレクトリが作成される。
⇒git add .により、ワークツリーより、更新されたファイル全てがステージ領域(インデックス)に登録される。ステージ領域はgitディレクトリ配下のindexとのこと(https://tech.mercari.com/entry/2017/04/06/171430 )
⇒更にgit commit -m "メッセージ"により、ステージ領域に登録されているファイル群をリポジトリの歴史としてローカルリポジトリに記録される。
⇒そのうえで、git pushで、ローカルリポジトリからリモートリポジトリへデータを送信する。
- チェックアウトは、リポジトリからブランチのデータをインデックスとワーキングツリーに展開する ためのコマンド 。
・fetch,pull(fetch+merge),clone
- fetchはリモート追跡ブランチの更新を行うコマンド。リモートリポジトリから最新情報をローカルリポジトリに持ってくる。 リモートリポジトリのコミットがローカル追跡リポジトリに取り込まれただけなので、ワーキングツリーやインデックスに影響を与えない。そのため、ローカルブランチに反映せずにリモートリポジトリにあるブランチやタグの情報を確認することができる。
- それに対して、pullは、登録してあるリモートリポジトリからローカルリポジトリにデータを反映する ためのコマンド(fetch+merge)。mergeが行われることで、リモート追跡ブランチからローカルリポジトリへデータが取り込まれる(参考)。
⇒merge:$ git merge origin/main でデータが取り込まれる。
- さらに、pullとcloneの違いは
⇒clone:ファイルを全てコピーする
⇒pull:ローカル側とリモート側で、差異がある(更新されている)ファイルを全てコピーする (参考)
cloneを実行することでカレントディレクトリにURL末尾名(リポジトリ名)のディレクトリと「.git」ファイルが作成される。「.git」ファイルの中にバージョン管理履歴が保存されていく。カレントディレクトリに同名のディレクトリが既にある場合はcloneは使えない。
- clone,fetch、origin/master 等の説明はこれ、これ2が判りやすい。
基本的な使い方
・.gitignore
⇒参考。.gitignore に記載された対象ファイルは、git add の実行時に、インデックスに追加されないようになる。
⇒.gitignoreを書く前にgit add .を実施してしまった場合は git rm --cached *を実施すれば、インデックスに追加された一式を削除できるので、その後.gitignoreを記載し、git add .を実施すればOK(2023.10.20、https://qiita.com/Kintech/items/4709caaababf84b86e3f)
⇒アップの際は.envも使い.gitignoreに追記したほうが良い。
・githubへのpush
githubのWeb画面にてリポジトリを作成。次に以下コマンドを実施
$ git init
$ git add .
$ git commit -m "メッセージ"
$ git remote add origin https://github.com/<ユーザ名>/<リポジトリ名>.git
(過去作成したリポジトリにコピーする場合は、addではなくてset-urlにする)
$ git push -u origin master
githubのWeb画面にて、登録されたことを確認する
※git push -u origin feature-D(-uオプションは、ローカルリポジトリの現在のブランチのupstreamはoriginリポジトリのfeature-Dブランチであるということを同時に設定したことになる)
※間違ってgithubの既存リポジトリに誤ったファイルをpushしてしまった場合は、「commit」メニューから過去の履歴を探し呼び出した上で、Branchメニューより新しいブランチを作成すると、過去の内容が復活する。さらにbranchメニューから「change default branch」にてデフォルトブランチをアップデートすると、先ほど作成した新しいブランチがデフォルトブランチとして登録される。
・ローカルの変更内容をgithubへ反映する
- git remote -vでリモートリポジトリを確認した後に、上記にてpushをする。
・githubで変更された内容をローカルに反映する(参考)
- git pull origin master ※git remoteを設定したことを前提に。
・他の人のgitファイルをローカルにコピーする方法
- ローカルにコピー:git clone (url).git/ ←http(https)://まで記入必要。
※プライベートレポジトリをEC2等にgit cloneする場合は、personal access tokenをgithub側で設定する必要がある⇒手順。
今回久しぶりにEC2からgit cloneしたので再設定したが、Fine-grained Personal Access Token(⇒確認)を作成し、EC2からgit cloneした際に聞かれるパスに本tokenをコピペするとcloneできた。但しこのTokenは再度表示されないためメモしておく必要あり。Classic Tokenも残っていたので削除(2023.5.14)
・他の人のgitファイルを自分のgithubにコピーする方法
- githubの自分のリポジトリに他人のgithubファイルをコピー:該当のurl(例えばhttps://github.com/heroku/node-js-sample)にアクセスし、右上のforkをクリックすると自分のgitアカウントに該当gitファイルがコピーされる。
・gitファイルの名前を変更するには? - 該当urlから”settings”をクリックするとRepository nameの箇所が出てくるので、ここで名前を変更が可能。
・remote
- リモートリポジトリのURLはの2つのURLが設定できる(⇒参考)
①git remote add origin https://github.com/<ユーザ名>/<リポジトリ名>.git
②git remote add origin git@github.com:ユーザ名/リポジトリ名.git
前者の場合、git pushなどする度に毎回ユーザ名とパスワードの入力を求められる。若しくはPAT(personal access token)を使用する。PATはコマンドラインではgit credential helperを利用してキャッシュできる。私の場合もこれを使用したと思う(systemのgitconfigファイルに設定されていた)
後者のssh urlを用いる場合は事前にSSHキーペアを生成し、GitHubアカウントに公開キーを追加する必要がある
※addの代わりにset-urlとすると、設定したurlを変更できる。
⇒git remote set-url origin (httpsから始まる自分のgitリポジトリのURL).git
⇒remoteのURLが変更される。(reference)
- git remote -vにて、remoteに設定したurlが確認できる。(origin、herokuのURL)
・checkout
- git checkout -b feature-D (=git branch feature-D、git checkout feature-D)
※-bオプションにて、新規ブランチ作成も兼ねるhttps://www.sejuku.net/blog/71457
・add,commit の取り消し
- ワークツリー ⇔ ステージ領域 ⇔ コミット への遷移方法
※addする前の状態に戻す場合:
init直後の場合:git rm --cached
2回目以降の場合:git reset HEAD(若しくはgit reset) ~以上、http://www-creators.com/archives/1282 より
※以前コミットした状態にファイルを戻す場合:
git checkout xxx(但し、作業中のワークファイルは消えてしまう)
※その他:
git status(現在のgitの状態を確認)
git diff(現在のワークツリーとステージ領域の差分を確認する)
git diff HEAD(最新コミットとの差分を確認する)
・githubの内容をtree表示する。
⇒chromeのプラグインoctotreeを入れる。プライベートリポジトリを表示するには、tokenの設定が必要。
⇒https://qiita.com/kz800/items/497ec70bff3e555dacd0
・gitの変更内容をtree表示する。
⇒git graph:https://wp.pxdesign.jp/2014/08/23/git-hierarchy-structure/
git / githubの初期設定
#githubアカウントは既に作成済の前提
(1) https://git-scm.com/よりインストーラをダウンロードしインストールする。
(2) gitの設定(.gitconfig)
- git config --global --edit
- git config --listで中身が確認できる。
(3) githubとの接続設定
①sshを用いる場合
- (IaaS(AWS)利用の場合)AWSのIaaSにsshでログイン
- ssh-keygen -t rsa -C "your-email@example.com"
⇒~/.ssh配下に、id_rsaとid_rsa.pubが作成される(以前よりあったauthorized_keysはそのまま残る)
- githubのPersonal settings/SSH and GPG keys に、id_usa.pubの中身をペースト。これでOK(とのこと、以上「こっそり始めるGit / GitHub 超入門」p90を参照)。
- ~/.ssh配下にconfigファイルを作成(参考)。場合によっては~/.gitconfigファイルも修正(参考)。
※githubに設定したはずのsshキーが消えていたので調べたところ、1年間使用していないと削除されてしまうらしい!⇒こちら。
②ssl(https)を用いる場合
- 特段設定は不要。(2021.6.27追記)私のノートPCには下記①にてgitconfigファイル(system設定)にca情報が記載されているが、多分不要と思われる(2021.6.28)。こちらも参考。
※今回新たなノートPCにgitをインストールして実施したが、git push origin mainの際にgithubアカウントの認証確認をポップアップ画面で促されたが、画面上に表示される2桁の数字を、スマホにインストールしているgithubモバイルに投入するだけで本人性確認処理は終了し、上記①②の対応や.sshのRSAキー設定等は不要だった。githubのアカウント情報を確認したところ特段sshキーも設定していなかったので(以前はした記憶はあるが)、なので多分下記②での接続となったと思う(2023.3.25)。
補足: Gitの設定ファイルについて
- Gitの設定ファイルには次の3種類がある。
⇒system, global,local ※編集方法。なお、git configコマンドでそれぞれの設定ファイルの確認・編集が可能なので、ファイルの置き場所を気にする必要は特にない(詳細)。
①system⇒gitconfigファイル:私のPC(Windows)の場合、C:\Program Files\Git\mingw64\etc配下にある⇒ファイルの場所。またssl(https接続)の鍵に関してはsystemに記述されている。
②global⇒.gitconfigファイル(場所はユーザディレクトリ配下。https://www.curict.com/item/fe/fe45741.html)。
③local⇒.git/config。ローカルリポジトリ配下。
- GitHubではリモートリポジトリと通信をするときに、http,https(ssl),git,sshの4種類のプロトコルを使うことが出来る。⇒参考、 sslとsshの違い
その他
・Github Pages
- 以下によりgithubのコードが静的Webサーバとして公開できる。但しindex.htmlでなければいけない。⇒参考
・gist
- 以下によりブログ側での表示設定が可能 →https://cmqblog.com/blog-github-gist/
・github.dev
- githubの自分のページで.を押すとVSCode画面イメージに切り替わる。
・github codespaces
- https://github.co.jp/features/codespaces
コメントを残す