派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

第8話 switchとrestoreを使ってみよう 【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200130131104j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第7話 では、間違えてリセットしてしまっても元に戻せる「リフログ」を学びました。

・HEAD の移動履歴一覧を表示

$ git reflog

・特定の時点までファイルを巻き戻す(nには戻りたい地点の数字を入力)

$ git reset --hard HEAD@{n}

今回の第8話では、2019年夏にリリースされた新コマンド「switch」 と「restore」 をご紹介します。このコマンドは、checkoutの機能である 「ブランチの切り替え」と「ファイルの変更」を2つに分けたものです。このマンガを通して、わかばちゃんと一緒に知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

Gitの新コマンド switch と restore って?

f:id:itstaffing:20200130131106j:plain
f:id:itstaffing:20200130131109j:plain

2019年8月16日に Git 2.23 がリリースされ、2つの新コマンドが実験的に追加されました。それが switch(スイッチ) と restore(リストア)です。

新コマンドが追加された理由

checkout コマンドは便利である故に「できることが多すぎる」といった点もありました。たとえば、ブランチの切り替え、コミット履歴からのファイル復元、編集内容の取り消しなどです。そこで、checkoutの機能をブランチの切り替え「switch」 と ファイルの変更「restore」 の2つに分け、更に使いやすくしたというわけです。

f:id:itstaffing:20190617145538j:plain
switch と restore 、早く使ってみたい!

まずはGitのバージョンを最新版にする

新コマンドを使う前に、まずは自分のパソコンに入っているGitのバージョンを確認してみましょう。次のコマンドを打ち込んで、Gitのバージョンを調べます。

$ git --version

すると、次のようにバージョンが表示されるはずです。

> git version 2.19.0

新コマンドの「switch」と 「restore」 が使えるのは、バージョン2.23からですので、表示されたバージョンがそれ以下の場合は、次の手順でアップグレードしましょう。

◆Mac

Homebrewを使えば、次の一行でバージョンを上げることができます。

$ brew upgrade git

◆Windows

次のコマンドを打ち込みます。

$ git update-git-for-windows

【インストールでエラーが出てしまった場合】

> git: ‘update-git-for-windows’ is not a git command. See ‘git –help’

このような表示が出たら、コマンド「update-git-for-windows」が存在していないという意味です。Git公式サイトから最新のインストーラーをダウンロードして、再チャレンジしましょう。

git switch を使ってみよう

switch コマンドは、ブランチを切り替えることができます。checkout と並べて比較してみましょう。

・ブランチを切り替える

$ git switch [ブランチ名]
$ git checkout [ブランチ名]

・ブランチを新規作成して切り替える

$ git switch -c [ブランチ名]
$ git checkout -b [ブランチ名]
 
f:id:itstaffing:20190617145538j:plain
わかりやすい!「スイッチ」っていう名前の通り、自分が作業するブランチを切り替える(スイッチする)ってことだね。

git restore を使ってみよう

続いて restore コマンドを使ってみましょう。こちらもcheckout と並べて比較してみます。

・作業ディレクトリ上の編集内容を取り消す
(addする前の状態から、直前のコミットの状態に戻す)

$ git restore [ファイル名]
$ git checkout [ファイル名]

・特定のファイルを、特定のコミット時点に戻す

$ git restore --source [コミット識別子] [ファイル名]
$ git checkout [コミット識別子] [ファイル名]
 
f:id:itstaffing:20190617145538j:plain
restoreって、辞書で引くと「復元する」とか「データを元に戻す」っていう意味だって出てきたよ。たしかに、過去のコミットに checkout すると、作業ディレクトリにその時点のデータが復元されるけど、その機能だけ切り出したって感じだね。
f:id:itstaffing:20190617145541j:plain
ちなみに restore はステージングの状態を変更することもできるんだ。reset と並べて比較してみよう。
・ステージしたファイルを、ステージングエリアから下ろす
(addしたあとの状態から、addする前に戻す)

$ git restore --staged [ファイル名]
$ git reset --mixed [ファイル名]

・作業ディレクトリ上の編集内容を取り消したい
(addする前の状態から、直前のコミットの状態に戻したい)

$ git restore --worktree [ファイル名] (※1)
$ git checkout [ファイル名]
$ git reset --hard HEAD(※2)

※1 オプションを指定しない場合は、--worktree をつけたときと同じ動きをします
※2 reset --hard は引数にファイル名を指定できません。ファイル名を指定して reset --hard をしようとすると、fatal: Cannot do hard reset with paths.と注意されてしまいます
f:id:itstaffing:20200130131112j:plain
f:id:itstaffing:20190617145538j:plain
ファイルをまとめて一括で操作したいときはどうすればいいの?ステージングエリアから下ろしたいときに、ファイル名をいちいち指定して下ろすのは面倒だわ。
f:id:itstaffing:20190617145541j:plain
ファイル名の代わりに「.(ドット)」を使えば、すべてのファイルをまとめて操作できるぞ。たとえば
$ git restore .

みたいに使えばよい。

まとめ

今回は、新コマンド switch と restore について学びました。

・ブランチを切り替える

$ git switch [ブランチ名]

・ブランチを新規作成して切り替える

$ git switch -c [ブランチ名]

・作業ディレクトリ上の編集内容を取り消す

$ git restore [ファイル名]

・特定のファイルを、特定のコミット時点に戻す

$ git restore --source [コミット識別子] [ファイル名]


※ switch と restore は、あくまでも実験的なものであり、今後仕様が変わる可能性もあります。

Gitにはまだまだたくさんのコマンドがあります。
次回はファイルの差分を確認できる diff(ディフ)を学びましょう。

参考:Git公式ドキュメント(英語)
・git switch
・git restore


▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」

【イベントレポート】チャットボットをつくってみよう!使いやすいAI(人工知能)「Watson Assistant」ハンズオン

この記事では、2019年11月8日に開催したイベント「チャットボットをつくってみよう!使いやすいAI(人工知能)「Watson Assistant」ハンズオン」をレポートします。

前回、大好評に終わった羽山さん、樋口さん、江澤さんの講師3名によるIBM Watsonのイベント。実際に自分で使ってみたいという声を多くいただき、ハンズオン形式による今回のイベントが実現しました。Watsonの機能の1つである「Watson Assistant」を利用し、チャットボットを作成する方法を教えていただきました。

■今回のイベントのポイント
・Watsonでチャットボットを作る前に、Intent・Entity・Dialogの3つの要素について、概念を知っておく
・チャットボットで質問をされたとき、どれだけの言い方があるのかを考え、ボットが柔軟に対応できるように考える
・そのとき、文章のなかにスペースを入れると文脈として認識しないため、できるだけつながった自然な文章を入力するのがコツ

【講師プロフィール】
樋口 文恵さん
SI企業に入社後、8年間をインフラエンジニア、ネットワークエンジニアとして、お客様先でのネットワーク構築、コンサル業務に従事。2017年1月にAI専任のエンジニアになりWatsonに携わる。主担当はWatson AssistantとNatural Language Classifier。リリースをサポートしたチャットボットは50本以上。

【ティーチングアシスタント(TA)】
羽山 祥樹さん
IBM Champion。2016年より IBM Watson に携わる。HCD-Net認定 人間中心設計専門家。使いやすいプロダクトを作る専門家。担当したウェブサイトが、雑誌のユーザビリティランキングで国内トップクラスの評価を受ける。 専門はユーザーエクスペリエンス、情報アーキテクチャ、アクセシビリティ。ライター。IBM Watson。翻訳書に『メンタルモデル──ユーザーへの共感から生まれるUX デザイン戦略』『モバイルフロンティア──よりよいモバイルUXを生み出すためのデザインガイド』(いずれも丸善出版)がある。

江澤 美保さん
株式会社クレスコ AIサービスエバンジェリスト。企業向けWebポータル製品の開発、大規模事務管理の海外移管プロジェクト、企業向け決済サービスのフィールドエンジニア等を経て先端技術(人工知能・コミュニケーションロボット)の法人営業に転向。2015年よりIBM Watsonに携わり、経営層へのWatson導入提案を多く経験。現在は企業のAI導入支援を手掛けるAIコンサルタント・エンジニアとして活動中。2016年3月「第2回 IBM Watson日本語版ハッカソン」にてアイディア賞受賞。2019年IBM Champion。

IBM CloudでWatson Assistantを立ち上げる

普段の生活のなかでチャットボットにお世話になっている方もあまり気づくことはないと思いますが、チャットボットには大きく分けて「一問一答タイプ」と、「要望受付タイプ」の2種類があるそうです。たとえば、LINEで使える有名なボット「元女子高生AIりんな」は「一問一答タイプ」で、ヤマト運輸の再配達依頼は「要望受付タイプ」。そう言われると、確かに種類が違うような気がします。

f:id:itstaffing:20200116135249j:plain
▲今回作成する「一問一答タイプ」のチャットボットのイメージ。Watson Assistantはどちらのタイプも作れるが、一問一答タイプのほうが難易度的に低いそう

Watsonでチャットボットを作る前に、まず、Intent、Entity、Dialogという3つの要素について、概念を知っておく必要があります。

・Intent
文章の意図を理解させるためのものです。たとえば私たちには「Watsonについて教えて」と「Watsonって何?」と「Watsonについて知りたい」が、すべて同じ意味だということがわかりますが、Watsonには分かりません

・Entity
単語や表記のゆれをフォローするものです。たとえば、和食、洋食、中華、フレンチ、イタリアンの単語すべてが、同じ料理ジャンルであるということはWatsonには分かりません

・Dialog
会話の流れを組み立てるものです。どう言われたらどう返すのかというもの。会話の構成を組み立てる要素です

3つの要素を理解したところで、いよいよ実際にWatsonを使ってみます。IBM Cloudにログインして、サービスを作成します。

f:id:itstaffing:20200116135251j:plain
▲IBM Cloudにログインし、[カタログ]をクリックする。読み込みが長いが辛抱して待つ。サービスからWatson Assistantを起動する

次にエリアや料金プランを選択します。

f:id:itstaffing:20200116135255j:plain
▲ライトプランを選んでおけば料金は発生しない。ちなみにサービス名はどのような名前でもいいとのこと

次にSkillを作成します。

f:id:itstaffing:20200116135257j:plain
▲右上のサービスボタンをクリック。次に作成ボタンをクリックしてSkillを作る。ボタンをマウスオーバーすると「Skills」と表示される

f:id:itstaffing:20200116135300j:plain
▲Dialog skillが選ばれていることを確認し、[Next]をクリック。次画面で名前をつけ、言語を選び[Create dialog skill]を選ぶ。名前は日本語でもOK

Intentの作成

ここから先の作業は「センス」が必要になるそうです。今回は、架空のピザ店「Pizza Watson(ピザ・ワトソン)」の注文受け付けシステムを作成していきます。

まずはIntentから作成していきます。

f:id:itstaffing:20200116135303j:plain
▲画面左端のメニューが「Intents」になっていることを確認し、[Create intent]をクリック。次画面でIntent Nameに「ピザの注文」と入力したあと、[Add example]をクリックして、ピザの注文の言い回しを追加していく

「センスが必要になる」のはココ。ピザを注文するのにどれだけの言い方があるのかを考え、ボットが柔軟に対応できるように入力していきます。

また、このとき、スペースを入れると文脈として認識しないので、できるだけつながった自然な文章を入力するのがコツだそうです。なぜなら、Watsonは前後の係り受け、主語・述語を認識しながら学習しているそうで、スペースを入れると、前後関係がわからなくなり、学習効果が薄まるからとのことでした。

f:id:itstaffing:20200116135305j:plain
▲最低でも10種以上のバリエーションを用意するといいそう。同じ文章でも、漢字とひらがなの両方で入力しておくと、対応力が広がる

入力したら、画面上の青い[←]で戻ります。確定しなくても反映されます。他のアプリケーションと勝手が違うので、少し不安になりますが、これでIntentの作成は終了です。

Entityの作成

次にEntityを作成していきます。

f:id:itstaffing:20200116135307j:plain
▲今度は画面左端のメニューが「Entities」になっていることを確認し、[Create entity]をクリック。次画面でEntityの名前を設定し、[Create entity]をクリックしたあと、カプリチョーザに関する情報を追加し[Add value]をクリックする

カタカナ、ひらがな、アルファベットなどはもちろんですが、名前をうろ覚えで「カプリなんとか」と注文する人もいるかもしれません。そうした可能性までも網羅しておくと良いそうです。

Dialogの作成

IntentとEntityは、Dialogを組み立てるための部品です。部品が揃ったところで、それらを機能させるDialogを構築していきます。

f:id:itstaffing:20200116135311j:plain
▲画面左端のメニューが「Dialogs」になっているのを確認し、[Create dialog]をクリックして次画面へ。Dialogの作成では、線でつながった白い四角が表示される。この白い四角をノードと呼び、ノードは上から順に処理されていく

上記画面の「ようこそ」と書かれたノードは自動的に作成されます。これをクリックし、内容を「いらっしゃいませ。Pizza Watsonです!ご用件をどうぞ!」と、それらしい内容に変えてみます。ここの文章は学習に関係ありません。また、入力後は反映ボタンが無く、[×]ボタンで閉じて問題はありません。もちろん変更は反映されています。

では、新しいノードを追加してみましょう。

f:id:itstaffing:20200116135315j:plain
▲[Add node]ボタンをクリックすると、新しいノードが追加され、空のノードの詳細が表示される。ノード名に「ピザの注文対応」と入力し、対応するIntentを選択する

f:id:itstaffing:20200116135317j:plain
▲次に「Assistant responds」の下のプルダウンメニューから「Option」を選び、Titleに「ピザのメニューを選んでください!」と入力して[Add Option]をクリックする

f:id:itstaffing:20200116135319j:plain
▲LIST LABEL と VALUE に「カプリチョーザ」と入力する

ピザの注文以外に「営業時間は何時から何時までですか」など、想定されるいろいろな質問に対応できるようにするとなると、ノードの数も何十個と増えていきます。

Dialog作成中に[Try It]ボタンをクリックすると、ここまでの入力結果を実際に試すことができます。

f:id:itstaffing:20200116135321j:plain
▲Try Itでは[Clear]ボタンを押すと最初からやり直せるため、違う言葉で質問することができる。近い意味の言い回しも入力して、うまく返答できなければEntityなどを増やして鍛えていく

基本的な作成はここまで。

参加者は30名強。IBM Championの肩書を持つお二人のTAが席を回りながら、分からないところ、つまずいたところをフォローしてくださったため、参加者のほとんどが基本機能の実装は完成された様子でした。余った時間は、追加機能の実装に取り組まれていました。

樋口さんは、できればやって欲しい要素も紹介してくださり、各自が「Pizza Watson」から依頼されてチャットボットを作るエンジニアになったつもりで、完成度を高めていきました。

f:id:itstaffing:20200116135325j:plain
▲これらの機能を満たすサンプルも参加者に配られた

最後に、樋口さんが作成した完成度の高いチャットボットのソースデータが配布されました。これは樋口さんがチャットボット作成をはじめた当初に「誰かが、出来上がったお手本をくれないかな」と思ったことがあり、参加者が同じ思いを抱いたときのために用意してくださったとのことでした。

樋口さん提供の完成品では「カプリチョーザって何?」と聞くと、その説明もしてくれるなど、かなり多機能。これをお手本に、Watson Assistantを使いこなせるようになりたいと参加者の皆さんは感じたのではないでしょうか。

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

【イベントレポート】VBA+SQLで作るAccessデータベースアプリケーション

この記事では、2019年10月25日に開催したイベント「VBA+SQLで作るAccessデータベースアプリケーション」をレポートします。

業務で使用することも多い、AccessVBAとSQL。今回のイベントでは、AccessVBAとSQLを組み合わせて、レコードセットの取得、展開、レコードの追加、更新、削除などの基本的な方法を、書籍『Access VBA 実践マスターガイド ~仕事の現場で即使える』の著者である今村ゆうこさんに解説いただきました。

■今回のイベントのポイント
・Accessはテーブルとフォームを「連結」させることで、アプリケーションのユーザインタフェース部分を簡単に作成することができる
・「連結」のフォームは便利だがデメリットもあり、その対策として「非連結」のフォームとVBA+SQLを使ったテクニックも覚えておくと実装の幅が広がる
・テーブルやパーツの名前には、コントロール別に規則をつけるとコード上で識別しやすくなる。テーブル名は「T_」、フィールド名は「fld_」で始めるなど

【講師プロフィール】
今村 ゆうこさん
地方の非IT系企業に勤務し、Web担当と業務アプリケーション開発を手掛ける。小学生と保育園児の2人の子供を抱えるワーキングマザー。著書に『Access VBA 実践マスターガイド ~仕事の現場で即使える』『Access マクロ入門 ~仕事の現場で即使える』『Access レポート&フォーム 完全操作ガイド ~仕事の現場で即使える』『Access データベース本格作成入門 ~仕事の現場で即使える』『Excel & Access 連携実践ガイド ~仕事の現場で即使える』『スピードマスター 1時間でわかる Accessデータベース超入門』(すべて技術評論社)がある。

Accessの特徴

まずは、VBAについて学ぶうえで必要となるオブジェクトの確認からスタートしました。

Access VBAで使うオブジェクトには、次の4種類があります。

・テーブル:データを溜め込む
・クエリ:抽出して計算する(利用)
・レポート:印刷用テンプレを作る
・フォーム:データ入力フォーム

わかりやすく言うと、テーブルはExcelの表のようにデータが整理されているもので、これらが複数集まったものがデータベースというイメージだそうです。

そして「あっちのテーブルのここのデータ」「こっちのテーブルのここのデータ」という指示でデータを集めたり計算したりするのがクエリ、結果を印刷するための体裁を整えるのがレポートで、データベース(テーブル)にデータを入力するインターフェイスがフォームとのことです。

f:id:itstaffing:20200106130011j:plain
▲テーブルとフォーム、レポートの関係

次にマクロとVBAの違いです。マクロは、VBAをベースに日本語でプログラムが作れるというイメージで「実は、マクロでだいたいのことはできる」そうですが、SQLを使うことはできません。

クエリとSQLは、どちらも似たような目的で利用できます。それもそのはずで、クエリはSQLがベースになっているからだそうです。

f:id:itstaffing:20200106130014j:plain
▲クエリで指示した操作をSQL文として取得することもできる。それらをコピペしてVBAで使うのも便利

一般的なデータベースアプリケーションは、3層アーキテクチャの形をとります。ユーザインタフェースとデータベース、その間をつなぐビジネスロジックの3層です。一般的に3層アーキテクチャのアプリを一つ作るには、たくさんのファイルが必要となりますが、Accessの場合、1つのファイルでこの3層を実現できます。

ビジネスロジックの部分をマクロまたはVBA、クエリまたはSQLで作り込むことになりますが、VBAとSQLを使ったテクニックを覚えておくと、応用が効いて便利だそうです。

また、Accessで作成するアプリケーションは、データベースファイルの容量制限などから、小規模な会社や部署で使うのに向いていると、今村さんはお話しされました。

f:id:itstaffing:20200106130016j:plain
▲大規模なシステムはSQL ServerやOracle DBなどを使い、Webアプリケーションなどで構築するのが主流。Accessのアプリケーションは中小規模向け

Accessファイルを共有サーバに置き複数名で使うことも可能ですが、使用者は少数に限られるべきと、説明されました。同時にレコード更新の際に排他的処理が必要な場合には、Accessは不適切だそうです。

また、Accessはテーブルとフォームを「連結」させることで、アプリケーションのユーザインタフェース部分をとても簡単に作成することができますが、デメリットもあるそうです。

f:id:itstaffing:20200106130019j:plain
▲「連結」のフォームを使わない「非連結」の状態で、データの取り出しや書き込む方法もある

これらを踏まえ、今村さんはVBAとSQLでアプリケーションの実装に入り、一つひとつ丁寧に解説されました。

短い時間の中、完成まで分かりやすく解説してくださったのですが、このレポートではボリュームの都合により、テーブルの設計と、単一フォーム(一対多の関係を持たない構造)におけるデータの読み書きの実装までの内容をお伝えします。

テーブル設計

まずはテーブルを設計していきます。ここで例として扱ったのはマスターテーブルである「商品マスター」と、トランザクションテーブルである「販売データ」「販売データ詳細」の計3つ。

マスターテーブルは、新商品の追加など比較的更新頻度が低いテーブルですが、トランザクションテーブルは毎日の商取引に応じてデータが増えていきます。

f:id:itstaffing:20200106130022j:plain
▲マスターテーブル「商品マスター」

f:id:itstaffing:20200106130024j:plain
▲トランザクションテーブル「販売データ」

f:id:itstaffing:20200106130026j:plain
▲トランザクションテーブル「販売データ詳細」

テーブルやテーブルを構成するパーツには名前を付けますが、テーブル名は「T_」で、フィールド名は「fld_」で始めるというように、コントロール別に命名規則を定めておくと、あとからSQL文を書くときに便利だそうです。

フォーム設計

次にフォームを設計します。商品マスターのデータ入力用と、販売データの入力用がそれぞれ必要になります。詳細は次の通りです。

f:id:itstaffing:20200106130029j:plain
▲「商品マスター」フォームの詳細

f:id:itstaffing:20200106130031j:plain
▲「販売データ」フォームの詳細

「ラベル」や「ボタン」などのコントロールでは、プログラム上で識別に使う「名前」(例:btn_ボタン)と、コントロール上に表示される文字列の「標題」(例:ボタン)があるので、混同しないように命名します。

f:id:itstaffing:20200117132516j:plain

▲「標題」と「名前」が混ざらないように注意

販売データのフォームで「親レコード削除のチェックボックスがあると便利」ということや、「1~10までの数字を順につけておくと後でループを使って処理できる」などのポイントも教えていただきました。

VBA+SQLでアプリケーションの実装

いよいよVBAとSQLで実装していきます。

まず、単一フォームの初期化を行います。フォームを開いたときと、[新規]ボタンがクリックされたときに、初期化の処理を行います。どちらも同じ処理なので、InitializeForm()という処理にまとめて、呼び出すようにしています。

f:id:itstaffing:20200106130036j:plain
▲InitializeFormという処理を別に作成しておき、呼び出すようにする

次に、テーブルからデータを読み込む処理を実装します。次のようにレコードセットを取得する部分のコードを作成します。

f:id:itstaffing:20200106130038j:plain
▲レコードセット取得のテンプレート・詳細1

f:id:itstaffing:20200106130041j:plain
▲レコードセット取得のテンプレート・詳細2

エラーが起きたときも、起きなかったときも、最後の処理(Finally)が必要です。続いて、SQLのSELECT文を実装します。SQL文を途中改行する際は、文末「_」を付ける点に注意してください。

Dim 変数名 as String
変数名 = "SELECT フィールド名" & "FROM テーブル名" & "WHERE 条件;"

上記の文を見やすくするために改行するには、次のようになります。

Dim 変数名 as String
変数名 = "SELECT フィールド名" & _
"FROM テーブル名" & _
"WHERE 条件;"

改行時に「_」を入れている箇所に注目です。ここに実際のコントロール名を当てはめると、次のようになります。

f:id:itstaffing:20200106130044j:plain
▲シングルクォートの扱いに注目。また「Me.」はこのフォーム自身を指すときに使う

次に、データベースに変更を加える処理の実装です。まず、SQL文を実行する部分のコードを作成します。

f:id:itstaffing:20200106130047j:plain
▲SQL文を実行し、結果に応じた戻り値を返す

次に、INSERT、UPDATE、DELETEの各SQL文の実行部分を実装していきます。

f:id:itstaffing:20200106130009j:plain
▲INSERT文の実装。SQLのINSERT文をセットしtryExecuteを呼び出す。同様にUPDATE、DELETEも実装していく

このほか、DELETE文の実装では「本当によろしいですか?」の確認機能を追加しました。複数レコードの展開とトランザクション(複数レコード取得/複数命令処理の実装)についても実装すると、きちんと動作するAccessのアプリケーションが完成しました。

今回のイベントでは、VBAを使えば、Accessで手軽に本格的なアプリケーションが作成できるという点が、とてもよく分かりました。参加者からは、「実際のコードを例にノウハウを解説いただいて、今後取り組む業務に役立つ内容でとてもためになった」「非連結状態での処理方法は初めてだったので、とても参考になりました」などの声をいただきました。

株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

第7話 間違えて reset しちゃった?git reflogで元どおり【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20191223102837j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第6話 では、特定の時点までファイルを巻き戻す「リセット」を学びました。

・特定の時点までファイルを巻き戻す

$ git reset

今回の第7話では、間違えてリセットしてしまっても元に戻せる「リフログ」を学びます。一体どのようなコマンドなのでしょうか。このマンガを通して、わかばちゃんと一緒に知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶ Git使い方入門』『わかばちゃんと学ぶ Googleアナリティクス』『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ システム運用の基本』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

間違えて操作しても、reflog(リフログ)で元どおり!

f:id:itstaffing:20191223102840j:plain
f:id:itstaffing:20191223102844j:plain
f:id:itstaffing:20191223102847j:plain


リフログ(reflog)とは?

リフログとは、HEADの動き(自分自身が行った行動)を履歴にしたものです。具体的には、次のものが履歴として残ります。

・新規コミット(コミット、マージ、プル、リバートなど)
・ブランチの切り替え(チェックアウト)
・履歴の書き換え(リセット、リベースなど)

f:id:itstaffing:20190617145541j:plain
HEADについては前回の 第6話 で説明したとおりだな。
f:id:itstaffing:20190617145538j:plain
簡単に言えば「自分の操作履歴を見ることができる」ってことね。
f:id:itstaffing:20190617145541j:plain
そのとおり。リフログの手順としては『1. 操作履歴を見る → 2. 戻りたい地点の数字を指定してリセットする』のだ。
1. 操作履歴を見る

では、実践してみましょう。練習用リポジトリの中で、リフログコマンドを実行します。

$ git reflog

操作履歴一覧が表示されます。上に表示されているものほど新しい履歴です。

02f11b7 HEAD@{0}: reset: moving to 02f11b7
0488e28 HEAD@{1}: merge develop: Merge made by the 'recursive' strategy.
6978c20 HEAD@{2}: checkout: moving from develop to master
32275f0 (develop) HEAD@{3}: commit: 制作事例を追加
0e95561 HEAD@{4}: checkout: moving from master to develop
6978c20 HEAD@{5}: commit: 3回目のコミット
0e95561 HEAD@{6}: commit: 2回目のコミット
02f11b7 HEAD@{7}: commit (initial): はじめてのコミット
 
f:id:itstaffing:20190617145538j:plain
ふんふん。で、私はHEAD@{1}に戻りたいんだよね。
2. 戻りたい地点の数字を指定してリセットする

「resetの操作をする前(1つ前)に戻したい」といった場合、コマンドは次のとおりです。

$ git reset --hard HEAD@{1}

間違えて実行してしまったコマンドの1つ前まで戻れました!

f:id:itstaffing:20190617145538j:plain
リフログって便利だなー! Gitって、こんなにも融通がきくツールなんだね。
f:id:itstaffing:20190617145541j:plain
私も、このコマンドを初めて知ったときは感動したものだ。リフログは、マージ前のブランチを間違えて削除してしまったときにも使えるぞ。覚えておいて損はないコマンドだ。

まとめ

これで、間違えて操作してしまっても、あわてず元に戻すことができますね。

・HEAD の移動履歴一覧を表示

$ git reflog

・特定の時点までファイルを巻き戻す(nには戻りたい地点の数字を入力)

$ git reset --hard HEAD@{n}

Gitにはまだまだたくさんのコマンドがあります。
次回は、2019年夏にリリースされた新コマンド「switch」と 「restore」 について学んでいきましょう。

▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」

【イベントレポート】初心者歓迎!AWS認定ソリューションアーキテクトを目指すために

この記事では、2019年10月2日に開催したイベント「初心者歓迎!AWS認定ソリューションアーキテクトを目指すために」をレポートします。

今、注目されているAWS認定試験。そのなかでも最も人気のあるAWS認定ソリューションアーキテクトを取得するためのノウハウについて、書籍『AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト』の著者である、佐々木拓郎さんを講師にお迎えし、初心者にも分かりやすく解説していただきました。

■今回のイベントのポイント
・資格を取得すると、AWSに関する知識やスキルが客観的に証明される
・AWS認定試験は11種類あり、アソシエイトを持っていれば評価が高い
・問題を解く際の考え方のポイントは、問題文を段落ごとに読んでいく

【講師プロフィール】
佐々木 拓郎さん
NRIネットコム クラウド事業推進部 部長。専門はクラウドに関するコンサルティングから開発まで。クラウドの対象範囲拡大にともない、AIやIoTなど様々な領域に進出し、モバイルなどのフロントエンドの開発も行う。AWSより2019 APN AWS Top Engineersに選定された。主な著書として『クラウドエンジニア養成読本(技術評論社刊)、『AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト』『Amazon Web Services パターン別構築・運用ガイド』『Amazon Web Services 業務システム設計・移行ガイド』『Rubyによるクローラー開発技法』(以上4冊はSBクリエイティブ刊)などがある。

AWS認定資格の概要

今回のイベントのゴールは次のようなもの。AWS認定試験を受けるための心構えかもしれません。

・AWS認定資格を取るための道筋を知ってもらう
・AWSの設計の考え方を理解してもらう
・家に帰ったら、AWSトレーニングポータルのアカウントを作ってもらう

AWS認定試験は11種類あり、大きく分けると役割別・レベル別認定と専門知識認定があるそうです。

f:id:itstaffing:20191216140037j:plain
▲役割やレベルに応じてファウンデーショナル(Foundational)、アソシエイト(Associate)、プロフェッショナル(Professional、Specialty)に大別されている。
引用 https://aws.amazon.com/jp/certification/

佐々木さんによると、エンジニアであれば最初はアソシエイトにチャレンジするのがお勧めで「現場にアソシエイトを持っている人は、なかなかいない。持っている人がプロジェクトにいるとラッキーだなと感じる」といいます。

では、アソシエイトに区分されるソリューションアーキテクト(SolutionArchitect)、デベロッパー(Developer)、SysOpsアドミニストレータ―(SysOpsAdministrator)のどれから取るかという点については「結論からいうと人それぞれ」だそうです。

f:id:itstaffing:20191216140040j:plain
▲経験が無いのであれば、ソリューションアーキテクトがお勧め。バランス良くAWSの総合的な知識がつく

佐々木さんがお勧めするソリューションアーキテクトは、どのような内容なのでしょう。

「AWSにはどういうサービスがあって、それをどう組み合わせていくのか、といった設計能力が問われます。『AWSの定めるアーキテクチャ設計原則』というものがあり、他の方法で作れる場合でも、この設計原則に沿っていないとダメなのです」

状況の変化に応じて、AWSの構成を対応させられるかどうかが試されるそうです。参考に、ソリューションアーキテクトの出題の割合を紹介してくださいました。

f:id:itstaffing:20191216140021j:plain
▲図の上の3つで80%超えているので、これらをしっかり学ばないと合格できない。配点は不明とのこと

効率的な学習のためのチュートリアル

では、具体的にどのようなカタチで勉強をしていけば良いのでしょうか。ここでは学習計画の立て方や、教材を紹介してくださいました。

f:id:itstaffing:20191216140023j:plain
▲ハンズオンで対象サービスを触ってみることは非常に重要。知識のみでも合格は目指せるが、最終目的はAWSを使って仕事をすることなので触ってみるべきとのこと
引用 https://aws.amazon.com/jp/getting-started/tutorials/

教材としては、BlackBeltシリーズに代表される書籍をはじめ、オンラインセミナーやハンズオン、公式模試もあるそうです。

また、試験対策書籍はまとまっているので体系的に学べるものの、それだけでは足りないそうです。BlackBeltオンラインセミナーを見るなどして補完することが必要で、加えて、解説書籍を併用するのも良いそうです。

試験で問われるサービスカットとアーキテクチャカット

試験では、サービスカットとアーキテクチャカットの両面を押さえておく必要があります。サービスカットは「コンピューティングってどういうもの?」「ストレージってどういうもの?」といった知識で、アーキテクチャカットは「回復性の高いアーキテクチャはどのサービス?」「パフォーマンスに優れたアーキテクチャはどのサービス?」といった知識です。

AWSの公式ドキュメントは日本語訳が読みづらい面もありますが、サービスごとのFAQは重要なことがまとまっているので最低限読んでおくことをお勧めされました。

そして、AWSの基本的なサービスについて、大まかな紹介がありました。こちらは、サービスカットで問われる知識ですね。

f:id:itstaffing:20191216140026j:plain
▲コンピューティング、ストレージ、ネットワーク、DBの各種サービスの概要が紹介された

ストレージでは、EBSとS3の使い分けがAWSの設計では重要で、可用性や耐久性が求められる場合はS3を選ぶのがセオリーだそうです。AWSのDBサービスは多数あるそうですが、アーキテクチャ上で特に重要なのが、リレーショナルデータベースである「RDS」、NoSQL DBの「DynamoDB」、インラインキャッシュDBの「ElastiCache」の3つです。

次にアーキテクチャカットです。アーキテクチャについては、下記に示す「AWS Well-Architected」の考え方(5つの柱)に沿って解答するのが基本だそうです。

f:id:itstaffing:20191216140029j:plain
▲AWSが推奨する「AWS Well-Architected」の考え方

更なるステップアップを目指して

ソリューションアーキテクトを取得したら、次に何を目指すかというお話がありました。

f:id:itstaffing:20191216140033j:plain
▲佐々木さんが考えるお勧めの取得パターン。
引用 https://aws.amazon.com/jp/certification/

佐々木さんのお勧めは、アソシエイトの残りの2種類を取ることだそうです。なぜなら「プロフェッショナルは結構難しいから」とのこと。各分野の知識がある方なら、むしろ、プロフェッショナルよりもスペシャリティの方が取りやすいかもしれないと最後にお話しされました。

今回のイベントに参加された方からは、「公式ページが読みづらく苦労していたが、今日の説明は分かりやすかった」「資格取得のためにとても役立った」などの声をいただきました。株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

【イベントレポート】初心者からCCNA合格を目指す!ネットワークの全体像を理解しよう

この記事では、2019年9月13日に開催したイベント「初心者からCCNA合格を目指す!ネットワークの全体像を理解しよう」をレポートします。


今回のイベントでは、書籍『シスコ技術者認定教科書 図解でスッキリ! パッとわかるCCNAの授業』の著者である林口裕志さんに、CCNA受験に必要なネットワークの基礎知識のポイントを解説していただきました。

■今回のイベントのポイント
・IPアドレスから、8項目の情報が得られる
・サブネットマスクが変われば、ネットワーク部とホスト部の境界の位置も変わる
・実際の運用が始まってからネットワーク内のIPアドレスが足りなくならないよう、IPアドレスの割り当ては細心の注意を!

【講師プロフィール】
林口 裕志さん
ITスクール「システムアーキテクチュアナレッジ」で、主にCCNAやCCNPといったネットワーク系の担当講師を務める。数多くのたとえ話や実際の業務での体験談を織り交ぜながら進める講義は受講する生徒にも好評を得ており、IT業界未経験・PCスキルがゼロに等しい生徒であっても、その分かりやすい説明でCCNA合格を最短距離で導いている。CCNAの講義だけでも年間100名以上の生徒を担当し、その合格率は9割以上を誇る。

IPアドレスの構造を確認しておこう

TCP/IPネットワークを構成している大切な要素にIPアドレスがあります。今回のイベントのポイントは、IPアドレスの記述から得られる情報を、きちんと取得できているか?というお話から。

林口さんが冒頭で問いかけたのが、たとえば次のようなIPアドレスの表記から、どのような情報を読み取れるかということでした。


192.168.1.1/24

この表記からは、次のような8項目の情報が読み取れるといいます。

 
f:id:itstaffing:20191210125342j:plain
▲IPアドレスの1行から、これだけの情報が読み取れるそうです。一体どうやって?

これらの情報をどのようにして読み取るのか、詳しく解説してくださいました。

そもそもIPアドレスは32ビットの2進数から構成されており、通常は、それを8ビット(オクテッド)に分け、4つのオクテッドを10進数に変換して表記しているそうです。

f:id:itstaffing:20191210125344j:plain
▲2進数の0と1が32個並んでいるだけでは読みづらいため、8ビットずつの4つの塊をドットで区切り、10進数で表記している

2進数から10進数への変換のコツ

ここで重要になるのが2進数という考え方。0と1だけで数値を表記するこの記法が難しく、どうしても覚えらえません。そこで林口さんが紹介してくださったのが、2進数から10進数への変換のコツです。

f:id:itstaffing:20191210125347j:plain
▲末尾から1桁目は1が、2桁目以降は下の桁から順に2、4、8、16、32、64、128が「ある(1)」「ない(0)」を示している

これを理解すると、10進数から2進数への変換は、逆順をたどればよいことがわかります。

f:id:itstaffing:20191210125349j:plain
▲128が引ければ8桁目に1が立つ、残りから64が引ければ7桁目に1が立つ……、というように順に計算していく

ネットワーク部とホスト部の境界がわかる、サブネットマスク

次は「/24」という表記についてです。これはサブネットマスクというもので、通常、IPアドレスの表記には、このサブネットマスクを併記するのがルールなのだそうです。では、サブネットマスクは何を表しているのでしょうか。

サブネットマスクによって、IPアドレスのうちのどこからどこまでがネットワーク部を示し、どこからどこまでがホスト部を示すのか、その境界がわかります。ネットワーク部とは、どのネットワークかを識別するための部分で、ホスト部とは同一ネットワーク内で、どの端末かを識別するための部分だそうです。

このサブネットマスクは、ネットワーク機器であるルータの設定上、とても大切な情報なので、きちんと押さえておきたいポイントとのこと。

サブネットマスクには「/24」という表記だけでなく、10進数による32ピット4オクテッドの表記法もあります。

たとえば、


192.168.1.1 255.255.255.0


192.168.1.1/24

は、同じ意味だそうです。これを2進数で表してみましょう。

f:id:itstaffing:20191210125352j:plain
▲IPアドレス(上)とサブネットマスク(下)をそれぞれ2進数で表すと上記のようになる。サブネットマスクの先頭から24ビット目まで(1で表される部分)がネットワーク部で、最後の8ビット(0で表される部分)がホスト部を示す

「/24」という表記は、コンパクトに記述できるため、設計書や作業シートなどの表記に使うことが多く、10進数表記のほうは、パソコン上の設定入力などで用いられます。

この変換ができないと、実際のシーンで、作業シートを見ながら設定を行う作業ができないという事態になりかねません。

そして、このネットワーク部とホスト部は、自由に境目を変えることができます。たとえば


255.255.255.192/26

という表記は、/24のときとはネットワーク部、ホスト部の境目が変わります。

f:id:itstaffing:20191210125355j:plain
▲境目が26ビット目に変わると、ホスト部が/24のときに比べて減っていることに注目

そして、ここがポイントですが、サブネットマスクを参照して得られたネットワーク部におけるビットの並びが完全に一致しているIPアドレスは、すべて同じネットワークに所属していると見なされます。このルールが、ルータの設定と矛盾してはいけません。

f:id:itstaffing:20191210125359j:plain
▲異なるネットワークに属するIPアドレスを持つ機器が、同じネットワークに置かれていると矛盾が生じる

同じネットワークに含まれるIPアドレスの数は、2の[ホスト部のビット数]乗で求められます。たとえばホスト部のビット数が4ビットならば2の4乗で16個、8ビットならば2の8乗で256個になります。

IPアドレスのクラスによる分類

このサブネット表記が登場した背景を知るには、もともとIPアドレスにクラスという考え方があったことを知らなければなりません。IPアドレスにはAからEまでのクラスがあり、かつてはクラスごとにサブネットマスクが固定だったそうです。

f:id:itstaffing:20191210125402j:plain
▲クラスAでは同一のグループに1677万のIPアドレスが割り当てられるが、グループ内で使いきれないアドレスはムダになってしまう。事実、同一組織内で1677万のIPアドレスを使い切るケースはほとんどなく、クラスAのIPアドレスが割り当てられた組織では、大半が使われずに死蔵されていた時期があったという

サブネットマスクを使えば、/24のところを/25にすれば2分割でき、/26にすれば4分割できます。

ただし、同じグループのIPアドレスならば、すべてを機器に割り当てられるわけではありません。機器に割り当てられないアドレスが2つあります。1つは、同じグループに割り当てられたIPアドレスのうち、ホスト部がすべて0で表されるアドレスで、これはネットワーク全体(範囲)を指す「ネットワークアドレス」と呼ばれます。

もう1つは、逆にホスト部のビットがすべて1で表されるアドレスで、これは同じグループに含まれるすべてのアドレスに対して送信を行うアドレスで「ブロードキャストアドレス」と呼ばれます。

グループを細かく分割し、IPアドレスを無駄なく使う

さて、サブネットマスクによりIPアドレスを異なるグループに分割できること、IPアドレスの中に機器に割りてられないアドレスがあることが分かったところで、いよいよルータとIPアドレスとの関係についてです。

ルータの右と左は違うネットワークのグループになります。ルータは異なるネットワークのグループ間を接続し、IPアドレスに基づきデータを受け渡します。

このとき、サブネットマスクによりグループを分割することで、IPアドレスを無駄なく使うことができます。

f:id:itstaffing:20191210125404j:plain
▲サブネットマスクでグループを細かく分割することで、IPアドレスを無駄なく使える

ただし、いくら無駄をなくすといっても、運用が始まった組織において、ネットワーク内のIPアドレスが足りなくなるという事態は、絶対にしてはならないそうです。なぜなら、運用が始まってからネットワーク構成を変更するのは非常に大変な作業になるからです。したがって、ネットワークを設計する段階で、アドレスの数にある程度の余裕を持たせたサブネットマスクを設定する必要があります。

ここまで学んだところで、気が付くと、イベント冒頭で出されたIPアドレスから8つの項目を読み取ることができるようになりました。スゴイ!

このあと、MACアドレスについての解説があり、続いてルータの設定に進む予定でしたが、残念ながら時間切れに。しかし、IPアドレスとサブネットマスクは、ネットワークを学ぶうえで最初の関門。特に今回のイベントでは、2進数を詳しく解説してくださったので、サブネットマスクについても良く分かったという声を、参加者から多くいただきました。株式会社リクルートスタッフィングが運営するITSTAFFINGでは、弊社に派遣登録いただいている皆さまのスキル向上を支援するこのようなイベントを、定期的に開催しています。皆さまのご参加をお待ちしております。

第6話 git reset 3種類をどこよりもわかりやすい図解で解説!【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20191118140711j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第5話 では、特定のコミットを打ち消すコマンド「リバート」を学びました。

・特定のコミットを打ち消す

& git revert [打ち消したいコミットID]

今回の第6話では、特定の時点までファイルを巻き戻す「リセット」を学びます。このリセットには3種類方法があります。git reset --soft、--mixed、--hardです。「これらは何が違うのか?どのように使い分ければいいのか?」初心者の方は困ってしまいますよね。このマンガを通して、わかばちゃんと一緒に理解していきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶGit使い方入門』・『わかばちゃんと学ぶ Googleアナリティクス』・『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Xアカウント

リクルートスタッフィング

リセットには3種類ある

f:id:itstaffing:20191118140646j:plain
f:id:itstaffing:20191118140649j:plain
f:id:itstaffing:20190617145541j:plain
第1話で出てきた、この図は覚えているかな?
f:id:itstaffing:20190617145538j:plain
うん、覚えてるよ。
f:id:itstaffing:20190617145541j:plain
リセットはこの状態を頭に思い描けばそう難しくはないんだ。3種類のオプションそれぞれが影響を与える範囲は次のとおりだ。
--soft:HEADの位置のみ
--mixed:HEADの位置・ステージ
--hard:HEADの位置・ステージ・作業ディレクトリ

f:id:itstaffing:20190617145538j:plain
強度が上がるたびに影響を与える範囲が広くなってるね。ところでHEAD(ヘッド)って何?
f:id:itstaffing:20190617145541j:plain
HEADというのは、簡単に言えば「自分が今いる位置」のことだ。たいていはブランチの先頭のコミットを指していることが多い。こいつを過去のコミットに移動させることで、ブランチを過去に巻き戻すわけだが、そのときにステージも道連れにするのがmixed。ステージも作業ディレクトリも道連れにするのがhardだ。

git reset --soft

f:id:itstaffing:20191118140652j:plain
f:id:itstaffing:20190617145541j:plain
--soft は resetの中でも最弱。HEADだけを動かす、一番弱いオプションだ。

「直前のコミット内容を修正したい」「コミットし直したい」というときに便利なのがこのコマンドです。

--soft 活用例:直前のコミット内容を修正したい

$ git reset --soft HEAD^


例えば「まだ作業をしようと思っていたのに間違えてコミットしてしまった」「2つのファイルをまとめてコミットするべきだったのに、間違えて1つしかコミットしていなかった」などです。このコマンドを実行すると、まさに「コミットをする直前」の状態に戻ります。

▼ git reset --soft 実行後の状態

f:id:itstaffing:20191118140654j:plain

f:id:itstaffing:20190617145538j:plain
ふむふむ。コミットされていたファイルがステージに上がっているね。まさに「コミット」という動作だけを取り消した感じだね。
★魔王教授のコラム

上のコマンドの中にあった「HEAD^」というのは、「1つ前のコミット」という意味だ。では「2つ前のコミット」を表すにはどう打つか分かるかな?

答えは簡単「HEAD^^」だ。

では、8個前のコミットまで巻き戻すときはどうする?もちろん「HEAD^^^^^^^^」と書くこともできるが、指が疲れるし間違えそうだ。そこで「HEAD~8」のように書くこともできる。

え?8個前だと数えるのも面倒だって?もちろんコミットIDで指定することもできるぞ。たとえば次のように打てる。

$ git reset --soft caddd1c


git reset --mixed

f:id:itstaffing:20191118140657j:plain
f:id:itstaffing:20190617145541j:plain
--mixedは中程度の効果。HEADと一緒にステージも道連れにして巻き戻す。作業ディレクトリのファイルは消えないから安心してくれ。

「いくつかgit addでステージしたけど、やっぱやめた」というときに使えるコマンドです。作業ディレクトリのファイルは消えないので安心です。

--mixed 活用例:ステージしたものを取り消したい

$ git reset --mixed HEAD


ちなみに、オプション無しでも--mixedを実行したときと同じ結果が得られます。よって、次のように短く書くこともできます。

$ git reset HEAD

git reset --hard

f:id:itstaffing:20191118140701j:plain
f:id:itstaffing:20190617145541j:plain
--hard は一番強力なオプションだから取扱注意だ。HEADと一緒にステージだけでなく作業ディレクトリも道連れにして巻き戻してしまう。

「ステージングエリアにも作業ディレクトリにも残らなくていいから、コミットをまるごと消したい」というときに使えるコマンドです。

--hard 活用例:ひとつ前のコミットまでまるごと消したい

$ git reset --hard HEAD^


もちろんコミットIDを指定することもできます。指定した時点まで「HEAD・ステージングエリア・作業ディレクトリ」のすべてが巻き戻されます。

例として、極端ですが、この練習用リポジトリのmasterブランチのチェックアウトした状態で「はじめてのコミット」に戻ってみるとしましょう。

f:id:itstaffing:20191118140704j:plain

$ git reset --hard 02f11b7

実行すると、

f:id:itstaffing:20191118140706j:plain

masterブランチが「はじめてのコミット」に巻き戻りました。newsブランチとdevelopブランチは巻き戻らず、そのままですね。なぜだかわかりますか?

あくまでもHEADは「今自分がいるブランチの先頭」を指すものですから、masterブランチだけが巻き戻り、newsブランチとdevelopブランチはリセットの影響を受けなかったというわけです。

ここからさらに新しいコミットを乗せることもできますが、それをリモートリポジトリにプッシュすると他の人のmasterブランチにも影響が出てしまいます。「リセットは危ない」と言われるのはこのためです。git reset --hardを使う場合は、プッシュ前のコミットに対してのみ、使うようにしましょう。

f:id:itstaffing:20190617145538j:plain
リセット3種類、何がどう違うかわかったよ!
f:id:itstaffing:20190617145541j:plain
最初は難しく感じるかもしれないが、少しずつ慣れていくといいぞ。リセットの自信がないときや、プッシュ済みのコミットを打ち消したいときは、この前教えたリバートを使っておけばいい。
f:id:itstaffing:20190617145538j:plain
はい!ところで、最後のgit reset --hardの練習で、今までのコミット履歴ががっつり消えちゃったんですけどそれは……?
f:id:itstaffing:20190617145541j:plain
HAHAHA!そんなこともあろうかと思って、用意しておいたコマンドがある!間違えてリセットしても、git reflog(リフログ)で元どおりだ!次の授業をお楽しみに。

まとめ

ここまでで3種類のリセットの特徴がわかりました。

・特定の時点までファイルを巻き戻す

$ git reset --soft [巻き戻したい時点のコミットを指定]

f:id:itstaffing:20191118140652j:plain

$ git reset --mixed [巻き戻したい時点のコミットを指定]

f:id:itstaffing:20191118140657j:plain

$ git reset --hard [巻き戻したい時点のコミットを指定]

f:id:itstaffing:20191118140701j:plain

Gitにはまだまだたくさんのコマンドがあります。
次回、第7話では、いざというときに便利な git reflog(リフログ)について学んでいきましょう。

▼ これまでの「マンガでわかるGit」