Chapter 3

Github

Subsections of Github

Repository Operations

リポジトリのダウンロード

GitHubにあるリモートリポジトリをhttps接続でダウンロードする場合は以下のコマンドで。(ただし,GitHub上のリポジトリ設定で若干異なる場合もある)

$ git clone https://github.com/someone/somerepo.git

上記URLのsomeone, someprepoの部分はダウンロードしたいリポジトリによって変わる。

ssh接続

git clone git@github.com:<repo>.git

cloneするときのURL以下はブラウザ上のgithubでcloneしたいリポジトリに移動し、codeをクリックすることで確認できる。

publicの場合

$ git clone https://github.com/<repo>

privateの場合

$ git clone https://<username>@github.com/someone/somerepo.git

Wikiページをcloneする場合は.gitの前に.wikiをつける。

最新情報のダウンロード / 更新ファイルのアップロード

ダウンロードしたファイルをいじるときには,まず,Gitサーバから最新バージョンをダウンロードしてから開始。

$ git pull origin main

これはサーバ(origin)から,masterブランチ(ブランチは後述)をダウンロードしてローカルリポジトリを更新し(fetch),作業ディレクトリに反映(merge)するという意味。

ファイルを更新したら,gitサーバ(origin)にアップロードする。

$ git add <更新したファイル名>
$ git commit -m “修正点を少し書く”    <=ローカルリポジトリ(手元)に登録
$ git push origin main           <=リモートリポジトリに反映

とりあえず,これで最低限のファイル共有/共同編集はできる。

git addは,更新したファイルのうち,リモートリポジトリに反映したいファイルを指定(stagingとよぶ。これにより対象ファイルはstaging areaに移動)する。指定方法は以下のようにいろいろある。

    $ git add . 新規作成ファイルと更新ファイルを全部指定
    $ git add -u 前回から更新したファイルのみ指定(新規作成ファイルは含まない)
    $ git add -A .新規作成ファイル,更新ファイル,削除ファイル全部指定

ただし,リモートリポジトリは,知らないヒトが勝手に’git push’で書き換えたりできるとよくないので,アクセス制限をできるようになっている。アクセス制限がかかっているリモートリポジトリの内容の修正をリクエストするにはPullRequestをする(後述)。

gitサーバでリポジトリを削除する方法

  1. 削除したいリポジトリのページに移動
  2. 上の一覧からSettingsをクリック
  3. 下の方にあるDelete this repositoryをクリック
  4. 警告を読んで、消したいリポジトリの名前を入力
  5. I understand the consequences, delete this repositoryをクリック

ローカルリポジトリの削除(git initの取り消し)

.gitファイルを削除して、git initしたディレクトリに対して、それを取り消す

$rm -rf .git

コミット履歴の確認

     $ git log

--graphというオプションをつけるとコミットログをアスキーアートでカラフルに表示シてくれる。たくさんブランチがあるリポジトリなどでは見やすくなる

     $ git log --graph

コミットのキャンセル

ステージングのキャンセル

ステージング(git add)から変更ファイルを取り消す場合は下記コマンドを実行します。

$ git rm --cached <ファイル名>

ステージング(git add)から削除するだけでなく、ファイル自体も削除する場合には下記コマンドを実行します。

$ git rm -f <ファイル名>

コミットの取り消し

直前に行ったコミットを取り消すには下記コマンドを実行します。

作業ディレクトリの内容はコミット時のままで、「コミットした」ということだけが取り消されます。

「–soft」オプションは省略できます。

$ git reset [--soft] HEAD^

作業ディレクトリに加えた変更点もコミット前に戻す場合は以下のコマンドです。

$ git reset --hard HEAD^

作業ディレクトリをローカルリポジトリの最新状態にするには下記コマンドを実行します。

indexもクリーンされます。

$ git reset --hard HEAD

コミット後の修正

前回のコミットを破棄して、現在のIndex内容で新しくコミットします。

「reset」と「commit」を実行することと同様の処理となります。

コミットメッセージの修正なども行えます。

$ git commit --amend

プッシュの取り消し

基本、プッシュした情報をローカルリポジトリに戻すことはできない。 そこで、コミットを打ち消すコミットを生成する(git revertコマンド)。プッシュ済みのコミットを消す方法もあるが、よくなさそう。。git revertでは打ち消したコミットの記録が残る。

git revert

  • 指定したコミットを、add前に戻してくれるコマンド。

  • ターミナル(間違って、masterにpushしちゃった時など)

    % git log                    # コミットログの確認
    % git revert 間違えたコミットID   # 指定したコミットを、add前に戻す
    # ターミナルが編集できなくなるので、`:q`で脱出
    
    • GitHub Desktopを確認すると、git revertで生成したコミットが生成されてるハズ。これをpushすれば、リモートリポジトリで打ち消されているハズ。この時、ローカルからも消えるので、注意。
  • 参)ターミナルで実施する場合

    % git pull                            # 念のため、ローカルのmasterを最新にする
    % git checkout pushすべきだったブランチ    # ブランチを切り替える
    % git merge master
    % git add .                           # 変更箇所をadd
    % git commit -m "コミットメッセージ"
    % git push origin pushしたかったブランチ
    

    ※ 念のため、ローカルのmasterをpull(最新)にしてから、作業してたブランチも最新状態をmerge(反映)し、pushすべきだったブランチにpushするイメージ。

その他のコマンド

よく使用するコマンド

コマンド 概要
git init 対象のディレクトリをバージョン管理できる入れ物に格納してくれるイメージ
git add ●● ●●をインデックスに追加。※ git add . とすると「全て」を対象にできる
git commit -m ‘メッセージ’ コミット
git status 現在のファイルの状態(staging等)一覧を表示する
git reset <ファイル名> 間違えてgit addしたファイルの取り消し(stagingの取り消し)
git log コミットログの履歴確認(コミットID、コミットメッセージ、日時)
git remote add origin リモートリポジトリのURL(https://github.com/GitHubのユーザー名/リモートリポジトリ名.git) ローカルリポジトリにリモートリポジトリの情報を付与し、紐づける
git push origin ブランチ名 ローカルの変更点を、リモートに反映。ブランチ名 masterなら、マスターブランチにプッシュ。
git pull origin master リモートリポジトリ(origin)のマスターブランチをローカルリポジトリに反映。
git clone https://github.com/ユーザー名/リモートリポジト名.git リモートリポジトからローカルリポジトリにダウンロード
git remote -v ローカルにクローンしたリポジトリのリモートURL確認方法

コミットメッセージ例

コミットメーセージ 意味
Create ●● class クラス作成
Add relation with ●● リレーションの追加
Add presence validation of ●● バリデーションの追加
Add #parse_body for parse body’s markdown -

参照

上記にも記入済み

その他

About resetting commit and rm the file

コミットの取り消し

直前のコミットの取り消し

$ git reset <打ち消したいコミットID>

直前のコミットを打ち消す場合には以下のコマンドを使用

$ git reset --soft HEAD^
  • --softオプション:ワークディレクトリの内容はそのままでコミットだけを取り消したい場合に使用
  • --hardオプション:コミット取り消した上でワークディレクトリの内容も書き換えたい場合に使用
  • HEAD^: 直前のコミットを意味
  • HEAD~{n}n個前のコミットを意味

コミットの打ち消し

$ git revert <コミットのハッシュ値>

作業ツリーを指定したコミット時点の状態にまで戻し、コミットを行う。

コミットの上書き

直前のコミットに上書きする場合は以下のコマンドを使用

$ git commit --amend

リモートリポジトリからのみ特定のファイルを削除

git rm --cached <target file>

ディレクトリを削除する場合は

$ git rm --cached -r <target directory>

reference

Public key authentication settings in github

公開鍵を GitHub に登録することで、push 時などにパスワードを入力する手間が省略可能

公開鍵および秘密鍵の作成と登録

  1. 公開鍵および秘密鍵を作成

    ssh-keygen -t ed25519
    
  2. 公開鍵 を GitHub に登録

    cat ~/.ssh/id_ed25519.pub
    # コマンドを実行して表示されたすべての文字列を GitHub に登録
    #
    # ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX user@host
    # ↑こんな感じの文字列をすべてコピペ
    

    GitHub の公開鍵登録の手順は、

    1. Settings
    2. SSH and GPG keys
    3. [New SSH key]
    4. タイトルをつけ公開鍵をコピペし [Add SSH key]
  3. SSH の設定 GitHub で使用する秘密鍵を設定するため、~/.ssh/config に設定を記述

最終行 (ProxyCommand の部分) は学内のコンピューターの場合にのみ設定

接続の確認

$ ssh -T git@github.com

ターミナルで実行して以下のように表示されればOK!

Hi (User名)! You've successfully authenticated, but GitHub does not provide shell access.

※途中で以下のプロンプトメッセージが表示されたらyesと入力 The authenticity of host '[ssh.github.com]:443 (<no hostip for proxy command>)' can't be established. RSA key fingerprint is [以下省略]. Are you sure you want to continue connecting (yes/no/[fingerprint])? The authenticity of host '[ssh.github.com]:443 (<no hostip for proxy command>)' can't be established. RSA key fingerprint is [以下略]. Are you sure you want to continue connecting (yes/no/[fingerprint])?

ssh接続がうまく行かないとき

レポジトリのディレクトリに入り次のコマンドを入力

git config remote.origin.url

https://github.com/[ユーザID]/[リポジトリ]となっていたらレポジトリのディレクトリ内の/.git/configを開いてurlの覧を

url = github.com:[ユーザID]/[リポジトリ].git

と書き換える。

または以下のコマンドを実行

git remote set-url origin [Host名]:[ユーザID]/[リポジトリ].git

※~/.ssh/configで設定していない場合は

git remote set-url origin git@github.com:[ユーザID]/[リポジトリ].git

でOK!

参照

Qiita「Githubでssh接続する手順」 GitHubヘルプを参考にSSHキーの設定を行ってみた

Confirmation of difference

ファイルの変更差分の確認

$ git diff [変更前のコミット識別子]..[変更後のコミット識別子]

ブランチ同士の差分の確認

$ git diff master..develop

masterブランチにプルリクエストを送る前にdevelopブランチに追加した内容を確認できる

git pull する前に、リモート追跡ブランチとの差分を確認する

  1. リモートリポジトリからの変更内容の取得
    $ git fetch origin
    
  2. ローカルリポジトリのmasterブランチの最新コミット(HEAD)とリモート追跡ブランチ(origin/master)を比較
    $ git diff HEAD..origin/master
    

git push する前に、リモート追跡ブランチとの差分を確認する

  • $ git diff origin/master..HEAD
    

参考

Branch

ブランチとは?

ブランチとは平行世界のようなものである。 ブランチを活用することでmasterブランチをそのまま据え置いた状態で、別のブランチで新機能を試しながら作ることができる。

ブランチの正体は?

github公式ドキュメントによると、

ブランチとは(中略)コミットを指す軽量なポインタに過ぎません と説明されている。

リポジトリの正体は.gitという隠しフォルダのことであり、この中にあるrefs/heads/masterファイルこそがブランチの正体である。 このファイルの中身をcatしてみると

dd95ddf066d452949bb54304bbf43ab3dadfee25

のように英数字の羅列が保存してある。これはコミットIDまたはコミットハッシュ値と呼ばれている。またコミットによって生成されたデータのことをコミットオブジェクトといい、一つのコミットオブジェクトに対して40文字のIDを割り当てるのがコミットIDである。

つまりブランチとはただ単に特定のコミットIDを指しているだけである。

またコミットオブジェクトにはそれぞれ

  • tree
  • parent
  • author
  • committer

の情報が保存されており、parentが一つ前のコミットIDを示している。

作成したsample.txtに何かしらの変更を加え、

$ git add sample.text
$ git commit -m "2回目のコミット"
$ git log

とすると、次のような結果が得られる。

コミットしたときのログ

このとき以下のように実行すると、コミットオブジェクトを確認することができる

$ git cat-file -p 0e9556

tree e290b48b356d721ae54d1edb03993802cc98bad8

parent 02f11b759bfeb461e117c5da18bb2dcbe06d862a

author llminatolllXXX@mail.coml1562052826 +0900

commit errllminatolllXXX@mail.coml1562052826 +0900

このparentの部分が前のコミットのコミットIDを表しており、一番はじめのコミットではpaerntは保存されていない

ひとことメモ ** コミットIDは何を元に作られているの?**

コミットID(コミットハッシュ値)は、実はこのコミットオブジェクトのバイト数と中身を使い、計算されて作られています。よって、コミットした人の名前やコミットした時間、指し示すparent、treeが違えばコミットハッシュ値も違うものになります。

その証拠に、同じ内容をコミットしていても、あなたの練習用リポジトリとわかばちゃんのコミットIDは違うはずです。コミットハッシュ値についてもっと深く知りたい方は、こちらの記事が詳しいのでおすすめです。

ブランチの操作

  • 今存在するブランチの確認

    $ git branch
    

    アスタリスクのついているブランチが現在のブランチ

  • ブランチの作成

    $ git branch <branch name>
    
  • ローカルブランチの作成をリモートにプッシュ

    $ git push origin <branch name>
    
  • ブランチの移動

    $ git checkout <branch name>
    

    ※指定したブランチへ移動する

    • -bオプションを指定するとブランチの作成とチェックアウトを同時に行える
    • -fオプションを指定するとブランチを強制的に切り替えることができる(コミットしていない作業データは消えるため注意)
  • リモートブランチの反映

    $ git fetch origin
    
  • ブランチの削除

    $ git branch -d <branch name> # ローカルブランチの削除(強制削除する場合は`-D`オプションに変更)
    $ git push origin --delete <branch name> # リモートブランチの削除(`$ git push origin :<branch name>` でも可)
    
  • remote には存在するブランチが local には存在しない場合

    $ git brantch -a 
    

    でブランチを表示

    $ git checkout -b release origin/release
    

    で解決できる!

  • ブランチのマージ:devブランチにmainブランチの内容をマージ(取り込む)

    ただしマージしただけではリモートリポジトリに反映されないので、その後pushする必要あり

    $ git checkout dev
    $ git fetch
    $ git merge origin/main
    
    • コンフリクトした場合に強制的にマージする際は、フェッチした後に$ git reset --hard origin/main
  • logの確認

    $ git log
    
    • option:
      • –graph: グラフ形式で表示
      • –decorate=“short”: ブランチ名の表示形式を変更 # select “short”, “full”, or “no”
      • –date=“relative”: 日時表示 # select “relative”, “local”, “default”, “iso”, “rfc”, “short”, or “raw”
  • shtash: 変更内容を隠す

    $ git stash
    $ git stash save "comment"    # コメント付きでstash
    $ git stash list              # stashした内容の一覧を表示
    $ git stash apply             # stashした内容を再度適用(stashした内容は保持)
    $ git stash pop               # stashした内容を再度適用(stashした内容は削除)
    $ git stash drop stash@{1}    # stashした内容を削除
    $ git stash clear             # stashした内容を全て削除
    

参考

Repository Access Restrictions

group内で作成したrepositoryのアクセス権限を設定する方法

  1. 操作したいrepositoryのsettingsをクリック
  2. 左のAccessCollaborators and teamsをクリックし、パスワードを入力
  3. Add peopleまたはAdd teamsをクリックし、アクセスを許可するpeopleまたはgroupを追加する

How to Create Repository

ローカルリポジトリの作成

  1. リモートリポジトリに登録したいディレクトリにして次のコマンドでバージョン管理のための初期化を行う。

    $ git init
    

    これで,ローカルリポジトリ(.git/)が作られ,git initを実行したディレクトリが作業ディレクトリになる。

    以下のようにgit initでローカルリポジトリ用のディレクトリを新規作成することもできる。

    $ git init <target directory>
    $ cd <target directory>
    
  2. .gitignoreの作成 gitコマンドでは無視したいファイルが有る時(LaTeXの一時ファイル等)は,.gitignoreという名前のファイルを作っておく。 以下は例。latex関連の一時ファイルを無視するように設定している。

    $ cat .gitignore
    *.aux
    *.idx
    *.log
    *.toc
    *.ist
    *.bbl
    *.blg
    *.dvi
    *.ilg
    *.ind
    *.lot
    *.out
    *.synctex.gz
    *~
    

ローカルリポジトリに登録するファイルやディレクトリの指定

下記のいずれかのコマンドで登録するファイルやディレクトリを指定

$ git add .            # 現在のディレクトリにある全てのファイル/ディレクトリを登録
$ git add figures/     # ディレクトリ figures/ 以下のファイルを登録
$ git add *.tex        # すべての .tex ファイルを登録
$ git add <ファイル名> #特定のファイルのみを登録

ローカルリポジトリにファイル登録

git addで指定したファイルやディレクトリを,ローカルリポジトリに登録する。

$ git commit -m "first commit"

-mは1行コメントをつけるオプション。 更新したファイルをローカルリポジトリに反映するときにも,同様にgit addとgit commitを実行する。ここまではローカルリポジトリの管理。

gitサーバ上で新規リモートリポジトリを登録

  1. GitHubにログイン

  2. 左上のRepositoriesの隣りにあるNewのタブをクリック

  3. repository作成ページで以下のことを記入

    • Repository name : リポジトリの名前
    • Description : リポジトリの内容
    • Public / Privateの選択
  4. Create repositoryをクリック

  5. リポジトリ作成後のすべきこと(コマンドライン)が記載されたページが表示されるので、URLの覧をチェックしておく。以下はその一例。

    echo "# re" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    git branch -M main
    git remote add origin https://github.com/<ユーザーネーム>/<repository名>.git
    git push -u origin main
    
  6. コマンドラインの上にHTTPSSSHかを選択する覧もあるので、SSHにする場合はここで選択しておく

トークンの作成

2021年8月13日以降、GitHubのリポジトリにアクセスするには、ユーザ名とパスワードではなくアクセストークンが必要になった。

  1. GitHubにログイン
  2. 右上のアイコンをクリックし、一覧からSettingsをクリック
  3. 左下のDeveloper settingsをクリック
  4. 左の覧からPersonal avvess tokensをクリック
  5. 右上のGenerate new tokenをクリックしてアクセストークンを作成
  6. 以下のことを記入 Note : トークン名 Expiration : トークンが使用できる期限。この期限が切れると新しくトークンを作成する必要がある。(上限あり) Select scopes : 少なくともrepoの覧はチェックを入れること。 トークンは一度ページを移動すると二度と見れなくなってしまうため、作成後はコピーして保存しておくこと!!!

Gitサーバへの登録

ローカルリポジトリとgitサーバ上のリモートリポジトリの紐付け

ローカルリポジトリ(要はgit管理したいプログラム群のあるディレクトリ)をgitサーバ上のリモートリポジトリと紐付ける。リモートリポジトリを作成した際に表示されたすべきこと(コマンドライン)を順次実行していく。 以下はその一例。

git branch -M main
git remote add origin https://github.com/<ユーザーネーム>/<repository名>.git
git push -u origin main

ただしURLの覧にはhttps://github.com/...の間に<トークン>@を加えて実行する。

$ git remote add origin https://<トークン>@github.com/<ユーザーネーム>/<repository名>.git

ユーザーネームとパスワードを求められたらユーザーネームには自分の登録名、パスワードにはトークンを打ち込む

git remoteは,サーバ上のファイル置き場(リモートリポジトリ)を登録する命令。 この例では,URL(https://github.com/<ユーザーネーム>/<repository名>.git)を,originという名前(識別子)で登録している。 識別子 origin は他の名前にしても良いが,慣習的にこの名称が使われている。 someone/somerepoの部分は,GitHub上に作ったリポジトリの名前に従って設定する。

ただし,非公開リポジトリ(private repository)に登録する場合は,以下のようにGitHubの認証情報を加える。

$ git remote add origin https://<username>@github.com/s<ユーザーネーム>/<repository名>.git

セキュリティを高めるためには,ssh keyをGitHubに登録しておいて,ssh通信にするほうが無難。この場合のgit rmoteは以下のなる。

$ git remote add origin git@github.com:someone/somerepo.git

登録情報の確認

$ git remote -v

登録情報を間違えていたら,以下のコマンドで一旦削除して再登録する

$ git remote rm origin

Settings

アカウントの作成

GitHubのホームページでアカウントを作成する

pro版(GitHub Education)への変更方法

  1. GitHub Educationにアクセス
  2. 右上のBenefitsをクリック
  3. IndividualsのGet student benefitsを選択
    申し込むための資格が書いてあります。
    学生であること。
    学校からもらったメアドがあること。
    GitHubアカウントを持っていること。
    13歳以上であること。 Screenshot from 2020-09-23 15-02-45.png
    
  4. Add an email addressから学校のアドレスを追加
  5. How do you plan to use GitHub?にgithubの利用目的を記入
  6. Submit your informationを押して完了 ※利用目的は形式的なものなので(多分)適当に書いてOK!

参考ページ

Qiita , @Kobayashi2019「GitHub Educationのメリットと申請方法

gitコマンドのインストール

git コマンドをローカルマシンにインストールする。 Mac OSの場合は,Xcode コマンドラインツールをインストールしていたら,gitコマンドもインストールされている。

apt-get対応のLinuxディストリビューションなら以下でたいていOK。

$apt-get install git 

自分のアカウント情報のローカルマシンへの登録

$git config --global user.name <ユーザーネーム>
$git config --global user.email <登録したメールアドレス>
$git config --global core.editer vi   #コメント編集につかいたいエディタを設定(デフォルトはvi)

--globalは,ローカルリポジトリ作成時のデフォルト設定にするためのオプション。 特定のリポジトリでのみ別の設定にしたいときには,ダウンロードしたポジトリ内に移動してから--localを指定して実行する。

必要に応じてproxy設定

外部とのネットワーク接続にproxy設定が必要な環境の場合は,Proxy設定のページを見て設定をする。ターミナルとgitのproxy設定をする。

git pull するたびに警告が出る…