2022-12-17に更新

Gitの基本操作

Git

SSH秘密鍵・公開鍵をGitHubに登録する

GitHubとローカル環境を紐付ける仕組み

  1. ローカル環境でSSH公開鍵とSSH秘密鍵を作成する。
  2. 公開鍵の方をGitHubに登録する。
  3. GitHub側で登録されている公開鍵とローカル環境が持っている秘密鍵が合致すればアクセスのリクエストが許可される。

ローカル環境でSSH公開鍵・秘密鍵を作成する

  1. 公開鍵・秘密鍵は「~/.ssh」以下に生成されるので、事前に作成されていなければ当該ディレクトリを作成し、「~/.ssh」ディレクトリに移動しておく。
e.g., /Users/ahsabkab/.ssh/id_rsa.pub
  1. GitHub Docs を参考にコマンドを叩き鍵を生成する。SSH 接続の際、「~/.ssh/id_rsa」、「~/.ssh/id_dsa」、「~/.ssh/identity」しかデフォルトでは見に行かないため、それ以外のファイル名にした場合は config ファイルで秘密鍵のパスを明示する必要がある。
  2. GitHubに公開鍵を登録する。
  3. SSH初回接続のテストを行う。

Git に GitHub の認証情報をキャッシュする

Git に built-in されているcacheヘルパーを利用する方法

  • HTTPS での Git 操作ごとに PAT を手動で入力する代わりに、Git クライアントを使用して PAT をキャッシュできる。
  • git pushなどでPATの入力を求められる前に以下のコマンドを叩く
# キャッシュ保持期間の単位は秒
git config --global credential.helper 'cache --timeout=3600'
  • git pushなどを叩く

ローカルリポジトリの取得

既存のプロジェクトでGit管理をスタートする

$ git init (管理したいプロジェクトの存在するディレクトリで行う)

これを実行すると .git という名前の新しいサブディレクトリが作られ、リポジトリに必要なすべてのファイル (Git リポジトリのスケルトン) がその中に格納されます。 この時点では、まだプロジェクト内のファイルは一切管理対象になっていません 。

空のディレクトリではなくすでに存在するファイルのバージョン管理を始めたい場合は、まずそのファイルを監視対象に追加してから最初のコミットをすることになります。この場合は、追加したいファイルについて git add コマンドを実行したあとで git commit コマンドを行います。

引用元:Git - Git リポジトリの取得

git管理を辞めたい(ローカルリポジトリを削除したい)ときは .git/ ディレクトリ毎削除すれば良い。

リモートリポジトリからクローンする

# リポジトリをクローンしたいディレクトリで行う
e.g., $ git clone https://github.com/username/project_name

以下コマンドの挙動
* まず project_name というディレクトリを作成
* その中で .git ディレクトリを初期化(git init
* リポジトリのすべてのデータを引き出し、最新バージョンの作業コピーをチェックアウトする

基本のコマンド

git add

  • コミットの対象となる変更を staged changes に入れる

git add -u

  • 追跡されている変更があった全てのファイルをステージングする
    • ⭕️ 変更されたファイル、削除されたファイル
    • ❌ 新しく追加されたファイル

git add -A (--all)

  • 変更があった全てのファイルをステージングする
    • ⭕️ 変更されたファイル、削除されたファイル、新しく作られたファイル

git commit

  • staged されたファイルをコミットする
  • -aオプションを付けるとgit addを省略できる (追跡対象となっているファイルを自動的にステージしてコミットする)

git reset

  • 現在のHEADを指定された状態にリセットする

git revert [commit ID]

  • 仮に致命的な不具合があるコミットにあるとわかったとして、当該コミットを元に戻し「当該コミットを元に戻し」たことをコミットする
  • git resetとの違いは変更の履歴が残る点 (コミットするので)
  • マージをリバートする場合は e.g., git revert -m 1 3865edf

git restore

  • ワークツリーファイルを復元する
e.g. 現在のディレクトリ内のすべてのファイルを復元する
$ git restore .
e.g. 特定のファイルを復元する
$ git restore --staged hello.c

git rm

  • git rm を実行すると、ファイルの削除がステージされる
  • ファイルをGitの追跡対象から外し ( i.e., ステージングエリアから削除し) 、作業ディレクトリからもファイルを削除し、そしてファイルの削除をステージする
  • ∴ 追跡されていないファイルとして残り続けることがないということ
  • 単に作業ディレクトリからファイルを削除しただけの場合は、git status の出力の中では “Changed but not updated” (つまり ステージされていない) 欄に表示される
  • 次にコミットするときにファイルが削除され、追跡対象外となる
  • 変更したファイルをすでにステージしている場合は、-f オプションで強制的に削除する必要がある

git rm --cached

ファイル自体は作業ツリーに残しつつステージングエリアからの削除だけを行う (以下「Git - 変更内容のリポジトリへの記録」より抜粋)

つまり、ハードディスク上にはファイルを残しておきたいけれど、もう Git では追跡させたくないというような場合のことです。 これが特に便利なのは、.gitignore ファイルに書き足すのを忘れたために巨大なログファイルや大量の .a ファイルがステージされてしまったなどというときです。 そんな場合は --cached オプションを使用します。

$ git rm --cached README
ファイル名やディレクトリ名、そしてファイル glob パターンを git rm コマンドに渡すことができます。 つまり、このようなこともできるということです。

$ git rm log/*.log
「*」の前にバックスラッシュ () があることに注意しましょう。 これが必要なのは、シェルによるファイル名の展開だけでなく Git が自前でファイル名の展開を行うからです。 このコマンドは、log/ ディレクトリにある拡張子 .log のファイルをすべて削除します。 あるいは、このような書き方もできます。

$ git rm *~
このコマンドは、~ で終わるファイル名のファイルをすべて削除します。

git diff

  • 作業ディレクトリの内容とステージされているエリアを比較する
  • 変更したがまだステージしていない内容を見るとき使う

git diff --staged

  • ステージされている内容と直近のコミットの内容を比較する
  • ステージされた内容を知りたい時に使う
  • git diff --cashedと同義

git push [remote-name] [branch-name]

  • 追加したコミットを origin サーバー (クローンした時点でこのブランチ名とサーバー名が自動設定される) にプッシュする
  • リポジトリをクローンしたときには、リモートリポジトリに対して自動的に “origin” という名前がつけられる

git push [remote-name] --delete ( -d ) [branch-name]

git push [remote-name] :[branch-name] でも可
リモートリポジトリからブランチを削除する

git branch [branch-name]

  • ブランチを作成する
  • 今どのブランチで作業しているのか知りたいときはgit log --oneline --decorate
% git log --oneline --decorate
fb3fcb0 (HEAD -> main, origin/main, origin/HEAD, testing1) Add a message to README.md
3babbc1 Initial commit
# HEAD -> main となっている = 現在の作業ブランチは main という意味
  • HEAD と呼ばれる特別なポインタが現在のブランチを指し示してくれる
  • あくまでローカルリポジトリ内での話なので push しない限りリモートには反映されない

git branch -r

リモート追跡ブランチ一覧表示

git branch -a

ローカルブランチとリモートブランチの両方を表示

git branch -d [branch-name]

ブランチを削除
-rと組み合わせるとリモートブランチ追跡ブランチを削除する
リモートリポジトリのブランチを削除

git checkout

  • (引数をブランチ名に指定した場合) ブランチを切り替えたり最新のワーキングツリーファイルを復元したりする
  • -bオプションをつけるとブランチの作成と同時にチェックアウトできる (git checkout -b feature/add_registration)
  • (引数をコミットIDにした場合) 過去の任意のコミット時点にHEADを置く
e.g.
$ git checkout ceef55d
# 元のコミットやブランチ名を指定すれば現在の状態に戻る
$ git checkout [branch-name]

git merge [branch-name]

  • 影響を受けるのはローカルリポジトリのみ
e.g. when you want to merge "test1" into "main"...
# main にチェックアウトして行う
# 統合したいブランチ名を引数に置く
$ git merge test1
  • チームメンバーの誰かと編集箇所がバッティングした状態でマージするとコンフリクトが発生する
  • コンフリクトの解消について詳しくはここ
  • GitHub上にマージしたい場合はプルリクエストを出す

git stash

  • コミットされていない変更 ( both not staged changes and staged changes ) を一時的に保存する (下書き保存的な)
  • stash は作業しているローカルリポジトリにのみ適用される
  • プッシュ時にサーバーに転送されない
  • 一時保存した変更はgit stash popで復元できる
ツイッターでシェア
みんなに共有、忘れないようにメモ

光の勢力

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント