Open10

よく使うGitコマンド&GitHub機能

むーてくむーてく

ローカルでコミット済みだが、まだプッシュしていないコミットをなかったことにしたい

# ステージに残しつつコミットを削除する
git reset --soft HEAD~1
# ステージに残しさえせず削除する
git reset --hard HEAD~1
むーてくむーてく

merge コマンドでマージ作業をしはじめたが、実際は不要だったことがわかりマージ状態をなかったことにしたい

git merge --abort
むーてくむーてく

症状

git pull したら、変なメッセージが出てきた

Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.
warning: The last gc run reported the following. Please correct the root cause
and remove .git/gc.log
Automatic cleanup will not be performed until the file is removed.

warning: There are too many unreachable loose objects; run 'git prune' to remove them.

対処法

  1. .git/gc.log の中身を確認する
  2. git prune コマンドでクリアする
  3. .git/gc.log ファイルを削除する

原因と背景

  • Auto Packing the Repository: Gitはリポジトリの効率を最適化するために自動的に「パッキング」処理を行っている。パッキングは、複数の小さなオブジェクトを1つの大きなファイルにまとめることで、リポジトリのサイズを減らし、パフォーマンスを向上させるプロセスである。
  • Git Garbage Collection (gc): メッセージにはgit gc(ガベージコレクション)に関する参照が含まれている。これは、不要なファイルやオブジェクトをクリーンアップするためのGitの機能である。通常、Gitはこれを自動的に実行するが、必要に応じて手動で実行することもできる。
  • .git/gc.log File: このメッセージは、以前のガベージコレクションの実行で何らかの問題が発生し、その詳細が.git/gc.logに記録されたことを示している。問題の原因を調べて対処し、その後でこのログファイルを削除する必要がある。
  • Too Many Unreachable Loose Objects: Gitは、到達不可能な「疎(loose)」オブジェクトが多すぎると警告している。これらは、通常のリポジトリ操作からは到達できない、孤立したオブジェクトである。git pruneコマンドを実行してこれらを安全に削除することが推奨されている。

要するに、このメッセージはGitがリポジトリのメンテナンスを行っており、特に注意が必要ないくつかの問題(ログファイルの存在、多くの到達不可能なオブジェクト)を指摘している。適切な対処には、ログファイルの確認と削除、必要に応じてgit pruneの実行が含まれる。

むーてくむーてく

GitHubでのファイル検索方法。
特定のワード(search-target-word)を持つ特定の拡張子のファイルを探すためのクエリ方法

repo:account-name/your-repository-name search-target-word path:*.go
むーてくむーてく

すでにプッシュしてしまったコミットを削除する

最新のコミットを削除する

# これでローカルコミットを削除して
git reset --hard 'HEAD^'
# これで強制プッシュしてリモートを上書きする
git push origin +<ブランチ名>

特定の過去のコミットを削除する

# リベースのインタラクティブモードが開き、削除したいコミットの行の pick を drop に変更して保存する。
git rebase -i '<コミットID>^'
# これで強制プッシュしてリモートを上書きする
git push origin +<ブランチ名>
むーてくむーてく

リモートブランチを削除したい

git push --delete origin your-branch-name
むーてくむーてく

ローカルブランチを削除

  • -d はブランチが既にマージされている(つまり、その変更が既にアップストリームブランチに取り込まれている)場合にはじめて削除ができる安全な方法。
  • -D はブランチがまだマージされていない、またはマージの状態に関わらずブランチを削除したい場合強制削除できる方法。
git branch -d feature-branch
git branch -D feature-branch
むーてくむーてく

最新のメインブランチの内容を現在の作業ブランチに反映したい

# 現在のブランチがなにかを確認
git branch
# remote ブランチの内容を取得
git fetch origin main
# 反映
git merge origin/main
むーてくむーてく

まだステージにあげていない変更をなかったことにしたい。

現在いるディレクトリ以下の変更をなかったことにするため、ディレクトリパスに注意する。

git restore .
むーてくむーてく

GitHub 上で異なるブランチ間の差分を確認したい

# 確認方法
https://github.com/username/repository/compare/{base-branch}...{compare-branch}

# sample
https://github.com/username/repository/compare/main...feature+hoge

特定のコミット範囲で差分を表示する場合

# 確認方法
https://github.com/username/repository/compare/{start-commit-hash}...{end-commit-hash}

# sample
https://github.com/username/repository/compare/abcdef123456...7890abcdef12