【初心者】Gitの基本的なコマンド操作や意味を学ぶ

image

前回Githubの操作について書きました。

【初心者】Githubでリポジトリ作成&ファイル置いたり操作したり
今後カスタムノードとか拡張機能とか作れたらいいなと思って公開用のGithubを作りました。主にAI開発で作った簡単なツールや拡張機能などを公開していく予定です。私自身初心者なのでgithubってなに?どんなことできるの?的なことを調べて自分…

GitはGithubとは別物ですが、Gitが使えるとローカルでの作業やGithubとの連携がスムーズになります。

今回はこのGitについて自分なりに調べながらまとめてみました。

Gitとは?

image

Gitは分散型バージョン管理システムと呼ばれるものです。

分散型は複数人で作業できる仕組みのこと。

リモートサーバー(Githubなど)にあるリポジトリを各開発者がローカル環境にクローンして平行作業ができます。

またクローンしたものがバックアップ変わりになったりいろいろメリットがあるそうです。

バージョン管理は変更履歴を残せる仕組みのこと。

ファイルを変更してコミット(記録)すると、その時点の状態を保持できます。

コミットするごとに一意のハッシュ値が付与されるので、それらを追跡・比較したり、復元したりが可能です。

Git

Git – Wikipedia

Gitのインストール

以下のリンクにアクセスしてインストーラーをダウンロードします。

Git – Install for Windows

OSごとにタブがあるので、自身の環境に合うものを選んでください。

image

あとはインストーラーを起動して案内に沿って進めてください。

特に変更などせずそのままで大丈夫です。

image

これでgitが使えるようになります。

試しにバージョン確認コマンドを実行してみます。

Windows検索とかからコマンドプロンプト/ターミナルを起動してください。

image

以下を実行します。

git --version

こんな感じでバージョンが表示されればgitが使える状態です。

image

Gitの基本コマンド

git config(ユーザー設定)

gitでファイルを変更したとき、誰がいつ何をしたか分かるようユーザー設定が必要です。

個人で利用する場合でもコミットしたときにお前は誰だと確認されるため、事前に設定した方がスムーズに作業できます。

以下のコマンドで設定可能です。

名前とアドレス部分は自身のものに変えてください。

git config --global user.name "あなたの名前"
git config --global user.email "メールアドレス"

確認はこのコマンドでできます。

# 名前の確認
git config --global user.name

# メールアドレスの確認
git config --global user.email

なお、特定のリポジトリを別ユーザーとして操作したい場合、そのパスで–globalつけずに実行すればいいそうです。

git config user.name "あなたの名前"
git config user.email "メールアドレス"

あとローカルだけなら問題ないのですが、github上に公開、それをクローンしてログを辿ると第三者にもアドレスは見えてしまうそうです。

githubにダミーで使えるアドレスがあるので、それ使った方が良いかもしれません。

以下にアクセスしてKeep my email addresses privateをONにすればアドレスが表示されます。

Build software better, together
GitHub is where people build software. More than 225 million people use GitHub to discover, fork, and contribute to over…

それを登録すればgithubとは紐づけつつ、アドレスはダミーのまま作業ができます。

git init(リポジトリ作成)

これは任意のフォルダをgitで管理するための初期化コマンドです。

今回サンプルとしてdice-projectというフォルダを作り、その中にサイコロ振るpython作ってみます。

E:\note_dev\dice-project

ターミナルでこのパスに移動しgit initを実行。

image

そうすると.gitというフォルダが作成され、gitで操作したときの履歴などがこの中に残ります。

image

それで変更履歴を追ったり、比較したり、復元したりが可能です。

.gitignore(無視するファイル)

「.gitignore」はコマンドじゃないですが、Gitの管理下から除外するファイル/フォルダを指定できるものです。

例えばAPIキーが書かれた.env、リポジトリに関係ないファイルが入ってるフォルダなど。

.gitignoreというファイルを作り、中を以下のように書けば、書いたものは後述するadd / commitしても含まれません。

# 特定のファイルを指定
.env
# フォルダを指定
sample/
# 特定の拡張子を全て除外
*.log

git add / commit(スナップショット)

ファイルの状態を保存することをスナップショットと言うそうです。

git addはステージジングと呼ばれ、どの変更内容を保存するか指定するもの。

git commitが保存を実行するコマンドです。

新しくdice_gui.pyというファイルを作ってこの状態を保存したい場合、まずはgit addでステージングします。

git add dice_gui.py

もしdice_gui.py以外に複数のファイル編集して、カレントディレクトリの変更全てをステージングしたい場合はgit add .が使えます。

git add .

これをgit commitで保存します。

“”内には何をしたかコメントが残せます。

git commit -m "dice_gui作成"

実際に実行するとこんな感じです。

ハッシュ値が割り振られて保存できました。

image

git status(リポジトリの状態を確認)

git statusは現在のリポジトリの状態を確認するコマンドです。

今どのブランチにいるか、ファイルを変更してまだステージングしてないファイル、ステージングしてまだコミットしてないファイルなどを確認できます。

何らかのエラーが出たらgit status使えば大体原因がわかるそうです。

git status

何もなければcleanと表示されます。

image

git log(履歴の確認)

git logは、誰がいつなにしたかを確認できるコマンドです。

リポジトリ全体のコミット履歴を表示できます。

git log

実際に実行するとこんな感じ。

image

また特定のファイルだけとか、件数、日付、ブランチも指定可能です。

# 特定のファイル
git log -- sample.py
# 件数指定
git log -10
# 日付指定
git log --since="2024-01-01" --until="2024-02-01"
# ブランチ指定
git log main

git diff(差分の確認)

git diffでは最後にコミットしたものと、修正したファイルの差分を表示できます。

例えばdice_gui.pyに「diff確認用」というコメントを入れて保存します。

これでgit diffを実行すると、最後にコミットした状態と今の状態の差分が表示できます。

git diff
image

もしステージングしたファイルとの差分を確認したい場合は、「git diff –cached」を使います。

git diff --cached
image

commitごとの差分を比較したい場合はハッシュ値やHEADなどで指定できます。

HEADは最新のコミット、HEAD~1は1つ前のコミット。

git diff 41254d0 394b6b0 -- dice_gui.py
git diff HEAD~1 HEAD -- dice_gui.py

git branch(ブランチ作成)

branchは元の作業ラインとは別の作業ラインを作れるコマンドです。

メインの作業ラインを汚さないために、枝分かれさせて作業ができます。

今dice_gui.pyにはサイコロを振る機能しかありません。

image

なのでブランチを分けてリセット機能を追加し、それをメインにマージ(統合)ということをやってみます。

ブランチ作成は「git branch ブランチ名」のように書きます。

git branch feature/reset-button

ブランチ名は分類・整理がしやすくなるためスラッシュ入れるのが一般的だそうです。

(入れなくても作れます)

AIに聞くとprefix、スラッシュ、何のブランチかで名前をつけるとのこと。

  • feature/xxx → 新機能
  • bugfix/xxx → バグ修正
  • hotfix/xxx → 緊急修正
  • release/xxx → リリース準備
  • experiment/xxx → 試験的な作業

今回はリセット機能をつけるためのブランチなので、feature/reset-buttonにしました。

git switch / checkout(ブランチ切り替え)

git switch / git checkoutは作成したブランチに切り替えるコマンドです。

さっきfeature/reset-buttonというブランチを作成したのでこちらに切り替えます。

git switch feature/reset-button
git checkout feature/reset-button

switchとcheckoutについて基本同じ結果らしいのですが、ブランチの切り替え専用コマンドとしてswitchの方が推奨されているそうです。

実行すると「Switched to branch ‘feature/reset-button’」で切り替わったのが確認できます。

image

なお、以下のようにするとブランチ作成と切り替えも同時に実行できるそうです。

git switch -c feature/reset-button

この状態でリセット機能を追加してスナップショットをとります。

# 5. 「リセット」ボタン (★追加された機能)
reset_button = tk.Button(
    button_frame, # 配置先を button_frame に変更
    text="リセット",
    font=("Helvetica", 20),
    command=reset_display # クリックされたら reset_display を実行
)
reset_button.pack(side=tk.LEFT, padx=10) # 左から詰めて配置
git add dice_gui.py
git commit -m "リセット機能を追加"

一応実行して問題ないか確認します。

image

git merge(ブランチ統合)

feature/reset-buttonで実行して大丈夫そうだったので、これをmasterブランチにマージします。

まずはmasterに戻ります。

git switch master
image

で、今いるブランチに指定したfeature/reset-buttonをマージします。

git merge feature/reset-button

masterブランチでdice_gui.pyを実行すると、ちゃんとリセット機能が追加できました。

image

マージしたあとブランチが不要であれば以下のコマンドで削除できます。

git branch -d feature/reset-button

git restore(未コミットの変更を戻す)

git restoreは、ファイルを変更したあとに直前のコミットに戻す、またはステージングを取り消せるコマンドです。

例えばdice_gui.pyを編集したけど、何らかの理由で直前のコミットの状態に戻したいという場合はgit restore ファイル名で戻せます。

git restore dice_gui.py

git add dice_gui.pyでステージングしたけど、やっぱり取り消したいってときは以下のように書きます。

# ファイル指定
git restore --staged dice_gui.py 
# 全ファイル
git restore --staged .

git revert(コミットを安全に取り消す)

git revertは特定のコミットを取り消して、消したというコミットを残すコマンドです。

今コミットしたハッシュ値がabcd1234で、これを取り消したい場合、以下のように書きます。

git revert abcd1234

実行するとVimという画面がでて、コメントを編集できます。

基本はそのままでも良いそうです。

:wqを入力してEnterを押すと、abcd1234は削除されて、削除したというコミットが作られます。

image
image

git reset(コミットの巻き戻し)

git resetはcommitを取り消せるコマンドです。

オプションでどこまで取り消すかを指定できます。

revertと違い履歴が残らないので、通常はrevertが推奨されているみたいです。

またresetはどのcommitに戻すかを指定するので、それ以降のコミットは削除されます。

今コミットしたハッシュ値がabcd1234で、その前のabcd1233に戻したい場合、以下のように書きます。

# コミットのみ取り消す
git reset --soft abc1233
# コミット+ステージングも取り消す
git reset --mixed abc1233
# コミット+ステージング+ファイルの変更も取り消す
git reset --hard abc1233

Gitでリモート(Githubなど)とやり取りするコマンド

Githubなどリモートリポジトリとファイルをやり取りする際の基本的なコマンドです。

git remote add(リモートの登録)

git remote addは、ローカルとリモートを紐づけできるコマンドです。

先にGithubでリポジトリを作ります。

https://github.com/aiai-r/dice-project.git

ここにローカルリポジトリを接続したい場合、以下のように書きます。

git remote add origin https://github.com/aiai-r/dice-project.git

なお、ローカルで先にgit remote add~を実行して、同じ名前のものをリモートに作ればそれでも機能するそうです。

git push(ローカルの履歴をリモートへ送信)

git pushはローカルのファイルをGithubなどに反映できるコマンドです。

初回のみ「-u branch」でpushすると、デフォルトでどのリモートのどのブランチと対応させるかを指定できます。

追跡ブランチというらしいです。

git push -u origin main

これ以降はpushのみでOKになります。

git push

-uつけなくても成功しますが、そうすると毎回ブランチ指定が必要なので初回はやっておいた方がいいかもです。

あとこういうファイルのやり取りを初めて実行したときに、Githubへログインを求められます。

以下のような画面がでると思うので、連携したいアカウントでログインしてください。

image

・発生したエラーここでいくつかエラーが出たので書いときます。

最初にgit push -u origin mainを実行すると以下が出ました。

error: src refspec main does not match any
error: failed to push some refs to 'https://github.com/aiai-r/dice-project.git'

これはGithubだとリポジトリ名がmain、Gitだとmasterになっているので、ブランチ名の違いによりpushできないそうです。

なのでローカルのブランチ名をmainにしてからpushすればOKとのこと。

git branch -Mでブランチ名が変えられるので、githubと同じにしてからpushします。

git branch -M main
git push -u origin main

でまたエラー。

! [rejected]        main -> main (fetch first)
error: failed to push some refs to 'https://github.com/aiai-r/dice-project.git'
hint: Updates were rejected because the remote contains work that you do not
hint: have locally. This is usually caused by another repository pushing to
hint: the same ref. If you want to integrate the remote changes, use
hint: 'git pull' before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

これはgithubでリポジトリ作るときにlicenseファイルを作っちゃったので、履歴が合わずpushを拒否されているそうです。

なので先に–rebaseでpullします。

pullはリモートのファイルをリポジトリに反映するもの、–rebaseはgithubの履歴の上にローカルの履歴を重ねられるオプションだそうです。

これなら両方のファイルを維持できます。

git pull origin main --rebase

でまたエラー。

error: cannot pull with rebase: You have unstaged changes.
error: additionally, your index contains uncommitted changes.
error: Please commit or stash them.

これはファイルいじったのにコミットしてないものがあるため、commitかstashしろと言われてます。

とりあえずCommitしてからpullしてみます。

git add .
git commit -m "commit"
git pull origin main --rebase

やっと問題なく実行できました。

image

これで最初にやったpushを実行します。

git push -u origin main
image

これで追跡ブランチの設定もできて、リモートとやり取りできるようになりました。

git stash(変更を一時的に避難させる)

git stashは作業内容を一時的に避難させるコマンドです。

上記のエラーみたいに何らかのファイルを変更してコミットしてない状態だとpullやbranchの切り替えができません。

なのでコミットはしない、ファイルの変更は残したい、その状態でpullしたいみたいなときに、stashで一時避難させておけばあとから戻すことができます。

git stash

stashしたものを戻すときはapply。

git stash apply

適用してからstashを消す場合はdrop。

git stash drop

適用と削除を一回でやるならpopだそうです。

git stash pop

git fetch(リモートの最新を取得)

git fetchは、リモート側で変更があった場合にそれを確認できるコマンドです。

pullと違い確認のみで反映はされません。

git fetch

git pull(リモートの最新を取得し反映)

git pullはリモートの最新状態をローカルに反映できるコマンドです。

追跡ブランチの設定したあとならgit pullだけで反映できます。

git pull

git clone(リポジトリを取得)

git cloneはリモートのリポジトリをローカルにコピーするコマンドです。

既にgithub側にファイルがある状態で、それをローカルで使う、または開発したい場合などに使います。

git clone https://github.com/aiai-r/dice-project.git

コンフリクト(競合)の解決方法

コンフリクトは、git pullなどでGitが変更を統合できないエラーのことです。

例えばリモート側で誰かがdice_gui.pyの3行目に「# HELLO」とコメントを記入してコミット。

同じくローカルでdice_gui.pyの3行目に「# こんにちは」とコメントを記入してコミット。

これでローカル側からpullすると、どっちやねんというエラーが出ます。

これがコンフリクトというらしいです。

コンソールでどのファイルがおかしいか表示してくれるのでそれを開きます。

CONFLICT (content): Merge conflict in dice_gui.py

こんな感じで競合してる箇所を示してくれるので、追加されてる記号などを削除して、正しい表記に修正します。

<<<<<<< HEAD
# こんにちは 
=======
# HELLO
>>>>>>> 6ee1305fe1524b6459dcfa5627a98aab2e588411

その後、git add dice_gui.py→git commitを実行するとそれで問題が解決したとgitに伝えられます。

git commitだけ実行するとVim画面が開くので、編集して:wqでコミットします。

git commit -mでコメント残せばVim画面は開かずそれで解決できます。

image

まとめ

AIに初心者が覚えた方がいいコマンド教えてと聞いて、出されたものをとりあえず試してまとめてみました。

ただこれでもまだ一部らしく、もっとたくさんコマンドがあるみたいです。

とりあえずスナップショット取ったりしながら、必要に応じていろいろ使ってみようと思います。

あと以前文字化けの記事でも書いたのですが、AIエージェントはたまにコードを破壊してきます。

note ――つくる、つながる、とどける。
クリエイターが文章やマンガ、写真、音声を投稿することができ、ユーザーはそのコンテンツを楽しんで応援できるメディアプラットフォームです。だれもが創作を楽しんで続けられるよう、安心できる雰囲気や、多様性を大切にしています。

なのでローカルでAIエージェント使って開発してみたい、してるけどgit入れてないって人は入れといた方が安全かもです。

以上Gitの基本コマンドについて紹介しました。

タイトルとURLをコピーしました