🕌

Git入門(操作編 - 基本操作)

2023/09/03に公開

Git入門(操作編 - 基本操作)

ローカルリポジトリの作成

GitHubなどを利用していればリモートリポジトリはGitHubのサイトで事前に準備できます。
ローカルにgit cloneしてしまえばこの操作は不要です。

ここではローカルリポジトリの初期化方法を紹介します。

$ mkdir first-git # Gitで管理するディレクトリの作成
$ cd first-git    # 作業ディレクトリに移動
$ git init        # ローカルリポジトリの作成
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: 	git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: 	git branch -m <name>
Initialized empty Git repository in /Users/[user]/Documents/git/first-git/.git/

なんか色々hintが出ますが、訳すと
「デフォルトのブランチの名前は'master'で このブランチ名は変更される可能性があります。
初期ブランチ名を設定すれば、この警告は消えます。
master' の代わりによく使われる名前は 'main'、'trunk'、'development' 」

毎回警告出るのも面倒なので、とりあえずデフォルトのブランチを指定したいと思います。

git config --global init.defaultBranch main

また、「作成したばかりのブランチは、次のコマンドで名前を変更できる」とも言っているので名前をmainに変更しておきます。

git branch -m main

一応、これでローカルリポジトリの初回化に成功しました。

変更をコミットする

ファイルの作成

適当なファイルを作って変更をコミットします。

$ echo "Gitの操作を勉強中" > sample.txt

ワークツリーとインデックスの状態を確認

git statusコマンドでワークツリーとインデックスの状態を確認できます。

$ git status
On branch main

No commits yet

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

nothing added to commit but untracked files present (use "git add" to track)

コミットの追加対象になっていないファイルとして「sample.txt」があります。
git addコマンドでコミットの対象にできると言っています。

ファイルをコミットの対象にする

ファイルをインデックスに追加してコミットの対象にするには、git addコマンドを使います。

$ git add sample.txt

ファイルを複数指定する場合はスペースで区切って複数指定します。

git add sample1.txt sample2.txt

また、すべてのファイルをインデックスに追加するには「.」を指定します。

$ git add .

ファイルを追加したら状態を確認してみましょう。

$ git status
On branch main

No commits yet

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

メッセージが変わって、追加対象になっていないファイルが無くなりコミットすべき対象にファイルが追加されました。

ファイルをコミットする

git commitコマンドでローカルリポジトリにコミットします。

$ git commit -m "sample.txtファイルを追加しました"
[main (root-commit) 17958aa] sample.txtファイルを追加しました
 1 file changed, 1 insertion(+)
 create mode 100644 sample.txt

コミットしたら状態を確認してみましょう。

$ git status
On branch main
nothing to commit, working tree clean

コミットすべき変更がなくなりました。

リポジトリの変更履歴を確認する

$ git log
commit 17958aa7a6bd86dcb34728885518e043d7fa9f97 (HEAD -> main)
Author: zzzzz <xxxxx@yyyyy.com>
Date:   Fri Aug 18 18:40:40 2023 +0900

    sample.txtファイルを追加しました

リモートリポジトリに変更を適用

GitHubに作成したローカルリポジトリをPushします。
※ GitHubにPushする場合、事前にリモートリポジトリをGitHub上に作成しておく必要があります。

  1. リモートリポジトリのURL登録
  2. リモートリポジトリにPush

リモートリポジトリのURL登録

リモートリポジトリのURLを登録するにはgit remoteコマンドを使います。

git remote add <name> <url>
パラメータ 説明
name 登録名、省略するとoriginという名前が自動で付くので「origin」とするのが一般的
url リモートリポジトリのURL
git remote add origin https://github.com/[ユーザーID]/[リポジトリ名].git

これでリモートリポジトリがoriginで登録されました。

リモートリポジトリにPush

リモートリポジトリにPushするにはgit pushコマンドを使います。

git push -u <repository> <refspec>
オプション 説明
-u 次回以降、ブランチの指定を省略するオプション
パラメータ 説明
repository name Pushするリポジトリの名前
refspec どの宛先参照をどのソースオブジェクトで更新するかを指定。今回はブランチ名
git push -u origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/[ユーザーID]/[リポジトリ名].git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

これでGitHubにアップロードされます。

Push結果

リモートリポジトリのクローン

リモートリポジトリローカルへの複製はgit cloneコマンドで行います。

複製先のディレクトリを指定する場合

git clone <repository> <derectory>

複製先のディレクトリを指定しない場合

複製先のディレクトリはリモートリポジトリの名前で複製されます。

git clone <repository>

以下コマンドでローカルに複製されます。

$ git clone https://github.com/[ユーザーID]/[リポジトリ].git first-git-clone
Cloning into 'first-git-clone'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.

リモートリポジトリからPull

リモートリポジトリから最新の変更をローカルリポジトリを取り込むにはgit pullコマンドを使います。

git pull <repository> <refspec>
パラメータ 説明
repository name Pushするリポジトリの名前
refspec どの宛先参照をどのソースオブジェクトで更新するかを指定。今回はブランチ名

次のコマンドでローカルリポジトリを最新にします。
※ 事前にリモートリポジトリのファイルは更新済みです。

$ git pull origin main
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 320 bytes | 106.00 KiB/s, done.
From https://github.com/[ユーザーID]/[リポジトリ]
 * branch            main       -> FETCH_HEAD
   17958aa..b71c4b0  main       -> origin/main
Updating 17958aa..b71c4b0
Fast-forward
 sample.txt | 1 +
 1 file changed, 1 insertion(+)

変更履歴を確認すると、変更内容が反映されていることがわかります。

 % git log
commit b71c4b01b587a60e388872454c1df23e153557c3 (HEAD -> main, origin/main)
Author: zzzzz <xxxxx@yyyyy.com>
Date:   Fri Aug 18 19:41:35 2023 +0900

    sample.txtファイルを修正しました

commit 17958aa7a6bd86dcb34728885518e043d7fa9f97
Author: zzzzz <xxxxx@yyyyy.com>
Date:   Fri Aug 18 18:40:40 2023 +0900

    sample.txtファイルを追加しました

マージ / コンフリクト

マージ

現在のリポジトリのブランチ構成

main
┗develop

developブランチの修正をmainブランチにマージ(開発履歴の統合)します。
次のコマンドでdevelopブランチをmainブランチにマージします。

git merge <branch>

git mergeは現存のブランチに指定したブランチをマージします。

パラメータ 説明
branch 取り込みたいブランチ
% git checkout main
Switched to branch 'main'
Your branch is behind 'origin/main' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

% git branch
  develop
* main

% git merge develop
Updating b71c4b0..8002869
Fast-forward
 sample.txt | 3 +++
 1 file changed, 3 insertions(+)

コンフリクト

異なるユーザーで同じファイルを修正する場合などに、修正した内容が衝突(コンフリクト)することがあります。

以下はmainブランチに対してdevelopブランチをマージした時のコンフリクトの例です。
sample.txtファイルでコンフリクトが発生しました。

% git merge develop
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Automatic merge failed; fix conflicts and then commit the result.

gitがマージに失敗したファイルには以下の様な目印をつけます。

<<<<<<< HEAD
→  編集しました。
=======
→編集しました。ここがコンフリクトする予定
>>>>>>> develop

「<<<<<<< HEAD」〜「=======」は、現在のブランチ(main)の内容です。
「=======」〜「>>>>>>> develop」は、マージしようとしたブランチ(develop)の内容です。
ファイルを修正して、再度git add、git commitすることでコンフリクトを解決できます。

関連記事

Discussion