「git」で未プッシュのコミットをリストする方法 (ローカルのみ、originにはない)

2024-08-21

日本語:

「git」を使って、ローカルのレポジトリに存在するが、リモートの「origin」にはまだプッシュされていないコミットをリストする方法です。

コマンド:

git log --no-merges --not --since=<start_date> --until=<end_date> --pretty=format:%h %s

オプションの説明:

  • --no-merges: マージコミットを除外します。
  • --not: 指定された条件に一致しないコミットをリストします。
  • --since=<start_date>: 指定された日付以降のコミットをリストします。
  • --pretty=format:%h %s: コミットのハッシュとメッセージをフォーマットして表示します。

例:

過去1週間のコミットをリストする:

git log --no-merges --not --since=1 week ago --pretty=format:%h %s
  • 「origin」は通常、デフォルトのリモートブランチです。
  • git pushコマンドを使って、ローカルのコミットを「origin」にプッシュすることができます。
  • git diffコマンドを使って、ローカルの変更とリモートとの差分を確認することができます。



未プッシュコミット一覧取得の例と解説

コマンドの分解と解説

先ほど紹介したコマンドをもう一度見てみましょう。

git log --no-merges --not --since=<start_date> --until=<end_date> --pretty=format:%h %s
  • git log: コミット履歴を表示する基本コマンドです。
  • --no-merges: マージコミット(複数のブランチを統合したコミット)を除外します。
  • --not: 指定した条件に合致しないコミットをリストします。この場合、--since--untilで指定した期間外のコミットを除外します。
  • --pretty=format:%h %s: 表示形式を指定します。
    • %h: コミットの短いハッシュ値
    • %s: コミットメッセージ

つまり、このコマンドは、「指定した期間内の、マージではないコミットのうち、ローカルにあってリモートにはまだプッシュされていないコミット」をリストする、ということです。

具体的な例

  • 過去1週間の未プッシュコミット:
    git log --no-merges --not --since=1.week.ago --pretty=format:%h %s
    
  • 2023年1月1日から2023年1月31日までの未プッシュコミット:
    git log --no-merges --not --since="2023-01-01" --until="2023-02-01" --pretty=format:%h %s
    
  • コミットハッシュ全体と著者:
    git log --pretty=format:"%H (%an)"
    
  • コミットメッセージのみ:
    git log --pretty=format:%s
    

より詳細な情報

  • 変更されたファイル:
    git log -p
    
  • 統計情報:
    git log --stat
    

注意点

  • リモートブランチ: 上記のコマンドは、デフォルトのリモートブランチ(通常はorigin)との比較を行います。
  • ブランチ: 特定のブランチのコミット履歴を見るには、git log <branch_name>のようにブランチ名を指定します。
  • コミットの取り消し: git resetコマンドを使うと、コミットを取り消すことができます。ただし、慎重に扱う必要があります。

このコマンドを使うことで、ローカルで作業した内容が、リモートに反映されているか、あるいはどこまで反映されているかを簡単に確認することができます。開発の過程で、どのコミットをいつ行ったのかを把握する上で非常に役立つでしょう。

git help log



Git GUIツールを使う

多くのGit GUIツール(SourceTree、GitHub Desktopなど)は、視覚的にコミット履歴を確認できる機能を持っています。通常、ローカルとリモートの差分を色分け表示したり、未プッシュのコミットを明確に示したりします。

  • メリット:
    • 直感的な操作で、コミット履歴をグラフィカルに把握できる。
    • ブランチの分岐やマージなども視覚的に確認しやすい。
  • デメリット:

Gitkを使う

Gitkは、Gitに標準で付属しているテキストベースのグラフィカルなコミットブラウザです。gitkコマンドを実行するだけで、コミット履歴を視覚的に確認できます。

  • メリット:
    • コマンドラインとGUIの両方の特徴を併せ持つ。
    • 複雑なコミット履歴も比較的簡単に追跡できる。
  • デメリット:

スクリプトで自動化

BashやPythonなどのスクリプト言語を使って、git logコマンドを組み込み、より複雑な処理を行うことができます。例えば、未プッシュコミットの数を数えたり、特定のファイルの変更履歴を抽出したりできます。

  • メリット:
    • 柔軟性が高く、様々なカスタマイズが可能。
    • CI/CDパイプラインなど、自動化の場面で活用できる。
  • デメリット:

Gitのフック機能を使う

Gitのフック機能を使うと、特定のイベントが発生した際に、あらかじめ設定しておいたスクリプトを実行することができます。例えば、コミットする前に未プッシュコミットがあるかどうかをチェックする、といったことができます。

  • メリット:
  • デメリット:

どの方法を選ぶかは、あなたの作業スタイルや、どのような情報を取得したいかによって異なります。

  • 手軽に確認したい場合: Git GUIツール
  • 詳細な情報を取得したい場合: git logコマンドやGitk
  • 自動化したい場合: スクリプトやGitのフック機能

これらの方法を組み合わせることで、より効率的にGitを扱うことができます。

  • SourceTreeで未プッシュコミットを確認: SourceTreeの「変更」タブで、ローカルリポジトリとリモートリポジトリの差分を確認できます。
  • Bashスクリプトで未プッシュコミット数をカウント:
    unpushed_commits=$(git log --oneline --no-merges --not --since=1.week.ago | wc -l)
    echo "未プッシュコミット数は $unpushed_commits 件です"
    

git git-commit git-diff



Gitで落としたスタッシュを復元する方法

Gitスタッシュは、現在の作業ツリーの状態を一時的に保存する機能です。誤ってスタッシュを削除したり、スタッシュのリストから消えてしまった場合でも、復元することが可能です。git reflogコマンドを実行して、過去のコミットやリセットの履歴を表示します。git reflog...


マージ競合が発生しました。マージを中止するにはどうすればよいですか?

マージ競合 とは、Git で異なるブランチの変更を統合する際に、自動的に解決できない衝突が発生した場合です。この状態になると、マージプロセスは一時停止され、ユーザーが手動で競合を解決する必要があります。マージを中止 するには、次のコマンドを使用します:...


「macOS」における「.DS_Store」ファイルをGitリポジトリから削除する方法

問題: macOSは、フォルダの情報を保存するために. DS_Storeファイルを作成します。このファイルは、Gitリポジトリにコミットされてしまうと、他の開発者の環境で問題を引き起こす可能性があります。解決策:.DS_StoreファイルをGitリポジトリから削除し、今後のコミットから除外する方法があります。...


Gitで空のディレクトリを追加する方法:具体的なコード例と解説

空のディレクトリをGitリポジトリに追加する方法Gitは、バージョン管理システムであり、ファイルやディレクトリの変更を追跡することができます。空のディレクトリを追加するには、次の手順に従います。手順1: ディレクトリを作成するターミナルまたはコマンドプロンプトを開き、空のディレクトリを作成する場所まで移動します。次に、次のコマンドを使用してディレクトリを作成します。...


Git Rebase の取り消し: コード例

Git Rebase は、Git の機能の一つで、複数のコミットを別のベースブランチに移動させる操作です。つまり、コミット履歴を書き換えることができます。これにより、直線的なコミット履歴を作成することができます。Git Rebase を実行すると、コミット履歴が書き換えられるため、取り消すのは少し複雑です。一般的に、次の方法が使用されます。...



git commit diff

「git reset --hard HEAD~1」の取り消し方法のコード例 (日本語)

「git reset --hard HEAD~1」 は、Gitリポジトリの現在のコミットを、その前のコミットの状態に強制的に戻すコマンドです。つまり、最新のコミットを破棄し、前のコミットの状態にリセットします。もし誤って実行して後悔している場合、次の方法で元に戻すことができます:


Git でステージングされていない変更を破棄する方法

Git では、変更したファイルをコミットする前に、ステージングエリアと呼ばれる場所に一時的に保存します。ステージングされていない変更とは、まだステージングエリアに登録されていない変更のことです。これらの変更を破棄する方法について説明します。


Gitでローカル(未追跡)ファイルを削除する具体的なコード例と解説

Gitの作業ディレクトリからローカルで追跡されていないファイルを削除するには、git cleanコマンドを使用します。このコマンドは、Gitが追跡していないファイルやディレクトリを削除します。git clean -n: 削除されるファイルやディレクトリを表示しますが、実際に削除しません。


Gitで全てのリモートブランチをクローンする際のコード例と解説

Gitで全てのリモートブランチをローカルに取得するには、以下の手順を行います。リポジトリのクローン: git clone コマンドを使用して、デフォルトブランチと共にリモートリポジトリをローカルに複製します。リモートブランチのフェッチ: git fetch コマンドを使用して、全てのリモートブランチ情報を取得します。


SVN から Git へのリポジトリ移行の日本語解説

SVN (Subversion) と Git は、どちらもバージョン管理システムですが、その仕組みや哲学が大きく異なります。そのため、SVN リポジトリを Git リポジトリに移行する際には、いくつかの手順と考慮事項があります。まず、Git をインストールします。Git の公式サイト (git-scm