git stash
機能
変更内容を一時的に退避させておく機能
使いどころ
- branchを切って作業中に他のブランチを修正するように言われた時
- branch切るのを忘れてmasterで変更してしまった内容を他のbranchに移動させたいとき
コマンド
stashする
$git stash {save}
※saveは省略可能
メッセージを付けてstash
git stash save "message"
addしてない変更のみをstash
$git stash -k
stashした内容を確認する
$git stash list
stash@{0}: WIP on shash_test: af31ecc Create README.md
<stash名>: WIP on <stashを行ったブランチ名>: <ハッシュ> <コミットコメント>
※ハッシュ、コミットコメントはstashを行った時のHEADのもの
####変更内容を確認
$ git stash list -p
diff --git a/README.md b/README.md
index 1e523a5..12419f4 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,3 @@
# git_test
+
+stash_test
\ No newline at end of file
####stashしたファイルの一覧を表示
$ git stash show <stash名>
stashした内容を適用する(stashも同時に削除)
git stash pop # 最新のスタッシュを適用し、削除
git stash pop {N} # N番目のスタッシュを適用し、削除
戻した時にコンフリクトが起きるとか、別なブランチにも適用したいとかなるとめんどそうなのでpopじゃなくてapply→dropで削除するほうが良いと思う。
stashした内容を適用する(stashは残る)
git stash apply # 最新のスタッシュを適用し、残す
git stash apply {N} # N番目のスタッシュを適用し、残す
上記コマンドだと、stash前にaddしていた変更もaddされていない状態に戻る(staged → not staged)
下記のようにオプションをつけて戻すことでaddされた状態で戻せる
git stash apply {0} --index
stashを削除(特定のstash)
git stash drop # 最新のスタッシュを削除
git stash drop {N} # N番目のスタッシュを削除
###stashを削除(全て)
git stash clear
git merge
使いどころ
- masterから切り出した作業ブランチでのcommit,pushが終わった後にコンフリクトが発生してる場合
- 作業ブランチでの作業中に他のブランチのコミット履歴を取り込みたい時
手順
最新の状態のmasterをmergeしたいのでmasterブランチを最新化
git checkout master
git pull
作業ブランチに戻る
git checkout <topicブランチ>
mergeする
git merge master
コンフリクトが発生したら解消した上でaddしてmergeを続行する
git add <修正したファイル>
git merge --continue
mergeが完了したらcommitしてpush
git rebase
使いどころ
-
作業ブランチをcommit,pushした後にmasterのコミット履歴を取り込んだ上でそのコミット履歴の後ろに作業ブランチのコミット履歴をくっつけたい時
-
rebaseだとgitのpullリク画面のコミット履歴が綺麗だから自分はよくこっちを使う
手順
最新の状態のmasterをrebaseしたいのでmasterブランチを最新化
git checkout master
git pull
作業ブランチに戻る
git checkout <topicブランチ>
rebaseする
git rebase master
コンフリクトが発生したら解消した上でaddしてrebaseを続行する
git add <修正したファイル>
git rebase --continue
完了したらpushしたいところだが、いつも通りpushしてもできないのでオプションをつけて強制的にpushする
git push -f origin <topicブランチ>
コミット履歴を確認してmasterブランチの履歴→作業ブランチの履歴の順になっているか確認してみる
git log
注意点
複数人が同時に一つの作業ブランチにpushしてる場合、一人がrebaseした後に他の人がpushしようとしてもできないらしいので注意。
Revert/Reset
コミットを元に戻したい時に
Revert
取り消したいコミットを打ち消すようなコミットを新しく作成する。
既存のコミット内容は残ったまま。
特定のコミットを元に戻す。(指定以降の処理全てを戻す場合はreset)
コマンド
revert
revertする(コミットメッセージ編集)
$git revert <commitID>
コミットメッセージを編集しない場合
コミットしないrevert
revertコマンドを使用するとコミットも行う。
indexに戻すだけなら次のコマンド
$git revert <commit> -n
or
$git revert <commit> --no-commit
数個分のcommitをrevertしてcommitしてpush!!
マージコミットのrevert
マージコミットを戻す場合、マージした2つのコミット(親)のうちどちらに戻すかを指定する。
-m
オプションをつけて親を数字で指定(基本的に1か2)
$git show
commit ae2cc52245ccd67e0798acdc6afcd46756643ea1 (HEAD -> K, origin/K)
Merge: de1d774 a8b5b8f ←左から1,2
$git revert -m 1 <commitID>
Reset
コミットした内容を取り消す
コマンド
指定ファイルをステージングから削除
$git reset <file>
全てのファイルをステージングから削除
$git reset
現在のブランチを指定コミットに戻す
$git reset <commitID>
コミットのみ取り消す
$git reset --soft <commitID>
// 直前のコミットを取り消す場合
git reset --soft HEAD^
コミット内容も全て取り消す
コミット内容、ステージングエリアへの移動も取り消す
$git reset --hard <commitID>
// 直前のコミットを取り消す場合
$git reset --hard HEAD^
間違ってresetして事故った時"reflog"
間違ってresetしちゃった時に元に戻す方法
// reflogで過去のコミット履歴を見れる
$git reflog
de1d774 (HEAD -> L) HEAD@{0}: reset: moving to HEAD@{18}
af31ecc HEAD@{1}: reset: moving to HEAD@{0}
af31ecc HEAD@{2}: reset: moving to HEAD^
eb5bff0 HEAD@{3}: reset: moving to HEAD^
5f19704 HEAD@{4}: reset: moving to HEAD^
6df3f5d HEAD@{5}: reset: moving to HEAD^
af3c6bb (origin/test2) HEAD@{6}: reset: moving to HEAD^
cce35a4 HEAD@{7}: reset: moving to HEAD^
c5b101f HEAD@{8}: reset: moving to HEAD^
3b36f82 HEAD@{9}: reset: moving to HEAD^
5c91984 HEAD@{10}: reset: moving to HEAD^
67c1344 HEAD@{11}: reset: moving to HEAD^
11b1153 HEAD@{12}: reset: moving to HEAD^
15ba5c9 HEAD@{13}: reset: moving to HEAD^ // ←ここらへんからresetしまくってる
// 15ba5c9のコミット時点に戻りたい場合
$git reset --soft HEAD@{13}
reflog、正しくは"参照"した履歴を見れる。
ブランチ移動・削除・名前変更、stash、mergeとかとか。
他のコマンド
変更を元に戻す
//1つのファイル
git checkout {ファイル名}
//全ファイル
git checkout .
差分表示
git diff
不要なブランチ削除
git branch -D {ブランチ名}