【Git第3回】Gitの各種コマンドの使い方(変更・削除・gitignore・変更の戻し)

【Git第3回】Gitの各種コマンドの使い方(変更・削除・gitignore・変更の戻し)

GitとGitHubのプログラミングメモ第3回です。何回かに分けてメモを投稿していきます。

なお、この記事はプログラミングメモですのでどんどん追記していきます。

【参考資料】
>> 【Udemy】Git: もう怖くないGit!チーム開発で必要なGitを完全マスター
【関連記事】

この記事で扱う主なコマンド

# 変更点を確認するコマンド
git log --oneline  # ファイルの変更履歴を一行で表示
git rm             # ファイルの削除を記録する
git status         # 現在変更されているファイルを確認する
.gitignore         # バージョンを管理しないファイルを記述するファイル
git diff --staged  # ステージとコミットの間の変更内容を表示

# 変更を戻すコマンド
git checkout       # ワークツリーのファイルへの変更を取り消す
git reset HEAD     # ステージした変更を取り消す
git commit --amend # 直前のコミットをやり直す

変更履歴の確認

コマンドは以下の通り

# 変更履歴の確認
git log

# 一行で表示
git log --oneline

# ファイルの差分変更を表示
git log -p 

# 表示するコミット数を制限する
git log -n <コミット数>
# コマンド
git log

# ※qを押すと終了

# 実行結果
commit 2d4f026747ca7db7cdec88f1378108a201f229a5 (HEAD -> master)
Author: conti0513 <yoshimasa@sawadesign.jp>
Date: Wed Feb 8 20:26:20 2023 +0900

ファイルの削除を記録する

コマンドは以下の通り。

# ファイルごと削除
# ※ワークツリーからもリポジトリからも削除される
git rm
git rm -r

# ファイルを残したいとき
# ※リポジトリからのみ削除
$ git rm --cached

# ディレクトリを再起的に削除
$ git rm -r --cached

ファイルの移動を記録する/ハンズオン

コマンドは以下の通り。実際にファイルの移動(リネーム)をハンズオンで行ってみる。

# コマンド
git mv <旧ファイル> <新ファイル>

# 以下のコマンドと同様の意味
git rm <旧ファイル>
git add <新ファイル>
# 実行結果
# 事前にlsで確認。
$ ls -la
-rw-r--r-- 1 yoshi staff 114 Feb 8 20:14 index.html

# git status で確認
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: git-tutorial.txt

no changes added to commit (use "git add" and/or "git commit -a")

# 「index.html」→「index.html2」にリネームしてみる
$ git mv index.html index2.html

# 再度、ls で確認 → リネームされていることがわかる
$ ls -la
-rw-r--r-- 1 yoshi staff 114 Feb 8 20:14 index2.html

# git status でも確認可能
$ git status
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
renamed: index.html -> index2.html
:
:

# 変更を元に戻す
$ git mv index2.html index.html

# ls で確認
$ ls -la
-rw-r--r-- 1 yoshi staff 114 Feb 8 20:14 index.html

# git status で確認
# no changes で何も変更されていないとの記述
$ git status
:
:
no changes added to commit (use "git add" and/or "git commit -a")

GitHubにプッシュするための事前準備

開発の流れ

ローカル/ワークツリー
git add.
ローカル/ステージ
git commit
ローカル/リポジトリ
git push
リモート/リポジトリ(GitHub)


GitHubにプッシュするための事前準備3つ

  1. リモートリポジトリ(GitHub)を新規追加する
  2. ショートカットをリモートリポジトリに登録しておく
  3. 事前にアクセストークンを発行しておく

以下の手順でリポジトリを作成しておく

> GitHubのトップページ
> your profile
> your Repositories
> Repositories
> Click New
> Repository name:Tutorial
> Click Create Repositorie

以下の箇所のコマンドをコピーする
「…or push an existing repository from the command line」

# リポジトリを作成するコマンド
git remote add origin https://github.com/conti0513/Tutorial.git

ショートカットをリモートリポジトリに登録しておく

# 毎回URLを指定しなくても済むように事前に登録しておく
# 以下は「origin」というショートカットでリモートリポジトリを登録するコマンド例
git remote add origin 

パーソナルアクセストークンを準備しておく

  • GitHubにプッシュするためにはユーザーIDとパーソナルアクセストークンが必要
  • パーソナルアクセストークンを事前に取得しておく

パーソナルアクセストークンを取得する手順

> GitHubのトップページ
> icon
> Settings
> Developer settings
> Personal access tokens (classic)
> Generate new token
# 以下はtoken の設定例
Note          : Admin
Expiration    : 90days
Select scopes : ALL(今回は)

> create token をクリック

# tokenが生成されたことを確認する
token
*****

実際にローカルリポジトリの内容をリモートリポジトリにプッシュしてみる

コマンドは以下の通り。

# -u : 次回以降「git push」のみでoriginにプッシュ可能となるオプション
git push -u origin master

> 途中でGitHubの認証画面が入る
> パスワードを入力

# 実行結果
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 2.58 KiB | 2.58 MiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/conti0513/Tutorial.git
* [new branch] master -> master
branch 'master' set up to track 'origin/master'.

key chain access

  • Macの場合、各種パスワードをローカルで管理することが可能
  • 起動方法 APP > 検索:key > key chain accessを起動 > 「git」を検索する

GitHubにプッシュできたかの確認

GitHubのページに移動
https://github.com/conti0513/Tutorial


管理しないファイルをGitの管理から除外する(.gitignore)

「.gitignore」ファイルに書く
.gitignore に記載された対象ファイルは、git add の実行時に、インデックスに追加されないようになる。

各コマンド

すでに追跡しているファイルは「.gitignore」に記載しても消えないので、一旦コマンドで追跡対象から外す

# すでに追跡しているファイルを Gitの追跡対象から外す
$ git rm --cached


# 再起的に、すでに追跡しているディレクトリをGitの追跡対象から外す
$ git rm -r --cached

# .gitignore への記載例
# .gitignore ファイルがある階層がルート改装となる
file-a.php         # どのディレクトリかを問わず、file.phpを除外
/file-a.php        # .gitignore が置かれたディレクトリ内のfile.phpを除外
directory-a        # 文字列マッチが見つかるパスを除外する
directory-a/       # ディレクトリ配下(のすべてのパスを)除外する
.ht*               # 「.htaccess」と「.htpasswd」など、.ht で始まるファイルを追跡しない
*                  # すべてのファイルを追跡しない
detail-[1-9].html  # detail-1.html ~ detail-9.html をマッチ
*
!/file-to-trak.php # file-to-track.phpだけを追跡する。
*
!/direcotry-a/     # directory-a のみを追跡
*.jpg
*.png              # 特定の拡張子を無視する
                   # ワイルドカードを利用して、jpgとpngを無視
                   # どのディレクトリにあるファイルかケアしない
#                  # This is commented out.
                   # コメントアウト

エラー対応

Macで「.gitignore」をうまく読み込めない場合、改行コードを変更することで読み込めるようになる場合がある。

vim .gitignore
# 値を確認
:set ff?

# 結果
mac

# 値を変更して終了。
:set ff=unix
:wq

Gitの変更を元に戻す

  • コミットの修正・やり直し(amend)
  • コミットの取り消し(reset)
  • コミットの打ち消し(revert)
  • 別ブランチからのコミットの取り込み(cherry-pick)

ワークツリーのファイルを元に戻したい時

# コマンド
git checkout --
git checkout --

# 全変更を取り消す
git chekout --

 

ステージした変更を取り消す場合

# コミット前の git add を取り消す
# command
git reset  # ファイル名を指定した場合
git reset  # すべてのファイルの変更を対象とする場合

# 確認コマンド/直前のコミットが取り消されている
$ git log --oneline

直前のコミットをやり直す

git reset (–soft | –mixed | –hard)
「git reset」コマンドには3つのオプション

soft

  • 選択したコミットまで戻し、すべての変更をインデックスに保持したままにする
  • 細かいコミットをまとめたり、整理したい時などに便利

mixed

  • 選択したコミットまで戻し、インデックスはリセットされ、すべての変更はワーキングツリーに保持した状態になる
  • デフォルト(オプション指定なし時)のオプション

hard

  • 選択したコミットまで戻し、すべての変更を破棄
  • 誤ったコミットを取り消したい時などに便利

# コマンド
# 
git commit --amend

git pushを取り消す

# command
git resetコマンド   # 履歴が残らずに修正
git revertコマンド  # 履歴を残して修正

git reset --soft HEAD^ # ローカルの変更は残す
git reset --hard HEAD^ # ローカルの変更も消す

# 確認コマンド/直前のコミットが取り消されている
$ git log --oneline

git resetを取り消す

# 直前のgit resetを取り消す
# Gitの参照ログから、もとに戻したいコミットのHEAD@{X}を確認する
git reflog

# command
git reset --soft HEAD@{X} # ローカルの変更は残す
git reset --hard HEAD@{X} # ローカルの変更も消す

# 確認コマンド/直前のコミットが取り消されている
$ git log --oneline

コミットを取り消す(ハッシュ値の削除)

ゴミcommitが残ってしまった場合は、ハッシュ値を消すことで改善する場合があります。

# ハッシュ値を確認
git log

# ハッシュ値の削除
git reset --hard <削除したいハッシュ値>

# 強制プッシュ
git push -f origin main