Gitの基本操作と運用ワークフロー

リポジトリの初期化と状態確認

バージョン管理を始めるには、まず作業ディレクトリをGitリポジトリとして初期化する必要があります。

$ mkdir project-alpha
$ cd project-alpha
$ git init
Initialized empty Git repository in /home/user/project-alpha/.git/

git statusコマンドを使用すると、現在のワーキングツリーの状態を確認できます。初期状態では、まだコミットが存在しないため、追跡対象のファイルはありません。

$ git status
On branch main

No commits yet

nothing to commit

新しいファイルmain.jsを作成して再度状態を確認すると、Gitはこのファイルを「未追跡(Untracked files)」として認識します。

$ git status
On branch main

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        main.js

nothing added to commit but untracked files present

ファイルのステージングとコミット

ファイルをバージョン管理の対象にするには、ステージングエリア(インデックス)に追加する必要があります。

$ git add main.js
$ git status
On branch main

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   main.js

追跡対象となっているファイルを変更した後、git statusを実行すると、変更内容がまだステージングされていないことが確認できます。

$ git status
On branch main

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   main.js

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   main.js

変更をステージングエリアに追加し、ローカルリポジトリにコミットします。git addは新規ファイルの追跡だけでなく、変更のステージングにも使用されます。

ステージングをスキップしてコミットするには、-aオプションを使用します。これは、追跡済みのファイルの変更のみをコミット対象とする場合に便利です。

$ git commit -am 'Set up initial logic'
[main 8a2f3c1] Set up initial logic
 1 file changed, 5 insertions(+)

リモートリポジトリの設定と連携

リモートリポジトリを追加するには、git remote addコマンドを使用し、URLに対して短縮名(エイリアス)を割り当てます。一般的にはoriginという名前が使われますが、ここではupstreamを使用します。

$ git remote add upstream https://example.com/repo/project-alpha.git

設定されたリモートリポジトリを削除するにはgit remote rmを使用します。

$ git remote rm upstream

ローカルブランチの内容をリモートリポジトリに送信するにはgit pushを使用します。基本的な構文は以下の通りです。

$ git push <リモート名> <ローカルブランチ>:<リモートブランチ>

例えば、ローカルのfeature-loginブランチをリモートのstagingブランチに送信する場合は以下のようになります。

$ git push upstream feature-login:staging
Enumerating objects: 7, done.
...
To https://example.com/repo/project-alpha.git
   a1b2c3d..d4e5f6g  feature-login -> staging

リモートブランチ名を省略した場合、Gitは同名のリモートブランチを探します。また、リモートに同名ブランチが存在しない場合は自動的に作成されます。

ブランチ管理と運用

ブランチ一覧を表示するには、git branchを使用します。-rオプションでリモートブランチ、-aオプションですべてのブランチを確認できます。

$ git branch -a
* main
  feature-login
  remotes/upstream/main

ブランチの切り替えはgit checkout(またはgit switch)を使用します。

$ git checkout feature-login
Switched to branch 'feature-login'

ブランチを削除するには、ローカルブランチの場合は-d、リモートブランチの場合は--deleteフラグを指定したpushコマンドを使用します。

$ git branch -d feature-login
$ git push upstream --delete staging

リモートで削除されたブランチ情報がローカルに残っている場合、git fetch -p(または--prune)を実行して参照をクリアする必要があります。

$ git fetch -p
From https://example.com/repo/project-alpha.git
 - [deleted]         (none)     -> origin/old-branch

Gitの基本的なワークフロー

Gitによる開発プロセスは主に以下の3つのステップで構成されます。

  1. Modify: ワーキングツリー内のファイルを修正します。
  2. Stage: git addを使用して変更をインデックス(ステージングエリア)に追加します。
  3. Commit: git commitを使用してインデックスのスナップショットをリポジトリに永続的に保存します。

ファイルのライフサイクルは、未追跡(Untracked)から始まり、追加されることで追跡済み(Tracked)になります。追跡済みのファイルは、未変更(Unmodified)変更済み(Modified)ステージング済み(Staged)のいずれかの状態をとります。

リモートからの更新取得とマージ

リモートリポジトリの変更をローカルに取り込む際、git pullfetchmergeを同時に行いますが、これらを別々に実行することでより詳細な制御が可能になります。

まず、git fetchでリモートのデータを取得します。この段階ではローカルの作業ファイルは変更されません。

$ git fetch upstream
remote: Enumerating objects: 12, done.
remote: Counting objects: 100% (12/12), done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (8/8), 1.5 KiB | 1.50 MiB/s, done.
From https://example.com/repo/project-alpha.git
   d4e5f6g..f7g8h9i  main       -> upstream/main

次に、取得した内容を現在のブランチにマージします。

$ git merge upstream/main
Updating d4e5f6g..f7g8h9i
Fast-forward
 index.html | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

この一連の操作(fetchとmerge)は、git pullコマンド1回で実行した結果と同等です。

8月22日 17:53 投稿