Git入門(操作編 - 基本操作)
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上に作成しておく必要があります。
- リモートリポジトリのURL登録
- リモートリポジトリに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にアップロードされます。
リモートリポジトリのクローン
リモートリポジトリローカルへの複製は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することでコンフリクトを解決できます。
関連記事
- Git入門(概要編)
- Git入門(準備編)
- Git入門(操作編 - 基本操作)
- Git入門(操作編 - ブランチ)
- Git入門(操作編 - Pullリクエスト)
Discussion