20191223のGitに関する記事は14件です。

developやmasterへの直commitを禁止する

たまにブランチを切り忘れて、developブランチにcommitしてしまうことがあります。
gitのhooksを利用して、指定のブランチへのcommitを禁止することができます。

$ cd <リポジトリパス>
$ mkdir .githooks
$ cp .git/hooks/pre-commit.sample .githooks/pre-commit
$ git config core.hooksPath .githooks
$ chmod +x .githooks/pre-commit

.git/hooks内のファイルを利用することもできますが、チームで開発している場合は設定を共有するため、リポジトリへ含められるようにフォルダを作成します。
.git/hooks/pre-commit.sampleがない場合もありますので、その場合は、.githooks/pre-commitファイルを新規作成してください。
.githooks/pre-commitを編集します。

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

if git rev-parse --verify HEAD >/dev/null 2>&1
then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=$(git hash-object -t tree /dev/null)
fi

# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --bool hooks.allownonascii)

# Redirect output to stderr.
exec 1>&2

##### ↓↓↓↓追加↓↓↓↓ #####
if test "`git symbolic-ref HEAD | sed -e 's:^refs/heads/::'`" = master; then
    echo "<masterへコミットできない文言>"
    exit 1
fi

if test "`git symbolic-ref HEAD | sed -e 's:^refs/heads/::'`" = develop; then
    echo "<developへコミットできない文言>"
    exit 1
fi
##### ↑↑↑↑追加↑↑↑↑ #####

# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
    # Note that the use of brackets around a tr range is ok here, (it's
    # even required, for portability to Solaris 10's /usr/bin/tr), since
    # the square bracket bytes happen to fall in the designated range.
    test $(git diff --cached --name-only --diff-filter=A -z $against |
      LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
    cat <<\EOF
Error: Attempt to add a non-ASCII file name.

This can cause problems if you want to work with people on other platforms.

To be portable it is advisable to rename the file.

If you know what you are doing you can disable this check using:

  git config hooks.allownonascii true
EOF
    exit 1
fi

# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

以上で、developやmasterへcommitしたときに警告が表示され、commitできないようになります。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Atomのgit-controlでPushができないと思ったら、pre-commitでeslintにより弾かれていた件

これはTOWN Advent Calendar 2019 23日目のエントリーです。

Atomのgit-controlプラグインを使ってGitの操作をしているのですが、コミットはできるもののプッシュができない(ボタンが選択可能にならない)現象が発生しました。
(よくよく見ると画面の下の方にエラーが出ていたのですが最初気がつかづ。。。)

こういうときには面倒ですがTerminalからコマンドを直接入力して確認をしてみます。

% git commit
husky > pre-commit (node v13.5.0)
  ✔ Stashing changes...
  ❯ Running linters...
    ❯ Running tasks for *.{js,vue}
      ✖ eslint
  ↓ Updating stash... [skipped]
    → Skipping stash update since some tasks exited with errors
  ✔ Restoring local changes...



✖ eslint found some errors. Please fix them and try committing again.

/project/plugins/firestore.js
  1:28  error  Delete `;`  prettier/prettier
  2:42  error  Delete `;`  prettier/prettier
  4:32  error  Delete `;`  prettier/prettier
  7:18  error  Delete `;`  prettier/prettier

✖ 4 problems (4 errors, 0 warnings)
  4 errors and 0 warnings potentially fixable with the `--fix` option.

husky > pre-commit hook failed (add --no-verify to bypass)

どうやらpre-commit時にeslintが効いてコミットが弾かれている、ということがわかります。

該当するファイルを修正して再度コミットすることでPushができるようになりました。

スクリーンショット 2019-12-23 22.57.49.png

git-controlは画面上のウィンドウサイズをを変更できないので長いログが出たときに見落としがちなので注意です。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

N予備校のプログラミング入門コースの難易度がおかしい

私 is 誰

今年の7月にドワンゴの教育事業部に異動し、N予備校でプログラミング講師をやることになりました。

現在は週2回ニコ生やN予備校上にてプログラミング入門コースの授業放送をしています。
授業中はniconicoのTOPページに放送が出ており途中まで無料で視聴できるので、興味があれば是非ご視聴ください。直前の授業放送はこちら(ニコ生)

ドワンゴ自体は7年目となり、ニコニコ動画の開発を4年、エンジニア教育やエンジニア採用を2年ほどやってきました。

この記事で書きたいこと

現部署に異動後、教材のインプットを兼ねて『N予備校プログラミング入門コース』を履修したのですが、明らかに難易度が僕の想像した "入門コース" から外れたガチ編成になっていて衝撃を受けたことが記事を書こうと思ったきっかけです。
中身としてはとても良い教材になっているので、僕のような勿体無い誤解が少しでも減れば幸いです。

入門コースはいわゆる入門コースではない

『プログラミング入門コース』のゴールは ドワンゴがエンジニアとして採用したいレベルIT企業のエンジニアインターンに行けるレベル を目指しています。一般的な『入門』でイメージする難易度ではなく、かなり難易度の高い実践的な内容となっています。

ざっくり説明すると、入門コース最後の節では、

  • VirtualBox上に構築したUbuntu環境から
  • Node.js,Express,Webpack,PostgreSQLにて制作したGitHub認証入りのWebサービスを
  • テストコードやCI、脆弱性対策も完備して
  • Herokuにgit pushしてデプロイする

までを行います。入門とは一体……。

N予備校は高校生向けだけのサービスではない

予備校という名前から高校生向けの教材と思われがちですが、プログラミングコースやWebデザインコースは Webエンジニア、Webデザイナの就職をゴールとしたコース となっています。実際にプログラミングコースを受講している50%以上が社会人です。

大学受験コース

大学受験を目指す高校生向けの一般教科(数英国理社)が学べるコースです。
こちらは高校生向けのコースとなります。

プログラミングコース/Webデザインコース

現役プログラマやデザイナが教材制作および監修をしている、就職やキャリア開発をゴールに置いた実践的なコースとなります。
プログラミングコースの応用コースでは、Scalaでの大規模Web開発やスマホアプリ(iOS、Android)開発なども学ぶことができます。

この記事の対象者

現役Webエンジニアの方

本サービス、教材のインフルエンサーとしてもっとも適当な方々だと思います。
僕自身も4年間ニコニコ動画のWebエンジニアをやっていましたが、その視点でもだいぶ実践的な内容となっているので、共感いただける方がいれば幸いです。

Web系企業のエンジニア採用担当者

2年間エンジニア採用をやってきた身としても、プログラミング入門コース履修者はオススメできる人材です。Linux上での開発、gitの操作、セキュリティ知識など、個人では身につけにくい知識を得られるので、戦力になるまでが早いと思います。

Webエンジニア研修担当者

ドワンゴでもN予備校プログラミングコースの一部をエンジニア向けの研修に利用していました。Webエンジニアを育てるための統一的な研修教材になるかと思いますので、一考いただければ幸いです。

『プログラミング入門 Webアプリ』コースでやること

第1章 - はじめよう -

第1章では基礎的なHTML,CSS,JSの書き方を学び、章の終わりにはそれらを繋ぎ合わせて「入力内容で結果の変わる診断アプリ」(診断メーカーのようなもの)を作ります。

第1章は割とどこのサービスでも共通のプログラミング入門的なコンテンツで、初心者が脱落しないようやさしく解説されています。
対話的なプログラミングや手早く動くものが作れることを重点に置いているので、プログラミングの面白さを体感しながら読み進められるかと思います。

VSCodeで開発をする

まず最初にVSCodeをインストールし、開発も基本的にVSCode上で行っていきます。
VSCodeで開発するための環境設定なども併せて案内しているので、IDEのカスタマイズに関する関心もつけられます。

HTML、CSS、JS

基本的なタグやスタイルの当て方、HTMLに直接書く方法から外部ファイルに分割して読み込む方法まで学びます。Tweetボタンや動画の埋め込みなども学びます。手軽にリッチ化できる点が良い体験になるかと思います。

JSはES6(ES2015)を採用しており、以下の基本的な構造化プログラミングの方法について学習します。

  • 型(数値、文字列、真偽値)
  • 変数
  • 算術演算、比較演算、論理演算
  • if, for
  • コレクション
  • コメント
  • 関数
  • オブジェクト

ChromeのコンソールタブをJavaScriptのインタプリタとして使っており、1行1行の挙動を確認しながら学んでいくスタイルになります。
浮動小数や丸め誤差、正規表現、truthy/falsyな値、無名関数やアロー関数など、細かい部分の言語仕様もTipsとして解説されています。

診断ページを作る

基本的な言語仕様が学べたら診断ページを作ります。
要件定義からモックアップを作り、実装後は簡単なテストも書きます。

作って終わりではなく、開発の基本的なプロセスを体験できる進行となっています。

第2章 - 準備しよう -

第1章とは打って変わっていきなりガチな開発環境を整えていきます。
正直に言って技術的な関心がないと全く楽しくない、難所となる章です。

長くなるので学ぶ要素の列挙だけになりますが、Web開発経験のある人ならカリキュラムのヤバさ解ってもらえるかと思います。

オススメPoint

  • 殆どの学習をUbuntu上で行うため、WinとMacの環境差がなくなる
  • 能動的に学びにくいLinuxの操作や泥臭い処理を体系的に学べる
  • gitでのソーシャルコーディング(チーム開発に必要な操作)を学べる
  • ニコ動のランキングRSSを取ってきて集計する演習が楽しい

第2章で学べるもの

  • VirtualBox, Vagrantを使いUbuntu環境を作る
  • コンソール、ターミナルの使い方
  • linux
    • ライセンスについて
    • 基本的なLinux上でのコマンド操作(CUI、オプション、引数など)
    • SSH接続、SSHkeyGen、公開鍵認証
    • コンピュータを構成するデバイスについて
    • lshw を使った仮想デバイスのスペック確認
    • 手元端末との共有フォルダ設定(Vagrantfileによるマウント)
    • 標準入出力、エラー出力、リダイレクトやパイプ
    • シェルプログラミング、ファイル権限
    • tmuxによる複数窓の立ち上げ
  • 通信の話
    • tcpdump, nc, telnetを使って通信を確認
    • 各種通信プロトコルやTCPとUDP
    • HTTP通信の基礎
    • DNS
    • hosts設定、ポートフォワード設定
  • 実践系
    • niconico動画ランキング情報のRSSを取得してファイルに保存
    • cronによる定期実行
  • git
    • バージョン管理とは
    • 分散型バージョン管理とgitの基本的な使い方
    • コンフリクトの解消の実践
    • Githubでのイシュー管理、ドキュメンテーション、Gist
    • ブランチ戦略、フォーク、プルリクエスト

第3章 - サーバーサイドプログラミング入門 -

辛い2章を終えたところで、ようやくWeb開発っぽい部分に着手していきます。
プログラミング的な要素も増えてくるので割と楽しめる内容かと思います。

オススメPoint

  • SlackBotが作れるようになる
  • 管理者機能の必要性や実装に触れている
  • Herokuでお手軽にサーバーを立てる方法を学べる
  • 脆弱性に関する解説と攻撃の再現、対策の実装について学習できる

第3章で学べるもの

  • Node.js
    • ライブラリ、パッケージマネージャー
    • パッケージの作成
    • REPL
    • fs, Stream
    • 同期IO,非同期IO
  • JavaScript応用
    • 連想配列、for-of
    • map functions
  • アルゴリズムやパフォーマンス
    • フィボナッチ数列を求めるプログラムを書く
    • 再帰、メモ化、オーダー
    • timeコマンドやnode --profによる実行時間測定
  • SlackのBot開発
    • Slackワークスペースの作成
    • yo, Hubot, CoffeeScript
    • CRUD
    • 例外処理
  • Webアプリ作成
    • UI, URI, モジュール設計
    • Node.jsによるcreateServer
    • User-Agent
    • アクセスログ、ロギング
    • HTMLのフォーム
    • テンプレートエンジン
    • Basic認証によるログイン、ログアウト
    • Cookieとセッション管理
    • リダイレクト
    • ルーティング
    • データベース(PostgreSQL)
    • スタイル当て(Bootstrap)
    • 管理系機能の実装
    • HerokuでのWebサービス公開
  • セキュリティ、脆弱性(実際に再現と対策まで行う)
    • XSS
    • パスワードアタック
    • セッションハイジャック
    • CSRF

第4章

第4章は実践編になります。
各種フレームワークの導入や、実践的な機能の実装をしていきます。

終了時の成果物として、『予定調整サービス』がWeb上に公開された状態でできあがります。
これまで学んできたものを総動員して、『実用的なアプリケーションを作っていくプロセス』を学びます。

オススメPoint

  • 古すぎない枯れた(成熟した)フレームワークを学べる
  • 今までの学習を裏付けにしながら実用的なWebアプリケーションを作れる
  • ある程度作り込まれたサービスを題材にCIやリファクタリングの有用性を学べる

第4章で学べるもの

  • 各種フレームワークの導入
    • Webフレームワーク(Express)
    • passportによるGitHubログインの実装
    • テスティングフレームワーク(mocha)
    • webpack
  • 実践的なDOM操作(イベントハンドリングやアニメーション)
  • AJAX/WebSocket(Socket.IO)
  • CI(継続的インテグレーション)
  • リファクタリング
  • データベース操作
    • データモデリング
    • 基本的なデータ操作
    • JOIN
    • INDEXING
    • グルーピングと集計関数
    • トランザクション
  • 予定調整サービスの制作
    • 実践的なサービス設計、データ設計、要件定義
    • 外部認証の実装とユーザーの保存
    • 「予定」の作成と一覧表示
    • 「予定」の更新、削除、ユーザーごとの権限判定
    • Header、Footerの共通化
    • スタイル当て、セキュリティ対策、Herokuでの公開

おわりに

N予備校は 月額1000円 で上記教材が全て利用でき、Webデザインコースや大学受験コースも追加課金なしで受講可能です。

中の人が言うのもアレですが鬼安いので超オススメです。よろしくお願いします。

ちなみにN高等学校(通学コース/ネットコース)に入学すると、N予備校は無料で使うことができます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

N予備校プログラミング入門コースの難易度がおかしい

私 is 誰

今年の7月にドワンゴの教育事業部に異動し、N予備校でプログラミング講師をやることになりました。

現在は週2回ニコ生やN予備校上にてプログラミング入門コースの授業放送をしています。
授業中はniconicoのTOPページに放送が出ており途中まで無料で視聴できるので、興味があれば是非ご視聴ください。直前の授業放送はこちら(ニコ生)

明日(12/24)の授業ではNode.js(Express)でpassportを使ったGitHubログイン(OAuth2.0)を実装します。

ドワンゴ自体は7年目となり、ニコニコ動画の開発を4年、エンジニア教育やエンジニア採用を2年ほどやってきました。

この記事で書きたいこと

現部署に異動後、教材のインプットを兼ねて『N予備校プログラミング入門コース』を履修したのですが、明らかに難易度が僕の想像した "入門コース" から外れたガチ編成になっていて衝撃を受けたことが記事を書こうと思ったきっかけです。
中身としてはとても良い教材になっているので、僕のような勿体無い誤解が少しでも減れば幸いです。

入門コースはいわゆる入門コースではない

『プログラミング入門コース』のゴールは ドワンゴがエンジニアとして採用したいレベルIT企業のエンジニアインターンに行けるレベル を目指しています。一般的な『入門』でイメージする難易度ではなく、かなり難易度の高い実践的な内容となっています。

ざっくり説明すると、入門コース最後の節では、

  • VirtualBox上に構築したUbuntu環境から
  • Node.js,Express,Webpack,PostgreSQLにて制作したGitHub認証入りのWebサービスを
  • テストコードやCI、脆弱性対策も完備して
  • Herokuにgit pushしてデプロイする

までを行います。入門とは一体……。

N予備校は高校生向けだけのサービスではない

予備校という名前から高校生向けの教材と思われがちですが、プログラミングコースやWebデザインコースは Webエンジニア、Webデザイナの就職をゴールとしたコース となっています。実際にプログラミングコースを受講している50%以上が社会人です。

大学受験コース

大学受験を目指す高校生向けの一般教科(数英国理社)が学べるコースです。
こちらは高校生向けのコースとなります。

プログラミングコース/Webデザインコース

現役プログラマやデザイナが教材制作および監修をしている、就職やキャリア開発をゴールに置いた実践的なコースとなります。
プログラミングコースの応用コースでは、Scalaでの大規模Web開発やスマホアプリ(iOS、Android)開発なども学ぶことができます。

この記事の対象者

現役Webエンジニアの方

本サービス、教材のインフルエンサーとしてもっとも適当な方々だと思います。
僕自身も4年間ニコニコ動画のWebエンジニアをやっていましたが、その視点でもだいぶ実践的な内容となっているので、共感いただける方がいれば幸いです。

Web系企業のエンジニア採用担当者

2年間エンジニア採用をやってきた身としても、プログラミング入門コース履修者はオススメできる人材です。Linux上での開発、gitの操作、セキュリティ知識など、個人では身につけにくい知識を得られるので、戦力になるまでが早いと思います。

Webエンジニア研修担当者

ドワンゴでもN予備校プログラミングコースの一部をエンジニア向けの研修に利用していました。Webエンジニアを育てるための統一的な研修教材になるかと思いますので、一考いただければ幸いです。

『プログラミング入門 Webアプリ』コースでやること

第1章 - はじめよう -

第1章では基礎的なHTML,CSS,JSの書き方を学び、章の終わりにはそれらを繋ぎ合わせて「入力内容で結果の変わる診断アプリ」(診断メーカーのようなもの)を作ります。

第1章は割とどこのサービスでも共通のプログラミング入門的なコンテンツで、初心者が脱落しないようやさしく解説されています。
対話的なプログラミングや手早く動くものが作れることを重点に置いているので、プログラミングの面白さを体感しながら読み進められるかと思います。

VSCodeで開発をする

まず最初にVSCodeをインストールし、開発も基本的にVSCode上で行っていきます。
VSCodeで開発するための環境設定なども併せて案内しているので、IDEのカスタマイズに関する関心もつけられます。

HTML、CSS、JS

基本的なタグやスタイルの当て方、HTMLに直接書く方法から外部ファイルに分割して読み込む方法まで学びます。Tweetボタンや動画の埋め込みなども学びます。手軽にリッチ化できる点が良い体験になるかと思います。

JSはES6(ES2015)を採用しており、以下の基本的な構造化プログラミングの方法について学習します。

  • 型(数値、文字列、真偽値)
  • 変数
  • 算術演算、比較演算、論理演算
  • if, for
  • コレクション
  • コメント
  • 関数
  • オブジェクト

ChromeのコンソールタブをJavaScriptのインタプリタとして使っており、1行1行の挙動を確認しながら学んでいくスタイルになります。
浮動小数や丸め誤差、正規表現、truthy/falsyな値、無名関数やアロー関数など、細かい部分の言語仕様もTipsとして解説されています。

診断ページを作る

基本的な言語仕様が学べたら診断ページを作ります。
要件定義からモックアップを作り、実装後は簡単なテストも書きます。

作って終わりではなく、開発の基本的なプロセスを体験できる進行となっています。

第2章 - 準備しよう -

第1章とは打って変わっていきなりガチな開発環境を整えていきます。
正直に言って技術的な関心がないと全く楽しくない、難所となる章です。

長くなるので学ぶ要素の列挙だけになりますが、Web開発経験のある人ならカリキュラムのヤバさ解ってもらえるかと思います。

オススメPoint

  • 殆どの学習をUbuntu上で行うため、WinとMacの環境差がなくなる
  • 能動的に学びにくいLinuxの操作や泥臭い処理を体系的に学べる
  • gitでのソーシャルコーディング(チーム開発に必要な操作)を学べる
  • ニコ動のランキングRSSを取ってきて集計する演習が楽しい

第2章で学べるもの

  • VirtualBox, Vagrantを使いUbuntu環境を作る
  • コンソール、ターミナルの使い方
  • linux
    • ライセンスについて
    • 基本的なLinux上でのコマンド操作(CUI、オプション、引数など)
    • SSH接続、SSHkeyGen、公開鍵認証
    • コンピュータを構成するデバイスについて
    • lshw を使った仮想デバイスのスペック確認
    • 手元端末との共有フォルダ設定(Vagrantfileによるマウント)
    • 標準入出力、エラー出力、リダイレクトやパイプ
    • シェルプログラミング、ファイル権限
    • tmuxによる複数窓の立ち上げ
  • 通信の話
    • tcpdump, nc, telnetを使って通信を確認
    • 各種通信プロトコルやTCPとUDP
    • HTTP通信の基礎
    • DNS
    • hosts設定、ポートフォワード設定
  • 実践系
    • niconico動画ランキング情報のRSSを取得してファイルに保存
    • cronによる定期実行
  • git
    • バージョン管理とは
    • 分散型バージョン管理とgitの基本的な使い方
    • コンフリクトの解消の実践
    • Githubでのイシュー管理、ドキュメンテーション、Gist
    • ブランチ戦略、フォーク、プルリクエスト

第3章 - サーバーサイドプログラミング入門 -

辛い2章を終えたところで、ようやくWeb開発っぽい部分に着手していきます。
プログラミング的な要素も増えてくるので割と楽しめる内容かと思います。

オススメPoint

  • SlackBotが作れるようになる
  • 管理者機能の必要性や実装に触れている
  • Herokuでお手軽にサーバーを立てる方法を学べる
  • 脆弱性に関する解説と攻撃の再現、対策の実装について学習できる

第3章で学べるもの

  • Node.js
    • ライブラリ、パッケージマネージャー
    • パッケージの作成
    • REPL
    • fs, Stream
    • 同期IO,非同期IO
  • JavaScript応用
    • 連想配列、for-of
    • map functions
  • アルゴリズムやパフォーマンス
    • フィボナッチ数列を求めるプログラムを書く
    • 再帰、メモ化、オーダー
    • timeコマンドやnode --profによる実行時間測定
  • SlackのBot開発
    • Slackワークスペースの作成
    • yo, Hubot, CoffeeScript
    • CRUD
    • 例外処理
  • Webアプリ作成
    • UI, URI, モジュール設計
    • Node.jsによるcreateServer
    • User-Agent
    • アクセスログ、ロギング
    • HTMLのフォーム
    • テンプレートエンジン
    • Basic認証によるログイン、ログアウト
    • Cookieとセッション管理
    • リダイレクト
    • ルーティング
    • データベース(PostgreSQL)
    • スタイル当て(Bootstrap)
    • 管理系機能の実装
    • HerokuでのWebサービス公開
  • セキュリティ、脆弱性(実際に再現と対策まで行う)
    • XSS
    • パスワードアタック
    • セッションハイジャック
    • CSRF

第4章

第4章は実践編になります。
各種フレームワークの導入や、実践的な機能の実装をしていきます。

終了時の成果物として、『予定調整サービス』がWeb上に公開された状態でできあがります。
これまで学んできたものを総動員して、『実用的なアプリケーションを作っていくプロセス』を学びます。

オススメPoint

  • 古すぎない枯れた(成熟した)フレームワークを学べる
  • 今までの学習を裏付けにしながら実用的なWebアプリケーションを作れる
  • ある程度作り込まれたサービスを題材にCIやリファクタリングの有用性を学べる

第4章で学べるもの

  • 各種フレームワークの導入
    • Webフレームワーク(Express)
    • passportによるGitHubログインの実装
    • テスティングフレームワーク(mocha)
    • webpack
  • 実践的なDOM操作(イベントハンドリングやアニメーション)
  • AJAX/WebSocket(Socket.IO)
  • CI(継続的インテグレーション)
  • リファクタリング
  • データベース操作
    • データモデリング
    • 基本的なデータ操作
    • JOIN
    • INDEXING
    • グルーピングと集計関数
    • トランザクション
  • 予定調整サービスの制作
    • 実践的なサービス設計、データ設計、要件定義
    • 外部認証の実装とユーザーの保存
    • 「予定」の作成と一覧表示
    • 「予定」の更新、削除、ユーザーごとの権限判定
    • Header、Footerの共通化
    • スタイル当て、セキュリティ対策、Herokuでの公開

おわりに

N予備校は 月額1000円 で上記教材が全て利用でき、Webデザインコースや大学受験コースも追加課金なしで受講可能です。

中の人が言うのもアレですが鬼安いので超オススメです。よろしくお願いします。

ちなみにN高等学校(通学コース/ネットコース)に入学すると、N予備校は無料で使うことができます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

SOURCE TREE を使っていたら知らないうちに .gitignore されていた

SOURCE TREE を使っていたら、対象ファイルが知らないうちに .gitignore されていてコミットできなくなってmした。
SOURCE TREE のアプリ上では解除できなかったので、 git check-ignore コマンドを使って .gitignore ファイルを特定しました。

実行コマンド

$ git check-ignore -v ファイルパス/sample.php
/Users/ユーザー名/.gitignore_global:16:sample.php  ファイルパス/sample.php

コマンド実行して、どの .gitignore で除外されているのかが特定できました。
プロジェクトの .gitignore ではなく .gitignore_global で除外されていたとは。。。
対象行を削除して無事コミットできました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.git の中を観察してみた

前から .git の中がどのように変わっていくかを調べてみたいと思っていたところ、同僚が .git の中に .git を作って差異を観察したら面白いのではというアイディアを提供してくださったので、それをやってみました!

なお、前提条件として、ざっくり Git がある程度どのようなデータ構造を持っているかを知識として持った上で調べています。

過去の記事: Git のデータ構造を図で整理

はじめに

以下のコマンドの実行時にどのように .git の中身が遷移していくかをみていきました。

$ git init
$ echo "Hello World!" > test.txt
$ git add test.txt
$ git commit -m 'First commit!'
$ git branch feature
$ git checkout feature
$ git remote add origin <リポジトリのURL>
$ git checkout master
$ git push origin feature

なお、使用する Git のバージョンは v2.17.1 です。

git init

git-sample というディレクトリを作成して、git init して、.git の中身を確認してみます。
なお、ディレクトリとファイルの区別がつくように、tree コマンドの結果でディレクトリだったものには末尾に「/」を追記しています。

$ mkdir git-sample
$ cd git-sample
$ git init
Initialized empty Git repository in /home/user/projects/git-sample/.git/
$ cd .git
$ tree
.
├── HEAD
├── branches/
├── config
├── description
├── hooks/
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── info/
│   └── exclude
├── objects/
│   ├── info/
│   └── pack/
└── refs/
    ├── heads/
    └── tags/

HEAD の中身をみてみます。
まだ存在していませんが、.git/refs 以下の master ブランチを指していると思われるファイルパスが書かれています。

$ cat HEAD
ref: refs/heads/master

次にconfig の中身をみてみます。
このリポジトリの設定情報が書かれています。

$ cat config
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true

description の中身をみてみます。
このリポジトリの説明を書くような雰囲気を感じますが、用途は不明です。

$ cat description 
Unnamed repository; edit this file 'description' to name the repository.

info/exclude の中身をみてみます。
.gitignore みたいなファイルのようにみえるのですが、.gitignore とはまた別の機能なのでしょうか?

$ cat info/exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

branches/, objects/, refs/ は現状空ディレクトリですが、これからの操作で変わっていくものだと思います。
hooks/ は git のコマンドを実行したときのフックを設定する箇所で今現在はサンプルのみが置いてあるようですね。

準備

以降、.git の差異を確認できるように .git 下で git init をして初回コミットしておきましょう。

$ pwd
/home/user/projects/git-sample/.git
$ git init
$ git add -A
$ git commit -m 'git init'
$ cd ..

以降、細かくコマンドの実行までは記載しませんが、これを利用して .git の差異を観察しています。

ステージングエリアへの追加

ステージングエリアにファイルを追加したときの.git の差異を観察します。

$ echo "Hello World!" > test.txt
$ git add test.txt

.git の変化を確認したところ、差異は以下の 2 つでした。

new file:   index
new file:   objects/98/0a0d5f19a64b4b30a87d4206aade58726b60e3

index はバイナリファイルで中身の確認は難しいのですが、git add によって何らかの形式でステージングの状態を保存しているものだと推測します。

後者の object について確認します。
test.txt の中身を指しているようなので、blob 形式のオブジェクトのようです。

$ git cat-file -p 980a0d5f19a64b4b30a87d4206aade58726b60e3
Hello World!

コミット

コミット時の .git の差異を観察します。

$ git commit -m 'First commit!'

.git の変化を確認したところ、差異は以下の 7 つでした。

new file:   COMMIT_EDITMSG
modified:   index
new file:   logs/HEAD
new file:   logs/refs/heads/master
new file:   objects/2a/222bc765ac38f3a056a088a2640c0ae4a85c5e
new file:   objects/37/6357880b048faf2553da6bc58ae820cea3690a
new file:   refs/heads/master

COMMIT_EDITMSG について確認します。
コミットしたときのコミットメッセージの内容が記録されているようでした。

$ cat COMMIT_EDITMSG
First commit!

index はバイナリファイルであり中身の確認は難しいのですが、コミットしたことで HEAD の状態とワークツリーの間に差分がなくなったので、そのために更新されたのではないかと推測しています。

logs に追加されたファイルを確認します。
それぞれ HEAD やブランチで初めて設定された commit オブジェクトのキーが出力されています。

$ cat logs/HEAD
0000000000000000000000000000000000000000 2a222bc765ac38f3a056a088a2640c0ae4a85c5e ***** <*******@************> 1577066716 +0900       commit (initial): First commit!
$ cat logs/refs/heads/master 
0000000000000000000000000000000000000000 2a222bc765ac38f3a056a088a2640c0ae4a85c5e ***** <*******@************> 1577066716 +0900       commit (initial): First commit!

objects に追加されたファイルを確認します。
片方は今回のコミットを表す commit 形式のオブジェクト、もう一方はそのコミットのルートディレクトリを指す tree 形式のオブジェクトのようです。

$ git cat-file -p 2a222bc765ac38f3a056a088a2640c0ae4a85c5e
tree 376357880b048faf2553da6bc58ae820cea3690a
author ***** <*******@************> 1577066716 +0900
committer ***** <*******@************> 1577066716 +0900

First commit!
$ git cat-file -p 376357880b048faf2553da6bc58ae820cea3690a
100644 blob 980a0d5f19a64b4b30a87d4206aade58726b60e3    test.txt

ブランチの作成

ブランチ作成時の .git の差異を観察します。

$ git branch feature

.git の変化を確認したところ、差異は以下の 2 つでした。

new file:   logs/refs/heads/feature
new file:   refs/heads/feature

logs に追加されたファイルを確認します。
feature ブランチが作成されたことが記録されているようです。

$ cat logs/refs/heads/feature
0000000000000000000000000000000000000000 2a222bc765ac38f3a056a088a2640c0ae4a85c5e ***** <*******@************> 1577067962 +0900       branch: Created from master

refs/heads/feature に追加されたファイルを確認します。
2a222bc765ac38f3a056a088a2640c0ae4a85c5e は前述のコミットしたオブジェクトを指すキーですので、おそらく feature ブランチはこのコミットを指していることを表しているようです。

$ cat refs/heads/feature 
2a222bc765ac38f3a056a088a2640c0ae4a85c5e

ブランチの切り替え

ブランチ切り替え時の .git の差異を観察します。

$ git checkout feature

.git の変化を確認したところ、差異は以下の 2 つでした。

modified:   HEAD
modified:   logs/HEAD

HEAD の差異を確認します。
「refs/heads/master」から「ブランチの作成」の項で追加された「refs/heads/feature」ファイルへ内容が変わったようです。

@@ -1 +1 @@
-ref: refs/heads/master
+ref: refs/heads/feature

logs に追加されたファイルを確認します。
HEAD を master ブランチから feature ブランチに切り替えたことが記録されているようです。

--- a/logs/HEAD
+++ b/logs/HEAD
@@ -1 +1,2 @@
 0000000000000000000000000000000000000000 2a222bc765ac38f3a056a088a2640c0ae4a85c5e ***** <*******@************> 1577066716 +0900        commit (initial): First commit!
+2a222bc765ac38f3a056a088a2640c0ae4a85c5e 2a222bc765ac38f3a056a088a2640c0ae4a85c5e ***** <*******@************> 1577068724 +0900        checkout: moving from master to feature

リモートリポジトリの追加

リモートリポジトリの追加時の .git の差異を観察します。

$ git remote add origin git@github.com:*****/git-sample.git

.git の変化を確認したところ、差異は以下の 1 つでした。

modified:   config

config の差異を確認します。
リモートリポジトリ origin の URL と fetch したときのブランチ情報を .git のどこに作成するかが追記されているようです。

@@ -3,3 +3,6 @@
        filemode = true
        bare = false
        logallrefupdates = true
+[remote "origin"]
+       url = git@github.com:*****/git-sample.git
+       fetch = +refs/heads/*:refs/remotes/origin/*

プッシュ

master プッシュ時の .git の差異を観察します。

$ git checkout master
$ git push origin feature

.git の変化を確認したところ、差異は以下の 2 つでした。

new file:   logs/refs/remotes/origin/master
new file:   refs/remotes/origin/master

logs に追加されたファイルを確認します。
origin/master ブランチが push に伴って更新されたことが記録されているようです。

$ cat logs/refs/remotes/origin/master
0000000000000000000000000000000000000000 2a222bc765ac38f3a056a088a2640c0ae4a85c5e ***** <*******@************> 1577070100 +0900       update by push

refs/remotes/origin/master を確認します。
2a222bc765ac38f3a056a088a2640c0ae4a85c5e は前述の commit オブジェクトを指すキーですので、おそらく origin/master ブランチはこのコミットを指していることを定義しているのではないかと推測されます。

$ cat refs/remotes/origin/master
2a222bc765ac38f3a056a088a2640c0ae4a85c5e

最終結果

最終的には .git はこうなりました。

$ tree
.
├── COMMIT_EDITMSG
├── HEAD
├── branches/
├── config
├── description
├── hooks/
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── fsmonitor-watchman.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   ├── prepare-commit-msg.sample
│   └── update.sample
├── index
├── info/
│   └── exclude
├── logs/
│   ├── HEAD
│   └── refs/
│       ├── heads/
│       │   ├── feature
│       │   └── master
│       └── remotes/
│           └── origin/
│               └── master
├── objects/
│   ├── 2a/
│   │   └── 222bc765ac38f3a056a088a2640c0ae4a85c5e
│   ├── 37/
│   │   └── 6357880b048faf2553da6bc58ae820cea3690a
│   ├── 98/
│   │   └── 0a0d5f19a64b4b30a87d4206aade58726b60e3
│   ├── info/
│   └── pack/
└── refs/
    ├── heads/
    │   ├── feature
    │   └── master
    ├── remotes/
    │   └── origin/
    │       └── master
    └── tags/

まとめ

実施したサンプルが少ないですが、ここまでの結果から以下のように推測しています。

  • .git/HEAD
    • 今現在の使用中のブランチを表す refs/ 以下のファイルが記載されている
    • git checkout などのブランチ切替時に更新される
  • .git/index
    • ステージングエリアに追加したときや、コミット時などのタイミングで更新される
  • .git/logs
    • HEAD や refs/ 以下のファイルがどのように変わっていたかの履歴が記録される
  • .git/object/
    • 各種オブジェクトが登録される
    • ステージングエリアに追加したときに、blob オブジェクトが追加される
    • コミットしたときに、ルートの tree オブジェクトと commit オブジェクトが追加される
  • .git/refs/heads/
    • ローカルブランチの作成時に、commit オブジェクトのキーが書かれたブランチ名のファイルが作成される
    • 初回コミット時に、新しい commit オブジェクトのキーが書かれたブランチ名のファイルが作成される
  • .git/refs/remotes/<リモートリポジトリ名>/
    • 初回 push 時に、新しい commit オブジェクトのキーが書かれたブランチ名のファイルが作成される

もちろん、ワークツリーやリポジトリの状態によっては、異なる動作になるかもしれませんので断定はできません。
ですが、実際の挙動を追ってみたことで、ある程度 .git の中がどのように変化していくのかの推測はできるようになったかなという感じです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

codeanywhereでgitにハロワをプッシュしよう!

前置き

codeanywhereを使って、スマホのみでgitにRubyのハロワをプッシュする流れについて解説します。

手順

まずはハロワの実行ファイルを作成します。
手順は↓を参照して下さい。
Codeanywhereを使ってスマホでプログラミングをしよう

githubにて、リポジトリを作成します。

Repositories>Desktop versionをタップ。
3C80F71A-8BD3-49F5-A99B-E649A680729A.jpeg

Newをタップ
AFDD3438-E1F9-4211-A944-B81267A92FF2.jpeg

下記のようにリポジトリを作成します。
C9A43831-B59B-4E21-8A22-574288AF2BD9.jpeg

SSH画面にて、下記のリンクの通り操作します。

https://techacademy.jp/magazine/6235

結果はこんな感じです。
959B207B-79E5-4E44-906B-97A994FD8EB1.png

下の通り、ソースがgitにプッシュされています。
594BD42D-A52A-4784-9115-4C8D6144C1B2.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git わかりやすくて便利だと思ったサイト

image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

今度こそ挫折しない git 入門 第2回

こんにちは、バカンのソフトウェアエンジニアの垣野内です。

この記事はバカン Advent Calendar 2019の22日目の投稿です。
前回に引き続きgitの入門記事をおとどけします!今回はブランチについての解説です。
ブランチは、覚えるコマンドは少ないのですが、慣れるのに少し時間がかかるかもしれません。

今回もこれでもかというくらいスクショをつけておきました!
コマンドでの入門をおすすめするのは、第一回に述べた通りです。
「なんでコマンドなの?もう令和だよ?」と言いたくなる気持ちをグッとこらえて、コマンド練習までぜひ一緒にやってみてください!

ブランチとはどんなものか

前回のコマンド練習その1のところで、git log というコマンドを使うことでコミットの履歴が見れることを確認しました。
↓再掲
git_branch_10.png

git log --graph --all というオプションをつけて実行すると、もう少しグラフィカルに見れます↓
(※ グラフィカルに見る方法はいくつかあります1)
git_log_graph.png

コミット1つ1つがアスタリスク * で表され、それらがつながったグラフが左端に表示されました。
このグラフをコミットグラフと呼びます。
(おそらく公式な用語となってるわけではないですが、よく使われる言葉です)

そして、ブランチとは、特定のコミットからコミットグラフを枝分かれ(まさに”ブランチ”)させるための仕組み です。コマンド練習その2のところで解説しますが、ブランチを作ったときのコミットグラフを先にお見せするとこんな感じになります↓
このコミットグラフを表示させ、そして理解するところまでが今回のゴールです!
git_branch_9.png

ブランチを使うと何が嬉しいのか

大きく3つ嬉しいことがあると筆者は考えてます:

1. 枝分かれさせることで(ブランチを作ることで)、”本流”の方にうっかり影響をあたえずにすむ
2. 複数人で並行して作業ができる
3. コミットのまとまりを作ることができる

※"本流"というのはあくまで比喩です。枝分かれの前の「木の”幹”」と言ってもいいでしょう。具体的にはコマンドのところで理解を深めてください!

よくわからない人も、やはりコマンドを叩いてみることでわかるかと思いますのでやってみましょう!

コマンド練習その2

さて、まずはブランチの一覧を確認するコマンドからいきましょう。
「え?もうブランチがあるの?」と驚かれたかもしれませんが、実は、git initした時点で、masterブランチという名前のブランチがデフォルトで作られるのです。

ブランチの一覧(git branch)

では、git branch とたたいてみましょう!
git_branch_1.png
無事にmasterブランチの存在が確認できたでしょうか?
git log のところですでに見えていたHEAD -> mastermaster とは、実はmasterブランチのことだったんですね。(上図↑赤枠)

HEAD とは現在の作業ディレクトリのことです。(作業ディレクトリについては第一回 へ)
つまり、「現在の作業ディレクトリは master ブランチを向いていますよ」ということです。
(ここの説明はブランチを複数作ってみたら理解できると思うので、わからなくても先に進んでみてください!
操作的な理解のあとに意味的な理解がついてくると思います。)

ブランチを新たに作る(git branch <ブランチ名>)

次に、ブランチを作ってみましょう。git branch <ブランチ名>で作ることができます。
ここでは、branch_test_1 というブランチ名にしてみます。つまり、git branch branch_test_1 とたたいてみましょう!そして、もう一度git branchと叩いてブランチの一覧を確認しましょう!
git_branch_2.png
↑上のように、branch_test_1 というブランチが作成できたでしょうか?
左のアスタリスクは、「作業ディレクトリが現在いるブランチ」を表しています。
現在”いる”という表現がわかりにくいかもしれませんが、これも進めていくうちにわかるかと思います。

ここで、git log --graph --allも確認しておきましょう。
git_branch_3-2.png
赤枠の部分の表示が少し変わりましたね。
ブランチが2つあり、HEADは依然 masterブランチを向いています。

ブランチを切り替える(git checkout <ブランチ名>)

ブランチには「切り替え」という考え方があります。
今、masterブランチに”いる”ことを確認しましたが、branch_test_1ブランチに”切り替え”てコミットをすることで、masterブランチの状態を全く汚すことなくファイルの変更をすることができます
(作業ディレクトリをまるっとコピーして、別名で保存して作業しているのと似ています。しかし、”本流”に合流させる時の作業がはるかに簡単です)

実際にやってみれば意味がわかるでしょう。
まず、git checkout <ブランチ名>とたたき、ブランチを切り替えます。今回はbranch_test_1 に切り替えたいので、git checkout branch_test_1 とたたきます。
そして、git branchをたたき、切り替わっていることを確認しましょう!
git_branch_4.png

↑上の図のようになったでしょうか?
ここで、git log --graph --allも確認しておきましょう。
git_branch_5.png
ブランチを切り替えたので、HEADbranch_test_1ブランチを向いています。

切り替えたブランチでコミットしてみる

切り替えたbranch_test_1ブランチにて変更を加えてみましょう!
前回の復習ですが、「変更して、add して、commit する」 という流れですよ!
ここでは、”git third test on branch_test_1” という文字列を加えてみました。
Screen Shot 2019-12-23 at 1.23.07.png

コミットまでやったら、再びgit log --graph --allでコミットグラフを確認してみましょう。

git_branch_6.png
HEAD -> branch_test_1 のコミットはmasterブランチのコミットよりも先にいますね。2

もう一度何か変更を加えてみましょう!
ここでは、”git fourth test on branch_test_1” という文字列を加えてみました。
Screen Shot 2019-12-23 at 1.39.20.png

くどいようですが、コミットまでやったら、再びgit log --graph --allでコミットグラフを確認してみましょう。

git_branch_7.png
HEAD -> branch_test_1 がいるコミットがさらにさきに進んでいることがわかります。

もとのブランチに戻ってみると...???

ここでもとのmasterブランチに戻ってみましょう。git checkout masterです。
そして、git log --graph --allを打ってみましょう。
git_branch_8.png
masterブランチに切り替えたので、HEADの向き先が masterブランチを向きましたね。
ここで、変更を加えてきたファイルも見てみてください。
Screen Shot 2019-12-23 at 1.46.12.png
”git third test on branch_test_1” という文字列や ”git fourth test on branch_test_1”という文字列がきれいになくなっていませんか?
なくなっているのではなく、作業ディレクトリがこの時のバージョンに戻ったのです!

これで、ブランチの一覧のところで説明した HEAD -> master の意味がわかったのではないでしょうか?
また、ブランチを新たに作るのところで説明した、「作業ディレクトリが現在いるブランチ」という説明もわかってきたかと思います。
ブランチを切り替えて作業をすることで、別名フォルダや別名ファイルを作ることなく複数のバージョンを共存させることができるのです!
そのため、複数人での並行作業もやりやすいということですね!

これで、ブランチを使うと何が嬉しいのかのところのメリット1とメリット2についても回収したつもりです。(メリット3については最後に軽く触れます)

もとのブランチでコミットすると...???

もとのmasterブランチで1つコミットしてみましょう!
ここではtest2.txt というファイルを新たに作り、”git fifth test on master” という文字列を加えました。
Screen Shot 2019-12-23 at 1.58.17.png

コミットまでやったら、いつもどおり、git log --graph --allでコミットグラフを確認してみましょう!

git_branch_9.png

まさにツリーのようにブランチが生えているようすが表示されましたね!:tada::tada::tada:
これでgitのブランチに関しても入門できたと言ってよいでしょう!おつかれさまでした!

マージ(概念だけ)

最後に、後回しにしていたブランチを使うと何が嬉しいのかのところのメリット3について軽く触れたいと思います。
すぐ上のコミットグラフにおける、branch_test_1ブランチでの2つのコミットを本流のmasterブランチへ合流させることができます。これをマージと言います。
branch_test_1ブランチをmasterブランチにマージする」という言い方をします。
(gitにおけるマージには明確に方向があるということに注意。「AとBをマージする」のではなく、「AをBにマージする」という考え方です)

これによって、masterブランチに一気に2つのコミットが取り込まれ、masterブランチのtest1.txtにもも”git third test on branch_test_1” という文字列や ”git fourth test on branch_test_1”が現れるようになります!
そして、この2つのコミットを戻したかったら、このマージを取り消せばよいのです3

マージのコマンドについては、ググってぜひやってみてください!


おさらいです。以下のコマンドの操作とともに、ブランチの有用性が理解いただけたかと思います。
- git branch(引数なし)(ブランチの一覧を表示)
- git branch <ブランチ名>(ブランチの作成)
- git checkout <ブランチ名>(ブランチの切り替え)

おわりに

git シリーズはこれでおしまいです。入門者の方が挫折しないよう、内容をしぼり、かつ丁寧なコマンドの解説を試みました。
もちろんこの2回の記事で紹介できてないコマンドもいくつもあるのですが、基本的な考え方が理解できれば適宜ググっていけるのではないかと思っています。

参考文献

  • 入門Git 絶版となってしまったようですが、個人的にはとても好きな本です。合う/合わないがとてもはっきりわかれる本だと思います。
  • Git の仕組み (1) この記事を読んで Git って面白いなと思ったのでした。ものごとの仕組みに興味のある方は、コマンドに慣れてきたころに読んでみると面白く読めると思います。
  • サルでもわかるGit入門
  • https://twitter.com/098ra0209/status/1163424568544907265 最近 twitter で見つけたものです。ポップな絵とともに用語の整理ができてよいですね。

参考リンク


  1. VSCode や IntelliJ などのエディタのプラグインを使うという方法、SourceTree などの git のGUIクライアントを使うという方法などです。ちなみに筆者は、以下のように、git log --graph --all --format=\"%x09%C(cyan bold)%an%Creset%x09%C(yellow)%h%Creset %C(magenta reverse)%d%Creset %s\" というコマンドを git の alias に登録して、git treeと打てばこれを呼び出せるようにしています。グラフィカルかつブランチが見やすいので気にいっています。.gitconfig というファイルがあると思うので、そこに全く同じように書けばよいです。git_config.png 

  2. 本編に書くか迷いましたが、git では、コミットへの参照という形でブランチが実現されています。コミットをするたびに、最新のコミットを追いかけていくので、動く参照です。 

  3. gitは、マージも1つのコミットとして表現されます。マージを消すとはこのコミットを”取り消す”ということにほかなりません。さらについでに補足すると、git における「コミットんぼ取り消し」には2種類あります; 1.そのコミットをなくすというコミットをする(revert) 2.本当にそのコミットをなかったことにする(reset) それぞれググってみてください! 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git revertが使えない

image.png
image.png
image.png
image.png
image.png
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git indent error (Git indent error so on )

image.png
image.png
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitで派生branchを間違えたとき

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Git rebase をもとに戻す。

image.png
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Gitで過去のcommitを削除する。

image.png
image.png
image.png
image.png
image.png
image.png
image.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む