[Git] コマンド

随時更新

前提知識

fetch

“git fetch origin xxx”は、リモートレポジトリ “origin” のブランチ “xxx” を、ローカルのリモート追跡ブランチ (remote tracking branch) に反映させるということである。

$ git branch -a
* develop
  feature/dynamodb
  feature/ph1-add-flag
  master
  remotes/origin/HEAD -> origin/master # remote追跡ブランチ
  remotes/origin/develop # remote追跡ブランチ
  remotes/origin/ph1-test # remote追跡ブランチ

merge

“git merge origin/xxx” は、リモートレポジトリ “origin” のブランチ “master” の追跡ブランチ (origin/xxx) を、現在のブランチにマージするということである。
マージする場合は --no-ff オプションを基本的に付与する。二つのブランチが fast-forward な関係かどうかにかかわらず、必ずマージコミットが作られる。

-ff: fast-foward

Git コマンド

$ mkdir {WORKING_COPY}
$ cd {WORKING_COPY}

# Gitリポジトリを新たに作成する。バージョン管理外の既存プロジェクトをGitリポジトリに変換したり, カレントリポジトリの初期化を行う。
$ git init

# リモートからローカルへリポジトリのクローン
$ git clone https://{USERNAME}:{PASSWD}@github.com/{ORGANIZATION}/{REPOSITORY}.git

# リモートからローカルへリポジトリのクローンができない場合
# sslVerifyを解除しない場合 "SSL certificate problem: Invalid certificate chain" のようにエラーとなる場合がある。
$ git config --global http.sslVerify false
$ git clone git@xxx...
$ git config --global http.sslVerify true

# ユーザー名/メールアドレスの設定
$ git config user.name "xxx"
$ git config user.email "xxx@gmail.com"

# 他のワーキングコピーも共通でユーザー名/メールアドレスを設定
$ git config --global user.name "xxx"
$ git config --global user.email "xxx.gmail.com"

# 設定の一覧を表示する
$ git config --global --list

# 現在のリポジトリの設定のみ表示
$ git config --list

# 半角区切りで複数ファイルをインデックスへ追加可能。コミット前の一時保存場所への追加と思えば良い。
$ git add README.md xxx.html

# -Aをつけると、変更を全てインデックスへ追加
$ git add -A

# コミット
$ git commit -m "first commit"

# リモートレポジトリのURL情報を追加。どこへpushするのか指定する。
$ git remote add origin git@git....git

# リモートブランチのURL確認
$ git remote -v
origin https://github.com/xxx

# リモートリポジトリを指定する
$ git remote set-url origin git@xxx.github.com:xxx/xxx.git

# リモートリポジトリのmasterへプッシュ。-uは次回からブランチ名(今回はmaster)を省略可能なオプション。
$ git push -u origin master

# チェックアウト (ローカルへブランチを落とす)
$ git checkout origin release/1.1.2

# 最新のコミットをリモートから取得する
$ git pull origin master

# (コミット前の)ローカルの変更を全て取り消す
$ git checkout .

# (コミット前の)ローカルの変更を一部取り消す
$ git checkout -- /path/to/file
# コミットIDを指定してコミットしたものも含めてローカルの変更を全て取り消す
$ git reset --hard c6c2114

# ブランチを指定してコミットしたものも含めてローカルの変更を全て取り消す
$ git reset --hard origin/master

# ローカルでrevertを使ってpush内容を取り消し、リモートへ反映(resetと異なり、コミットが残る)
$ git revert {commit id}

# ステータスを確認する
$ git status

# コミットログを確認する
$ git log --oneline

# グラフ上に展開
$ git log --graph

# コミットログをコミットメッセージから検索する。
$ git log --grep hoge

# 現在のコミットIDを確認する
$ git show -s --format=%H

# 全てのブランチの一覧 (表示されない場合は、更新する)
$ git branch -a | grep release

# リモートブランチの更新
$ git remote update

# ブランチの作成
$ git branch develop

# 作成ブランチをプッシュ
$ git push origin develop

# developをチェックアウトし
$ git checkout develop

# masterへマージする
$ git merge -m "create develop" master

# ブランチを削除する
$ git branch -d origin/feature/xxx

# ブランチを強制削除する
$ git branch -D origin/feature/xxx

# リモートリポジトリの削除情報をローカルへ反映させる
$ git fetch --prune

# gitignoreが有効になっているファイルを表示する
$ git status --ignored

1つのマシンで複数のGitアカウントを使用する

$ ssh-keygen -t rsa -f ~/.ssh/xxx -C "some comment"

# catした内容をGithubへ貼り付ける。
$ cat .ssh/xxx.pub

configファイルへ以下を追記する。
~/.ssh/config

Host xxx
    User yyy
    HostName github.com
    IdentityFile ~/.ssh/xxx

Gitへ認証させる

$ ssh xxx
The authenticity of host 'github.com (xxx.xx.xxx.xxx)' can't be established.
RSA key fingerprint is SHAxxx:xxx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,xxx.xx.xxx.xxx' (RSA) to the list of known hosts.
Saving password to keychain failed
Identity added: /Users/user/.ssh/xxx ((null))
PTY allocation request failed on channel 0
Hi xxx! You've successfully authenticated, but GitHub does not provide shell access.
Connection to github.com closed.

CloneとRemoteへの追加

$ git clone git@{USER}:{PASSWD}/{REPOSITRY}.git
$ git remote add origin git@{USER}:{PASSWD}/{REPOSITRY}.git

Pushしたコミットをある時点まで完全に取り消したい

$ git log --graph
$ git reset --hard c53hgoehhogoeo53h53hog3l
$ git status
On branch feature/test
Your branch is behind 'origin/feature/test' by 3 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)
nothing to commit, working tree clean

# そのままpushを行ってもエラーとなる
$ git push -u origin feature/test
To https://github.com/org/test.git
 ! [rejected]        feature/test -> feature/test (non-fast-forward)
error: failed to push some refs to 'https://user:pass@github.com/org/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

# オプション "-f" を付与する
$ git push -uf origin feature/test
Total 0 (delta 0), reused 0 (delta 0)
To https://github.com/org/test.git
 + c53hgoehhogoeo53h53hog3l feature/test -> feature/test (forced update)
Branch feature/test set up to track remote branch feature/test from origin.

Rebaseを取り消したい

$ git rebase -i {コミットID}
Successfully rebased and updated refs/heads/feature/feature-xxx.

$ git status
On branch feature/feature-xxx
Your branch and 'origin/feature/feature-xxx' have diverged,
and have 2 and 4 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

$ git reflog
826ab92 HEAD@{0}: rebase -i (finish): returning to refs/heads/feature/feature-xxx
826ab92 HEAD@{1}: rebase -i (pick): xxx -> yyyへ変更
03d8142 HEAD@{2}: rebase -i (pick): yyy
b28cfc2 HEAD@{3}: rebase -i (start): checkout b28cfc2
92db362 HEAD@{4}:
92db362 HEAD@{6}: commit: xxx -> yyyへ変更
58e9522 HEAD@{7}: checkout: moving from develop to feature-xxx

$ git reset --hard HEAD@{6}
HEAD is now at xxxxxxx xxx -> yyyへ変更

$ git reflog
92db362 HEAD@{0}: reset: moving to HEAD@{6}
826ab92 HEAD@{1}: rebase -i (finish): returning to refs/heads/feature/feature-xxx
826ab92 HEAD@{2}: rebase -i (pick): xxx -> yyyへ変更
03d8142 HEAD@{3}: rebase -i (pick): yyy
b28cfc2 HEAD@{4}: rebase -i (start): checkout b28cfc2

Mergeしたcommitを取り消す

$ git branch
* develop
  feature/feature-xxx

$ git revert -m 1 {mergeしたcommit ID}

# 誤ってrevertした場合
$ git reset --hard HEAD~

# 後はcommit, push

.gitignoreが効かない

“.gitignore” は、Remoteを消しつつ、ローカルでファイルを残してコミット対象から無視させる (という理解)。

$ git touch .gitignore
$ vim .gitignore
$ git add .gitignore
$ git commit -m "add gitignore"

# キャッシュを削除する。ローカルのファイルへは影響しない。
$ git rm --cached {FILE_NAME}

# ディレクトリごとキャッシュ削除。
$ git rm -r --cached .

# commit, pushする。
$ git add .
$ git commit -m "remove cache of gitignore"
$ git push -u origin develop

Remoteにファイルを残しつつ、ローカルの変更をコミット対象から無視させる場合は、以下のコマンドを利用する。

$ git update-index --assume-unchanged {FILE_NAME}

# 元に戻す場合
$ git update-index --no-assume-unchanged {FILE_NAME}

# 設定の反映確認
$ git ls-files -v

[Homebrew] ローカルのPHP5.5からPHP7.0へアップグレードする

環境

  • Homebrew 1.1.7
  • php55
  • Server version: Apache/2.4.25 (Unix)

Homebrewのupdate

$ brew doctor
$ brew update
$ brew upgrade

PHP5を消す

$ brew unlink php55
$ brew uninstall php55
# うまく消せない場合
$ brew tap --repair

PHP7のインストール

https://github.com/Homebrew/homebrew-php/blob/master/README.md
GithubのREADMEを参照しつつ、php7をインストール。

# Setup the homebrew/dupes tap which has dependencies we need:
$ brew tap homebrew/dupes

# Setup the homebrew/versions tap which has dependencies we need:
$ brew tap homebrew/versions

# Then, run the following in your command-line:
$ brew tap homebrew/homebrew-php

# Note: For a list of available configuration options run:
$ brew options php70

$ brew install php70 --with-httpd24
Updating Homebrew...
==> Auto-updated Homebrew!
Updated 1 tap (homebrew/core).
==> Updated Formulae
yank

==> Installing php70 from homebrew/php
==> Downloading https://php.net/get/php-7.0.14.tar.bz2/from/this/mirror
==> Downloading from https://secure.php.net/distributions/php-7.0.14.tar.bz2
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/php70/7.0.14_7 --localstatedir=/usr/local/var --sysconfdir=/usr/local/etc/php/7.0 --with-config-file-path=/usr/local/etc/php/7.0 --with-config-file-sc
==> make
==> make install
==> Caveats
To enable PHP in Apache add the following to httpd.conf and restart Apache:
    LoadModule php7_module    /usr/local/opt/php70/libexec/apache2/libphp7.so

    <FilesMatch .php$>
        SetHandler application/x-httpd-php
    </FilesMatch>

Finally, check DirectoryIndex includes index.php
    DirectoryIndex index.php index.html

The php.ini file can be found in:
    /usr/local/etc/php/7.0/php.ini

✩✩✩✩ Extensions ✩✩✩✩

If you are having issues with custom extension compiling, ensure that
you are using the brew version, by placing /usr/local/bin before /usr/sbin in your PATH:

      PATH="/usr/local/bin:$PATH"

PHP70 Extensions will always be compiled against this PHP. Please install them
using --without-homebrew-php to enable compiling against system PHP.

✩✩✩✩ PHP CLI ✩✩✩✩

If you wish to swap the PHP you use on the command line, you should add the following to ~/.bashrc,
~/.zshrc, ~/.profile or your shell's equivalent configuration file:

      export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"

✩✩✩✩ FPM ✩✩✩✩

To launch php-fpm on startup:
    mkdir -p ~/Library/LaunchAgents
    cp /usr/local/opt/php70/homebrew.mxcl.php70.plist ~/Library/LaunchAgents/
    launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.php70.plist

The control script is located at /usr/local/opt/php70/sbin/php70-fpm

OS X 10.8 and newer come with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:

  PATH="/usr/local/sbin:$PATH"

You may also need to edit the plist to use the correct "UserName".

Please note that the plist was called 'homebrew-php.josegonzalez.php70.plist' in old versions
of this formula.

With the release of macOS Sierra the Apache module is now not built by default. If you want to build it on your system
you have to install php with the --with-httpd24 option. See  brew options php70  for more details.

To have launchd start homebrew/php/php70 now and restart at login:
  brew services start homebrew/php/php70
==> Summary
?  /usr/local/Cellar/php70/7.0.14_7: 333 files, 49.9M, built in 5 minutes 51 seconds

httpd.confの設定

--with-http24 を追加することにより、Apache用のPHPモジュール libphp7.so が生成され、
さらにApacheの設定ファイル httpd.conf へ、それを読み込むLoadModuleの記述が下記のように追加される。

// To enable PHP in Apache add the following to httpd.conf and restart Apache:
LoadModule php7_module        /usr/local/Cellar/php70/7.0.14_7/libexec/apache2/libphp7.so
<FilesMatch .php$>
    SetHandler application/x-httpd-php
</FilesMatch>

最後に DirectoryIndexindex.php が含まれているか、確認。

// Finally, check DirectoryIndex includes index.php
DirectoryIndex index.php index.html

環境変数の設定

export PATH="$(brew --prefix homebrew/php/php70)/bin:$PATH"

Apacheリスタート後、PHPのversionを確認する。

$ php -v                                                                                                                                     PHP 7.0.14 (cli) (built: Jan 18 2017 00:18:59) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

OK。

ローカルオレオレ証明書

環境

  • Homebrew 1.1.7
  • Server version: Apache/2. 4.25 (Unix)
  • OpenSSL 1.0.2j 26 Sep 2016

Opensslの環境設定

$ openssl version
$ brew update
$ brew list | grep openssl
$ brew info openssl
$ brew upgrade openssl

OpenSSL のPATHを通す

# OpenSSL
export PATH=/usr/local/Cellar/openssl/1.0.2j/bin:$PATH
$ source ~/.zshrc

秘密鍵の作成

$ openssl genrsa -aes128 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.............................................................................+++
...................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

.csr (証明書情報) の作成

$ openssl req -new -key server.key -sha256 -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Saitama
Locality Name (eg, city) []:Tokorozawa-shi
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Localhost Inc.
Organizational Unit Name (eg, section) []:Localhost Section
Common Name (e.g. server FQDN or YOUR name) []:localhost
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

公開鍵の作成

$ openssl x509 -in server.csr -days 365 -req -signkey server.key -sha256 -out server.crt
Signature ok
subject=/C=JP/ST=Saitama/L=Tokorozawa-shi/O=Localhost Inc./OU=Localhost Section/CN=localhost
Getting Private key
Enter pass phrase for server.key:

鍵の配置

$ mv ./server.key /usr/local/etc/apache2/2.4/
$ mv ./server.crt /usr/local/etc/apache2/2.4/

httpd.conf の設定

httpd-ssl.conf を読み込むようにする。

# Secure (SSL/TLS) connections
Include /usr/local/etc/apache2/2.4/extra/httpd-ssl.conf

mod_ssl.so, mod_socache_shmcb.so をコメントアウトし、有効化。

LoadModule ssl_module libexec/mod_ssl.so
LoadModule socache_shmcb_module libexec/apache2/mod_socache_shmcb.so

httpd-ssl.conf の設定

SSL Virtual Host の設定

<VirtualHost _default_:8443>
# General setup for the virtual host
DocumentRoot "/Users/{User}/Dropbox/Sites"
ServerName example.local:8443
ServerAdmin example@gmail.com
ErrorLog "/usr/local/var/log/apache2/error_log"
TransferLog "/usr/local/var/log/apache2/access_log"

// コメントアウト
SSLCertificateFile "/usr/local/etc/apache2/2.4/server.crt"

// コメントアウト
SSLCertificateKeyFile "/usr/local/etc/apache2/2.4/server.key"

反映確認

$ sudo httpd -k restart
httpd not running, trying to start
Apache/2.4.25 mod_ssl (Pass Phrase Dialog)
Some of your private key files are encrypted for security reasons.
In order to read them you have to provide the pass phrases.

Private key wi.local:8443:0 (/usr/local/etc/apache2/2.4/server.key)
Enter pass phrase:

OK: Pass Phrase Dialog successful.

https://{domain}:8443 へアクセスして確認。