Gitとは

ぎっと

ファイルの変更の履歴を記録して管理する、分散型のバージョン管理システム。作業ディレクトリで編集した変更を git add でステージングエリアに登録し、git commit で手元のリポジトリに記録し、git push で GitHub などのリモートリポジトリに送る。ブランチを作って並行して開発し、git merge で統合できる。ソースコードのほか、RTL、検証のテストベンチ、スクリプトなどの管理にも使われる。

「Git」は、3分野の6問の練習問題に出てきます(Linuxとコマンドラインの基礎, ソフトウェア開発とプロジェクト管理, クラウドとコンテナの基礎など)。

この用語の分野: Linuxとコマンドラインの基礎

3つの場所

Gitでは、ファイルを編集する作業ディレクトリ、次のコミットに含める変更を置くステージングエリア(インデックス)、コミットの履歴を保存するリポジトリ(.git ディレクトリ)を区別します。git status はこの3つの差を示し、git diff は作業ディレクトリとステージングエリアの差、git diff --staged はステージングエリアと最新のコミットの差を表示します。

ブランチとリモート

ブランチは、コミットの履歴の枝分かれに付けた名前で、新しい機能や修正を、主のブランチに影響を与えずに進められます。git clone でリモートのリポジトリを手元に写し、git pull でリモートの新しいコミットを取り込み、git push で自分のコミットを送ります。同じ箇所を別々に変えたブランチをマージすると、コンフリクトとして人が解決する必要があります。

管理しないもの

ビルドやシミュレーションで生成されるファイル、ログ、大きな波形のデータなどは、.gitignore に書いて追跡の対象から外します。一度コミットしたファイルは .gitignore に書いても追跡が続くので、git rm --cached で外します。パスワードや鍵を誤ってコミットすると履歴に残り続けるので、コミットの前に git status や git diff で内容を確かめる習慣が大切です。

Gitの練習問題に挑戦

Gitで管理しているファイル main.c を編集した後、「git commit -m "fix"」だけを実行したところ、「no changes added to commit」と表示されてコミットされなかった。理由として、正しいものはどれか。

  1. Aコミットする前に git push で、変更を共有のリポジトリに送っておく必要があるから
  2. Bコミットに含める変更は、先に git add でステージングエリアに登録しておく必要があるから
  3. CGitはファイルを保存したときに自動でコミットするので、git commit を実行する必要がないから
答えと解説を見る

正解:B. コミットに含める変更は、先に git add でステージングエリアに登録しておく必要があるから

Gitでは、作業ディレクトリで編集した変更のうち、git add でステージングエリア(インデックス)に登録したものだけが、次の git commit で記録されます。この2段階のしくみにより、編集した複数の変更のうち、関係のあるものだけを選んで1つのコミットにできます。git status を使うと、どの変更がステージングされているかを確かめられます。追跡しているファイルの変更をまとめて登録してコミットする git commit -a という書き方もあります。

Gitで git commit を実行したが、チームで共有している GitHub のリポジトリには、そのコミットがまだ表示されていない。理由として、正しいものはどれか。

  1. Agit commit は変更をステージングエリアに登録するだけで、記録するには git add が必要だから
  2. Bgit commit した変更を共有のリポジトリに送るには、git pull を実行する必要があるから
  3. Cgit commit は手元のリポジトリへの記録で、リモートに送るには git push が必要だから
答えと解説を見る

正解:C. git commit は手元のリポジトリへの記録で、リモートに送るには git push が必要だから

Gitは分散型のバージョン管理システムで、各開発者の手元にリポジトリ全体があり、git commit はその手元のリポジトリに変更を記録します。GitHub などのリモートリポジトリに送るには git push を実行し、逆にリモートの新しいコミットを手元に取り込むには git pull(または git fetch と git merge)を使います。そのため、ネットワークにつながっていなくてもコミットはでき、後でまとめて push できます。ほかの人が先に push していると、先にその変更を取り込むよう求められることがあります。

よくある質問

Git と GitHub は何が違いますか?

Git は手元のコンピュータで動くバージョン管理のソフトウェアそのものです。GitHub は Git のリポジトリを預かるWebのサービスで、プルリクエストによるレビューや課題の管理などの機能を加えています。GitLab のように同様のサービスや、社内に置くサーバもあり、Git 自体はどのサービスとも組み合わせて使えます。

直前のコミットを取り消すにはどうしますか?

まだ push していなければ、git commit --amend で直前のコミットを直したり、git reset で取り消したりできます。すでに push して共有したコミットは、ほかの人の履歴と食い違わないように、取り消しの変更を新しいコミットとして加える git revert を使うのが安全です。

解説の中の「Git」

「Git」が出てくる問題(6問)

  1. Gitで管理しているファイル main.c を編集した後、「git commit -m "fix"」だけを実行したところ、「no changes added to commit」と表示されてコミットされなかった。理由として、正しいものはどれか。
  2. Gitで git commit を実行したが、チームで共有している GitHub のリポジトリには、そのコミットがまだ表示されていない。理由として、正しいものはどれか。
  3. Gitで管理しているプロジェクトの .gitignore に「build/」と書いたが、以前にコミットした build/out.log の変更が、git status に表示され続ける。理由として、正しいものはどれか。
  4. Gitで、2人の開発者が同じファイルの同じ行をそれぞれ別のブランチで書き換え、一方のブランチをもう一方にマージした。このとき起こることとして、適切なものはどれか。
  5. 正しく動くことが分かっているファームウェアの版の後に1,000個のコミットがあり、最新のコミットでは不具合が起こる。不具合はある1つのコミットで入り、それ以降のコミットではすべて起こるとする。git bisect のように二分探索で原因のコミットを特定するとき、ビルドしてテストする回数の最大値はどれか。
  6. 宣言的なIaC(Infrastructure as Code)のツールで、ネットワークと仮想マシン2台の構成を定義したファイルを適用して、環境を作った。その直後に、何も変えずに同じファイルをもう一度適用したときに起きることとして、適切なものはどれか。

Linuxとコマンドラインの基礎の参考書を探す PR

Amazonの検索結果へのリンクです。Amazonのアソシエイトとして、半導体教室は適格販売により収入を得ています。

関連する用語

二分探索 IaC(Infrastructure as Code) inode SSH 環境変数 grep cron シェル シグナル(Unix) シンボリックリンク

用語集の一覧へ