gitその1

ローカルリポの作成方法

ディレクトリをローカルリポとして新規作成する

git init prj_name

カレントディレクトリに,prj_nameディレクトリが作成される.prj_nameディレクトリに.gitディレクトリが入っている.
これを作成した時点では,まだコミットは作成されない.

既存ディレクトリをローカルリポにする

ローカルリポにしたいディレクトリにて,以下を実行する.

git init

これを作成した時点では,まだコミットは作成されない.
その後,remoteリポを追加する.

git remote add origin http/or/ssh.git

もし,remote origin already existsの場合は,既存のremoteを削除する.

git remote rm origin

その後ローカルでpullする

git pull origin main


リモートリポからローカルリポを作成する

git clone http/or/ssh.git

なお、ほかの人のリモートリポをクローンする場合、それをフォークしてからの方がよい。

ローカルに紐づいたリモートリポの確認

git remote -v

fetch先,push先のurlを確認できる.




基本操作

ブランチの一覧,現在のブランチを確認する

git branch

現在のブランチに*マークがついている.
バージョン,セルによっては,pagerが開く(画面一杯にブランチが開く)場合がある.
これを無効にするには次のようにやる.

git config --global --replace-all core.pager "less -F -X"


ブランチを切る(ワーキングブランチはそのまま)

git branch hoge-branch


ブランチを切る(ワーキングブランチも切り替える)

git checkout -b hoge-branch


ワーキングブランチを切り替える

git checkout hoge-branch


作業状態を確認する

git status


ステージに上げる

git add hoge.txt
git add .
git add -A hoge.txt

ファイルの削除を反映するには,-Aオプションが必要.

コミットする

git commit -m "hoge"


コミット履歴を見る

git log

GitHubでリポジトリを作成した時点で,Initial commitが作成される.
全ブランチの最新コミットがわかる.
originはリモートリポのこと.
HEADは今のブランチみたいなもの.

プルする

ローカル→リモートへ更新する前に,リモートで更新されている分をローカルに反映させる.

git pull remote branch
git pull origin main

今のワーキングブランチに反映される.
remoteは,リモートリポのこと.git remote -v で出力されるものを指定すれば良い.大体originのはず.
branchは,リモートリポのブランチのこと.大体mainのはず.

プッシュする

git push remote branch

remoteは,リモートリポのこと.大体originのはず.
branchは,ローカルのブランチ名を指定する.これと同名のリモートにあるブランチにpushされる.

リモートリポでマージする

基本的にマージはプルリクエストを送って,差分を確認したのちにマージする.

1: プルリクエストを送る

GItHubのページにあるPull requestタブから,New pull requestをクリック.

マージ元→マージ先を選択して,差分を確認して,Create pull requestをクリック.
Titleを入力し,(commentも入力し,)Create pull requestをクリック.

2: マージする

プルリクエストがあると,GitHubのPull requestsタブにその数が表示されているはず.
Pull requestsタブから,マージするプルリクエスト(の名前のところ)をクリックする.
さらにFile changeタブから,差分を確認する.
Conversationタブから,Merge pull requestをクリックする.

リモートのmainにマージ後にローカルでプルする

ローカルのmainブランチに反映させたいので,mainに切り替えてからプルする.

git checkout main
git pull origin main


ブランチの削除

1: ローカルリポのブランチの削除

git branch -d branch

なお,mainにマージしていないブランチは削除できない?(できた?)
強制削除の場合は,-d-D とする.

2: リモートリポのブランチ削除

GitHubのCodeタブから,branchesをクリック.

そこからブランチをゴミ箱マークで削除する.






管理

追跡中のファイル

git ls-files


追跡してないファイル

git clean -n


追跡してないファイルを削除する

git clean -f


追跡しないファイルを指定する

.gitignoreファイルに記載する.
サイズが大きいもの.
パスワード等のもの.
システムが生成するキャッシュファイルなど.
公式がignoreするファイルを言語ごとまとめてる.
https://github.com/github/gitignore

記述の仕方

ワイルドカード:*.txt
ディレクトリ:hoge/
ファイル:hoge.txt

追跡をやめる

git rm --cached hoge_file





ステージから下ろす

git reset HEAD file_name

HEAD: 今いるブランチを指す.
実際は,リポジトリにある内容を,ステージに上書きしている.




編集を破棄する

git checkout -- file_name

--:以降はファイルを示す.
コミット時点まで戻されるので注意.
実際は,ステージにある内容を,ワーキングディレクトリに上書きしている.





ファイル名を変更する

git mv ho.txt ge.txt

ファイル名変更の情報がステージに上がる.
なお,gitを介さずにディレクトリ名を変更すると,削除+追加の処理になる.
削除+追加を同時にステージに上げると,ファイル名変更の情報になる.



ファイルを削除する


git rm hoge.txt

追跡してないファイルは削除できない.
ステージ上のファイルは削除できない.
gitを介さずにファイルを削除すると,次のように-Aオプションをつけて 削除の情報をステージに上げる必要がある.

git add -A rmoved.txt





履歴を表示する

一覧で表示する

git log


線で結ぶ

git log --graph


1行で表示する

git log --oneline


特定のファイルの履歴を表示する

git log -- hoge.txt
git log --follow hoge.txt

ファイル名変更前も辿るには,--follow をつける.

特定のコミットの詳細を表示する

git show commit_id

commit_id: コミットID.すべての文字列でなくて,先頭の一部でも良い.一意となれば良い?

他のブランチの情報も表示する

git log --all






ブランチ詳細

ブランチは,コミットのポインタ.
そのコミットに親コミットの情報が入っているので,コミットの一連のように見える.

ブランチ一覧表示

git branch
git branch -a

リモートリポのブランチを表示するには,-aをつける.

ブランチ名変更

git branch -m before_branch after_branch


ブランチ削除

git branch -d branch_name






コミット

ドキュメント

最新のコミットのメッセージ修正

git commit --amend -m "<re_masseage>"


前のコミットに戻す

リセットについての解説公式ページ

前のコミットを消すコミットを作る: Revert

git revert <commitID>
git revert HEAD

リモートリポでrevertすることも可能

前のコミットを削除する: Reset

git reset <commitID>

Revert推奨.機密情報等,履歴に残したくない場合のみ使用.
削除するコミットを元に開発が進められていると汗.

1.resetすることで,HEADが指定したcommitIDを指すようになる.
--soft
指定したコミット以降のreset時の変更とかはそのまま残る.

2.さらに,HEADが指定してたコミットの内容をステージに移動(デフォ)
--mixed
reset時にステージにあったものは,作業ディレクトリにコピー.
ただし,作業ディレクトリに変更ある場合は最新の変更が残る.

3.さらに,作業ディレクトリにもステージのものをコピー.
--hard
指定したコミット以降の変更等は全て消えるので注意.






マージ詳細

別のブランチをカレントブランチにマージする

git merge other_branch


マージの種類

早送りマージ(fast-forward)

ブランチAからブランチBを分岐させて、ブランチBを変更する。
ブランチAの変更がなくて、ブランチB→ブランチAにマージするとき、ブランチAの指すコミットを移動するだけでマージできる。
これを早送りマージ、fast-forwardマージという。
なお、別でマージコミットを作成するnon fast-forwardマージにすることもオプションにより可能(説明略)。

自動マージ(automatic)

ブランチA、ブランチBに共通の変更がないときは、別のマージコミットが作成される。

コンフリクト(conflict)

ブランチA、ブランチBに共通の変更がある場合、マージされない。何らかの処理が必要になる。
マージできなかったものは、git statusのUnmerged pathsに追加される。
このあと、コンフリクトを解消して、コミットをする。


p4merge(diffのと同じ)等のソフトがある.
設定は略.






Rebase

分岐してる場合,一方を他方の後ろにつけて(新コミットIDが振られる)ブランチを一本化し,他方を削除.
→マージしやすくする.ゆくゆくのマージ先であるmasterを,branchにrebaseして,branchをmasterにマージしやすくする.

(branchにいる状態で) git rebase master


コンフリクトの場合,エラーが出る.コンフリクトを直したのち,

git rebase --continue

(コンフリクトならマージすればいいと思う)

削除するため,リモートリポでそれを使われていたら最悪.
→push済みはrebaseするな.自分のローカルのやつのみにしとく.


pullする際のmergeをrebaseにすることも可能.
commitが綺麗になるくらい.個人でならいらないかも.


Stash

Workingディレクトリ,ステージにあるものを一度とっておく.
 

stashに移す

git stash

メッセージつける場合

git stash save "<message>"


untrackのファイルも移す場合

git stash -u


untrack, gitignoreしているファイルも移す場合

git status -a



stashの内容確認

git stash list


特定のstashの内容確認

git stash show stash@{<N>}

git stash listで,インデックスが参照できる.
untrackは内容見れない.



stashを元に戻す

最新のもの

git stash pop

以下の戻すと削除の組み合わせ

特定のもの

git stash apply stash@{<N>}



stashからコピー

git stash apply

stashからコピーされるだけなので,stashには残ってる.
stashしたファイルを変更すると,コンフリクトが生じる.


stashを一つ削除

git stash drop

特定のstashのみ

git stash drop@{<N>}






別の人のリモートリポを自分のリモートリポにコピーする(フォーク)

相手のGitHubにあるFolkボタンをクリックする.
ローカルにクローンするときは,この自分のリモートリポにフォークしたものをクローンする.



コミットにtag

tag使い方
ドキュメント
idだとわかりづらい.
タグごとでソースファイルをインストールしたりも可能になる.

注釈付きタグと軽量版タグの2種類.
基本は注釈付きみたい.

最新のコミットにタグ付

軽量版

git tag <tagname>

注釈付き

git -a tag <tagname>


過去のコミットにタグ付

軽量版

git tag <tagname> <commitID>

注釈付き

git -a tag <tagname> <commitID>

上書きは不可.-fで強制.

tagを別のコミットに付け直す

git tag -a -f <re-tag>

-aは注釈付き.
-fは強制.
同じ名前のタグはつけられない.d

タグ削除

git tag --delete <tagname>
git tag -d


タグをpushする

git pushしてもタグ情報はpushされない.

git push <remote_ref> <tagname>
git push origin v1.0

全てのタグをpushする

git push <remote_ref> --tags

pushしたタグを削除(非公開)

git push <remote_ref> :<tagname>


タグの状態をfetch

git fetch --tags --all


タグ一覧

git tag --list
git tag -l
git tag -l "v1.8.5*"

ソートとかもできるみたい.

diff

git diff <前tagname> <後tagname>

何かソフト入ってる場合

git difftool <前tagname> <後tagname>


あるタグのブランチを作る

git checkout -b <branchname> <tagname>


あるタグと同じ状態にする

git checkout tags/<tagname>








Github flow: 開発のワークフロー

git-flowというモデルを簡略化したもの

ローカルでマージはあんまりしない

README.md

そのプロジェクトが行うこと.
なぜこれを使うべきなのか.
どうやって使うのか,インストールなど.
詳細情報はどこで得られるのか.
誰が作って管理してるのか.





chromeのエクステンション

ファイルのツリー構造を見やすく.

Octotree
リモートリポのみ

issueをカンバン(アジャイル開発)として管理

ZenHub