13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

GitAdvent Calendar 2019

Day 3

初学者向けGitコマンドハンズオン

Last updated at Posted at 2019-12-02

この記事は Git Advent Calendar 2019 3日目の記事です。
昨日は @100 さんによる 【VRChat】継続的なクロスプラットフォーム対応 でした。

Gitコマンドハンズオン

Git初学者向けにGitハンズオンを実施しましたので、その時に作ったハンズオン資料を公開します。

Gitコマンドに慣れることが目的のハンズオンの資料ですので、Gitとは何か?といった説明はしません。ご了承ください。

お使いのPCにGitはインストール済みという前提で進めます。

文章の手順通りに進めていけば、Gitコマンドの体験ができます!

GUIツールがあるのに、なぜGitコマンドを学習するのか?

マージ・リベース・コンフリクト・・・
こういった込み入った操作をGitコマンドだけでやるのは厳しいものがあります。

基本的には、SourceTreeのようなGUIツールを使った方が、安全だと思います。

しかし、ネットワーク設定ミス等で、SourceTreeでのクローン・プッシュ・フェッチができなくなるということが、たまにあります。

そんな時に、Gitコマンドが使えると便利ですよね!

WindowsならGit Bashを使おう

Web界隈ではLinuxサーバーが主流ですので、DOSコマンドよりもLinuxコマンドが使える環境の方が、何かと都合がよいと思います。

Git for Windows をインストールしていれば、 Git Bash というターミナルがインストールされており、そこでLinuxコマンドが使えます。
また、カレントブランチ名が常に表示されたりと、Gitコマンドを使う上で何かと便利です。

今回のハンズオンでは、Git Bashを使う前提で進めます。

クローン編

練習用のリモートリポジトリを用意しよう

まずは、練習用のリモートリポジトリを用意しましょう。

今回は私の方で、GitHubに以下のリポジトリを用意しましたので、これを利用してきます。

https://github.com/segurvita/git-handson.git

ご自分でリモートリポジトリをご用意できる方は、ご自身でご用意いただいたものでも問題ありません。

作業ディレクトリを作ろう!

まずはハンズオン用のフォルダーを作成しましょう!

ここでは、

  • Windows: D:\Git\GitHandson
  • Mac: ~/Git/GitHandson

とします。

フォルダーが作成できましたら、ターミナルのカレントディレクトリをそのフォルダーにしてください。

リポジトリをクローンしてみよう

image.png

まずは、GitHubからリポジトリをクローンしてみましょう。

以下のコマンドを実行します。

# リポジトリをクローンする
git clone https://github.com/segurvita/git-handson.git

GitHubの認証情報が聞かれますので、ご自身のGitHubアカウントの情報を入力してくだい。

クローンに成功すると、 git-handson というフォルダーが生成されますので、中に入ります。

# 移動
cd git-handson

今後は、この git-handson フォルダーを 作業ディレクトリ と呼ぶことにします。

1人ハンズオンの場合は複数リポジトリをご用意ください

本記事は複数人でハンズオンを実施することを想定しています。

もし、一人で本記事の内容を実践する場合は、作業ディレクトリを2つ以上用意し、それぞれローカルリポジトリを作成してやってみてください。

user.nameuser.email を設定しよう

職場では本名で活動するけど、OSSではハンドル名義で活動したいということがあると思います。

そういう時は、ローカルリポジトリ毎に nameemail を設定すればよいです。
以下のように、 git config コマンドを実行します。

# メールアドレスを設定する
git config user.email "メールアドレス"

# 〇〇を設定する
git config user.name "ユーザー名"

ローカルブランチを作ろう

image.png

次にローカルブランチを作りましょう

# ローカルブランチを作る
git branch feature/〇〇

# チェックアウトする
git checkout feature/〇〇

〇〇 の部分は、他のユーザーとかぶらないような、好きな文字列を入力してください!

コミット編

作業ディレクトリにファイルを作ろう

image.png

作業ディレクトリに index.html を作成しましょう。

個人的には nano が便利です。(vim等、使い慣れたテキストエディターが他にあるなら、それでファイルを編集してください)

# index.htmlを作成する
nano index.html

nanoが起動したら、以下の内容を書きます。

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>タイトル</title>
</head>

<body>
    本文
</body>

</html>

control + X で保存します。

以下のコマンドで中身を確認しましょう。

# index.htmlの内容を表示する
cat index.html

中身がちゃんと表示されれば成功です。

ステータスを確認しよう

ステータスを確認してみましょう。

# Gitの状態を確認する
git status
On branch feature/〇〇
Untracked files:
  (use "git add <file>..." to include in what will be committed)
        index.html

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

ステージに追加されていないファイルがあるよ! というメッセージが表示されました。

ステージとはなんでしょう?

ファイルをステージに追加しよう

image.png

ステージというのは、コミットの候補となるファイル変更データを保管する場所です。

ファイルをステージに追加してみましょう。

# ファイルを追加する
git add .

. は、すべてのファイル変更データという意味です。

ステージへの追加ができたら、もう一度、Gitの状態を確認しましょう。

# Gitの状態を確認する
git status
On branch feature/〇〇
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   index.html

ステージに新しいファイルがある というメッセージになりました。

この時点ではまだ、ステージにあるだけで、コミットはされていません。

コミットしよう

image.png

追加したファイルをコミットしてみましょう。

コミットというのは、ステージに挙がっているファイル変更データを、ローカルブランチに反映させることです。

# 追加したファイルをコミットする
git commit -m "Added index.html"
[feature/〇〇 0b98e7f] Added index.html
 1 file changed, 13 insertions(+)
 create mode 100644 index.html

コミットができたら、もう一度、Gitの状態を確認してみます。

# Gitの状態を確認する
git status
On branch feature/〇〇
nothing to commit, working tree clean

コミットされたため、ステージが綺麗になりました!

コミットログを確認しよう

本当にコミットできたのでしょうか?コミットログを確認してみましょう。

# コミットログを表示する
git log
commit 0b98e7f6ae4ac2b0aaa795ce2a0c9288c94ad767 (HEAD -> feature/〇〇)
Author: 〇〇
Date:   Sun Nov 17 00:52:17 2019 +0900

    Added index.html

commit 1834144182ea422cb89b5789ad8d8a9773a58ec7 (origin/master, origin/HEAD, master)
Author: 〇〇
Date:   Sun Nov 17 00:26:03 2019 +0900

    Initial commit

ちゃんとコミットされていました!

プッシュ編

ローカルブランチをpushしよう

image.png

次は、 git push でローカルブランチを、リモートリポジトリにプッシュしてみましょう。

# ブランチをpush
git push origin feature/〇〇

この際、以下のようにGitHubの認証情報を聞かれるかもしれません。その時は、ユーザー名とパスワードを間違えずに入力しましょう。

image.png

ここで間違えてしまうと、その間違った認証情報をOSが保存してしまって結構面倒なことになります。慎重に入力しましょう。

認証に成功すれば、ローカルブランチをリモートリポジトリにアップロードできます。

コマンド内の origin というのは、リモートリポジトリのブックマークです。ブックマークというのはエイリアスのようなものです。
「エイリアスってなーに?」
「つまり、リモートリポジトリに origin って名前を付けたんだよー」

git push を実行した結果、以下のようなログが表示されます。

Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 410 bytes | 410.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'feature/〇〇' on GitHub by visiting:
remote:      https://github.com/segurvita/git-handson/pull/new/feature/〇〇
remote:
To https://github.com/segurvita/git-handson.git
 * [new branch]      feature/〇〇 -> feature/〇〇

これで、リモートリポジトリにブランチが作成されました!

ブランチ一覧を確認しよう

ブランチの一覧を確認してみましょう。

# ブランチの一覧を表示する
git branch --all
  master
* feature/〇〇
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/feature/〇〇

master ブランチのほかに、自分が作成した feature/〇〇 のブランチが表示されました。

* がついているのはカレントブランチという意味です。

なにやら remotes とついているのがいくつかありますね。これは、リモートリポジトリのブランチのように見えますが、実は微妙に違います。

たった今、ハンズオンに参加したメンバー全員がpushしたにもかかわらず、 remotes には自分がpushしたブランチしか表示されていません。
(1人ハンズオンの場合は、複数のローカルリポジトリからプッシュしておいてください。)

実は、ここに表示されているのは、リモートリポジトリのブランチそのものではなく、そのキャッシュなんです。

このキャッシュのことを リモートブランチ と呼びます。

フェッチ編

fetchしてみよう

image.png

リモートブランチを更新するには、 fetch を実行します。

# リモートブランチを更新する
git fetch

再度、ブランチ一覧を確認します。

# ブランチの一覧を表示する
git branch --all
  master
* feature/〇〇
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/feature/〇〇
  remotes/origin/feature/□□

キャッシュが更新されて、他のメンバーがプッシュしたブランチも表示されましたね!

リモートブランチをcheckoutしよう

image.png

試しに、他のメンバーが作ったブランチ feature/□□ を、チェックアウトしてみましょう。

# リモートブランチをチェックアウトする
git checkout feature/□□

上記のコマンドを実行すると、以下のメッセージが表示されます。

Switched to a new branch 'feature/□□'
Branch 'feature/□□' set up to track remote branch 'feature/□□' from 'origin'.

どうやら、新しいローカルブランチが作られたようです。ブランチ一覧を確認してみましょう。

# ブランチの一覧を表示する
git branch --all
  master
  feature/〇〇
* feature/□□
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/feature/〇〇
  remotes/origin/feature/□□

ローカルブランチとして新たに feature/□□ が増えました。
* がついているので、今度はこちらがカレントブランチになったようですね。

削除編

ローカルブランチを削除しよう

せっかく作ったローカルブランチですが、次は、このローカルブランチを削除してみましょう。

# ローカルブランチを削除する
git branch --delete feature/〇〇

削除しようとすると、こんなエラーがでました!

error: The branch 'feature/〇〇' is not fully merged.
If you are sure you want to delete it, run 'git branch -D feature/〇〇'.

これは、 feature/〇〇 がどこにもマージされていないので、「このローカルブランチを消すと、コミットした情報が消えてしまうよ!」という意味の警告です。

今回は消えても問題ないので、強制的に削除しましょう。メッセージに書いてある -D を使ってみます。

# ローカルブランチを強制的に削除する
git branch -D feature/〇〇

これで削除できたかどうか確認します。

# ブランチの一覧を表示する
git branch --all
  master
* feature/□□
  remotes/origin/HEAD -> origin/master
  remotes/origin/
  remotes/origin/feature/〇〇
  remotes/origin/feature/□□

削除できてますね!

ただ、まだリモートに feature/〇〇 が残っています。

リモートリポジトリのブランチを削除しよう

最後に、リモートリポジトリのブランチを削除してみましょう。

# リモートリポジトリのブランチを削除する
git push --delete origin feature/〇〇

削除なのになぜか push コマンドが登場しました。これは、 更新削除 に限らず、リモートリポジトリの内容を書き換えるときは、 push を使うんだと覚えてください。

それでは、削除できたかどうか確認します。

git branch --all
  master
* feature/□□
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/feature/□□

リモートブランチが削除されていますね!

さいごに

以上でハンズオンは終了です。おつかれさまでした。

ブランチのマージやリベース等も、Gitコマンドで実施できますが、最初に述べた通り、込み入った操作はSourceTreeのようなGUIツールでやった方が安全だと思います。
それでも、気になった方は、是非Gitコマンドでもやってみてください!

本記事作成にあたり、以下のページを参考にしました。ありがとうございました。

Git Advent Calendar 2019 の明日の記事は @ko-he-8 さんによる [Git初心者向け] GithubやGitlabでcommit時のメールアドレスは大切なんだという話。 です。

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?