Git Memo

# ツール
- Source Tree
- GitHub
- Bitbucket

# 用語
|用語|意味|
|:---------|:--------|
|fork| レポジトリを複製して自分のレポジトリとして活用する|
|commit ||
|push |ローカルレポジトリから変更をリモートレポジトリに反映すること|
|pull |リモートレポジトリから変更をローカルレポジトリに反映すること(= fetch + merge)|
|pull request||
|fetch|リモートレポジトリの最新の情報を取得すること|
|merge|ローカルを|
|origin|リモートレポジトリのURL(.git/configで定義)|
|tag|安定版リリースなど、目印をつける際に使う|
|stash|中途半端な状態の作業で一時的に作業状態を保管して他の作業に移る際に利用|
|HEAD|作業対象のポインタ|
|revert|特定のcommitを打ち消す作業を新しいcommitとして実施|
|reset|branchを過去時点に巻き戻す、pullにより上書きされてしまう|

# 運用Tips
- 中央レポジトリが常に正である状態を保つ
- Commitは１作業ごとに
- Commit Messageは１行目 "Commit Title", 2行目 "空行", 3行目以降  "目的や変更詳細"とする
- 他開発者とのConflict回避のため、commitしたらpushする運用が好ましい
- 作業開始/完了時(push前)で必ずpullを実行する
- 作業完了時は、add->commit->pull->pushの順
- commit/stashせずにbranchを切り替えると、変更が移動先のbranchに移ってしまう

# .gitignoreの書式
|書式|意味|
|:---------|:--------|
|#| コメント|
|!file |file以外|
|test.txt|指定したファイルを除外|
|/test.txt|root dir(.gitのディレクトリ)配下のtest.txtを除外|
|testdir/|testdirディレクトリ配下すべてを除外|
|*.txt|拡張子が.txtのファイルを除外|

# 共同作業のための環境準備
1. 中央レポジトリの作成
2. 中央レポジトリをクローンしてローカルレポジトリを作成
3. 基本データをローカルレポジトリ管理下に起き、初回コミット
4. ローカルレポジトリを中央レポジトリにプッシュ

# 基本のbranch運用
- masterを幹としてブランチを作成する場合は、masterをもとに咲く壊死する
- branch作業が完了した場合、もととなるbranchに統合させる。

# 初期設定(GitHub登録まで)
```sh:初期設定(GitHub鍵登録まで)
git config --global user.name "Name"
git config --global user.mail "Mail"
git config --global color.ui auto
*~/.gitconfigに追記される

ssh-keygen -t rsa -C "Mail"
*Public KeyをGitHubに登録

ssh -T git@github.com
*接続できることを確認
``` 
# GitHubレポジトリ作成 ~ Initial Commitまで
```sh:InitialCommitまで
* GitHubに中央レポジトリを作成する
# Localレポジトリへのコピー
cd ${OP_DIR}
git clone git@github.com:hockeykozo/Hello-World.git

# Commit Test
cd Hello-World
touch hello-world.php

git add hello-world.php
git commit (-m Brief Comment)
*add Comments with Editor
git status

git push origin master
git log --graph --oneline --decorate=full
```

# よく使うコマンド
|用語|意味|
|:---------|:--------|
|git init|Repositoryの初期化|
|git add ${file}|Commit対象に追加|
|git reset HEAD ${file}|Commit対象から除外|
|git commit (-m)|Commit|
|git status|gitの状態確認|
|git log|Commit log|
|git log --pretty=short|Commit log、簡単なコメントと一緒に|
|git log ${file}|fileのcommitログ|
|git log -p|Commit間の差分を含んだlog表示|
|git log --graph --oneline --decorate=full|git logをtree状に表示|
|git diff HEAD|現状と最新のcommitの差分|
|git branch|ブランチ名、現状のブランチ確認|
|git branch -d ${branch}|branchの削除|
|git checkout ${branch_name}|branch切り替え|
|git checkout -b ${branch_name}|branchを作成してcheckout|
|git merge --no-ff ${feature_branch}|merge commitを残してmerge|
|git reset --hard ${commit_id}||
|git reflog||
|git commit --amend|直前のcommitのコメントを編集する|
|git rebase -i HEAD-2|最新2つのcommitを対象に各種操作、commitの統合など。pushされているbranchをrebaseすると、pushできなくなる。|
|git remote add origin git@github.com:${user_name}/${repository}|githubをoriginとして登録|
|git push -u origin master||
|git clone||
|git branch -a|Remoteも含めたRepositoryの表示
|git pull origin ${branch}|最新のリモートレポジトリを取得|
|git revert ${commit}|commitを打ち消すcommitを実施|
|git reset --hard ${commit}|commit時点まで巻き戻す|
|git reset HEAD sample.txt|addから対象のファイルを除く|
|git branch -m ${OLD_BRANCH} ${NEW_BRANCH|ブランチ名の変更|
|git clone -b ${BRANCH_NAME} ${REPOSITORY}|ブランチ名を指定してclone|

```


``` $ git branch ```
``` $ git checkout master ```
``` $ git add filename ```
``` $ git commit -m "comment" ```
``` $ git remote add origin https://ユーザ名@github.com/ユーザ名/レポジトリ名.git ```
``` $ git push origin master ```

# Git通常の流れ
``` $ git branch ```
``` $ git checkout master ```
``` $ git add filename ```
``` $ git status ```
``` $ git commit -ma "comment" ```
``` $ git push origin master ```

# Git branch切り替え
``` $ git branch new_branch```
``` $ git status ```
``` $ git checkout new_branch ```

# Git branchのMerge
``` $ git rebase master```
``` $ git checkout master```
``` $ git merge other_branch```

# Gitのレポジトリから削除して、ローカルに残す
```$ git rm --cached test.txt（削除したいファイル名）```
```$ git add -u```
```$ git commit -m "deleted test.txt"```
```$ git push origin master```
```$ vim .gitignore
test.txt```

# Gitのリモートブランチとの差分を確認
```$ git fetch```
```$ git svn fetch ```
```$ git branch -a```
```$ git diff remotes/origin/master```

# Git branchの削除
```$ git branch -d <branchname> ```

# ファイルを誤って削除してした場合からの復旧
```$ git checkout -f```

# コミット履歴の確認
```$ git log```
```git log --graph --oneline --decorate=full```

# commit間の差分確認
```git diff --diff-filter=ACM 30c2424a6830cf1d301a746c25ff9b96ec1f5796 HEAD```