git メモ

用語

■ ワークツリー

 ↓ git add/rm/mv  ↑ git checkout   ↕  git diff

■ ステージング

 ↓ git commit  ↑ git reset HEAD   ↕  git diff --cached

■ ローカルレポジトリ

 ↓ git push  ↑ git fetch  ↕  git diff origin/master (fetch後)

■ リモートレポジトリ


コマンド

直前の comit を取り消し
git reset --soft HEAD^

add を取り消し
git reset HEAD readme.txt

git管理下のものだけを add 更新
git add -u .

ブランチの派生元を最新に付け替える
git rebase

ローカルレポジトリからpullして、ブランチの派生元を最新に付け替える
git pull --rebase origin master

前回のコミットに追加

git commit -m "1st commit"
touch hoge2
git add . 
git commit --amend -m "1st fix"
git reset --hard HEAD^
git diff --cached
alias gitlog='git log --graph --oneline --decorate --all'

git rebase master コンフリクト

git rebase でコンフリクトが起きた場合は、そこでいったん rebase 処理が停止。

競合を解決し、git add してから git rebase --continue を実行。

git rebase --abort コマンドを実行することで、いつでも rebase を途中終了(なかったことに)。


stash

未 commit がある状況で別のブランチに切り替えて作業したい

  • 退避

save は省略可能

git stash save
  • 退避一覧
git stash list

stash@{0}: WIP on sub: a0d2f1b add fourth line
stash@{1}: WIP on sub: 1a61919 add second line
  • 取り出しと同時に stash 削除
git stash pop stash@{0}
  • 取り出し
git stash apply stash@{0}
  • stash 削除
git stash drop <消したいstash名>

変更を一時的に退避!キメろgit stash


git pull と git pull –rebase の違いって?図を交えて説明します!

Git 戻す系の処理を自分の理解の為にまとめてみた

https://try.github.io
LearnGitBranching

いつやるの?Git入門
こわくない Git
Gitのよく使うコマンド

Gitリモートリポジトリの作り方


初期設定

git config --global user.name "[NAME]"
git config --global user.email "[E-MAIL]"
git config --global color.ui true
git config --global alias.co checkout
git config --global alias.st status
git config --global alias.br branch
git config --global alias.ci commit
git config --global push.default upstream
git config -l

PUSHコマンド

  • git push コマンド
git push origin ローカルブランチ:リモートブランチ

デフォルトではローカルブランチと同名のブランチがリモート上にあるならそれらを一気にPUSH。危険

git push
  • (1)ブランチ名を明示的に指定
git push origin br01
  • (2)デフォルトの挙動を"upstreamモード"に変更
git config --global push.default upstream
git push

カレントブランチとリモートブランチの間に「追跡関係」がある場合のみ、カレントブランチのPUSH

  • (3)デフォルトの挙動を"currentモード"に変更(Git1.7.11以降のみ)
git config --global push.default current
git push

カレントブランチのPUSHのみが実行

  • (4)デフォルトの挙動を"simpleモード"に変更(Git1.7.11以降のみ)
git config --global push.default simple
git push

カレントブランチと同名のリモートブランチが存在する場合のみ、カレントブランチのPUSHが実行

@see http://dqn.sakusakutto.jp/2012/10/git_push.html


いろいろ

master を編集してしまった場合

git branch -m branch01

いまの master をリネーム(マスターは消える)

リモートリポジトリが更新されているかどうかを確認

git fetch 後にdiffをとる

git fetch origin
git diff origin/master

gitに対して明示的にパーミッションを教えてあげる

実行権限を付与するとき

git update-index --add --chmod=+x [filename]

実行権限を外すとき

git update-index --add --chmod=-x [filename]

コンソール表示

# show git branch
function parse_git_branch {
 git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/'
}
function precmd() {
 PROMPT="\h@\u:\W\$(parse_git_branch) \$ "
}
function proml {
 PS1="\h@\u:\W\$(parse_git_branch) \$ "
}
proml

デプロイプログラム PHP

deploy.php

<?php

$lockFile = '/tmp/deploy_lock.txt';

// ロック
if (! @symlink(__FILE__, $lockFile)) {
    echo 'Locked: '.$lockFile.PHP_EOL;
    exit(0);
}

$flagFile = '/tmp/deploy_flag.txt';
$flag = file_get_contents($flagFile);
if (empty($flag)) {
    unlink($lockFile); // ロック解除
    exit(0);
}

system('/home/deploy/gitdeploy.sh >/tmp/deploy_log.txt 2>&1');
file_put_contents($flagFile, '');


unlink($lockFile); // ロック解除
exit(0);

gitdeploy.sh

#!/bin/bash

date "+%Y/%m/%d %H:%M:%S"
echo ""
cd /var/www
make pull-master

pre-commit

#!/bin/sh

cd /xxxx
vagrant ssh -c "make --directory /vagrant/xxxx phpunit"

if [ $? -ne 0 ]; then
exit 1
fi

vagrant ssh -c "make --directory /vagrant/xxxx phpcs"

if [ $? -ne 0 ]; then
exit 1
fi
> git branch -a
* master
  remotes/origin/master

チェックアウトしたいブランチが表示されていない時

> git fetch

リモートブランチをチェックアウト

> git checkout -b other_branch origin/other_branch