Git リポジトリでの作業中に他の作業を進めたいときの対応
Git リポジトリでの作業中に他の作業を進めたいときの対応
git stash
をよく使っているので簡単にまとめます。
git stash を使いたくなるとき
作業中に他の作業をやらないといけないことが発生したときです。
- 作業中に、他のタスクに対応しないといけなくなったとき
- 作業中に、レビューをしないといけなくなったとき
- 別ブランチに
commit
前の変更を移したいとき
git stash とは
一時的に変更を退避させるもの。
こんな感じで使ってます
いったん作業を退避させたい時
# 変更中(commit はまだしてない)
# - いったん別の作業したい!
$ git stash save -u xx変更途中
# 別の作業
# - xx変更途中の作業に戻りたい!
$ git stash list
...
stash@{xx}: On branch-name: xx変更途中
...
# xx変更途中を適用する
$ git stash pop xx
実装に迷っている時
# 変更中(commit はまだしてない)
# - この実装あんまりよくないので最初から実装したいが、この作業は残しておきたい!
$ git stash save -u 納得してない実装
# はじめから作業
# - 良い実装ができた!
$ git add .
$ git commit -m '良い実装'
# stash してた 納得してない実装 を削除しておこう
# - stash を一覧で表示
$ git stash list
stash@{0}: On branch-name: 納得してない実装
...
# 削除
$ git stash drop
# or
$ git stash drop 0
別ブランチで作業をはじめてしまった時
# 変更中(commit はまだしてない)
# - masterブランチで作業しちゃってた、、
$ git stash save -u git-stashブランチで作業したかった
# ブランチ切り替え
$ git checkout -b git-stash
# 途中の作業を適用させたい
$ git stash list
stash@{0}: On master: git-stashブランチで作業したかった
...
# git-stashブランチで作業したかったのブランチに適用する
$ git stash pop
# or
$ git stash pop 0
git stash の使い方(詳細)
あるファイルの変更中、
$ git diff
diff --git a/src/pages/about.md b/src/pages/about.md
index 00ed8d6..8d59a06 100644
--- a/src/pages/about.md
+++ b/src/pages/about.md
@@ -7,3 +7,5 @@ permalink: /about
# About
エンジニア
+
+テスト
一旦この変更を退避しておいて、別の作業をしたくなった場合、
$ git stash save
Saved working directory and index state WIP on blog/2019-02-02: 8d5e7e6 rb -> ruby
# git stash でも同じです。
$ git stash
Saved working directory and index state WIP on blog/2019-02-02: 8d5e7e6 rb -> ruby
上記のようにすると、退避されます。
$ git diff
stash
を確認します。
$ git stash list
stash@{0}: WIP on blog/2019-02-02: 8d5e7e6 rb -> ruby
stash
した変更ファイルを確認します。
$ git stash show
src/pages/about.md | 2 ++
1 file changed, 2 insertions(+)
stash
した変更を適用する場合。
$ git stash pop
On branch blog/2019-02-02
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: src/pages/about.md
Untracked files:
(use "git add <file>..." to include in what will be committed)
src/_posts/2019/02/02/
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (9dcbbfbfb3a3e29134614c679befcb226d1bdfe9)
名前をつけて stash
する。
$ git stash save テスト
Saved working directory and index state On blog/2019-02-02: テスト
他の stash
も追加した場合。
$ git stash list
stash@{0}: On blog/2019-02-02: テスト2回目
stash@{1}: On blog/2019-02-02: テスト
stash
していた テスト (stash@{1}: On blog/2019-02-02: テスト)
の変更を適用させたい場合。
$ git stash pop 1
テスト2回目 (stash@{0}: On blog/2019-02-02: テスト2回目)
を削除したい場合。
$ git stash list
stash@{0}: On blog/2019-02-02: テスト2回目
$ git stash drop 0
Dropped refs/stash@{0} (4ce8fb30e02018a1fafac6d3feb9141358729bdc)
git stash save -u
Untracked files
も stash
したい場合。
$ git stash save -u
Saved working directory and index state WIP on blog/2019-02-02: 8d5e7e6 rb -> ruby
Untracked files
も名前をつけて stash
する場合。
$ git stash save -u テスト
Saved working directory and index state On blog/2019-02-02: テスト
その他
変更がない時に stash
しようとすると
$ git stash save
No local changes to save
以下 3 つはすべて同じです。
どの stash
か指定しない場合は、最新のものが適用されます。
$ git stash pop
$ git stash drop
$ git stash show
$ git stash pop 0
$ git stash drop 0
$ git stash show 0
$ git stash pop stash@{0}
$ git stash drop stash@{0}
$ git stash show stash@{0}