Gitコマンドメモ2 ( branch, checkout, stash )

よく使うGitコマンドメモその2

ブランチの作成、ブランチのチェックアウトなどに関するコマンドについて記載

ブランチの作成

リポジトリ作成後ブランチを指定しない限り、ローカルリポジトリのmasterブランチに対して履歴を追加していくことになるが、CVSやSVN同様に特定のリビジョンからブランチを作成することができる。特にgitの場合、自分専用のローカルリポジトリを持つことによりCVSやSVNよりもブランチの追加・削除を頻繁に行えることで柔軟な履歴管理ができるようになる。

$ git branch [Branche Name] [from]

$ git branch b01 master     masterブランチの先頭にb01を作成する
$ git branch b01 b02        b01ブランチにb02を作成する
$ git branch b03 HEAD       現在のブランチの先頭にb02を作成する
$ git branch b04 HEAD^      現在のブランチの先頭から1つ前の履歴にb04を作成する

リポジトリに存在するブランチリストの表示

アクティブのブランチには*が名称に付与される。-rオプションをつけると関連するリモートブランチを列挙する。-aはすべてのブランチを列挙する。

$ git branch
 master
*b-001
 b-002
$ git branch -r
 origin/b01
 origin/master
$ git branch -a
 master
*b-001
 b-002
 origin/b01
 origin/master

マージ済みブランチの削除

他のブランチにマージ済みのブランチを削除する場合は-dオプションをつける。マージしていないブランチを削除しようとすると、警告が表示されて削除できない安全設計になっている。

$ git branch -d [Branche Name]

ブランチの強制削除

マージする必要がなく、ブランチそのものが不要なった場合は-Dオプションをつけて削除する

$ git branch -d b-001
error: The branch 'b-001' is not fully merged.
If you are sure you want to delete it, run 'git branch -D braranch'.
$ git branch -D b-001
$ git branch -D braranch
Deleted branch b-001 (was 47e3717).

ブランチの切り替え

CVSやSVNと同様git checkoutコマンドで行う。切り替えとは、指定したブランチの先頭にHEADの印をつけるイメージ。今作業している場所が常にHEADになるので、

> git checkout HEAD

は今の位置から移動してないことになる。

  • ブランチの切り替え
$ git checkout [Branch, Tag name]

$ git checkout master   masterブランチの先頭に移動する
$ git checkout b01      b01ブランチの先頭に移動する
$ git checkout HEAD^    現在の位置から一つ前の履歴に`HEAD`を移動する

ファイルの修正内容の破棄 ( svn revert相当 )

gitとsvnでは、revertの意味が違うので注意する。
commitもaddもされていないようなローカル修正を取り消す場合は、git checkoutコマンドで行う。ローカルの修正をすべて破棄して、新たにチェックアウトするようなイメージなる。SVNのrevertと同じ結果になる。gitにもrevertコマンドがあるが意味が異なるので注意する。

$ echo aaaa >> sample.txt ファイルに追記する
$ cat sample.txt
xxxx
aaaa
$ git checkout sample.txt   sample.txtファイルをチェックアウトする
$ cat sample.txt
xxxx                        追記した"aaaa"の記述が消えている

なお、登録されているファイルが変更されて未更新状態だと、他のブランチへ切り替えようとするとエラーになる安全設計になっている

$ git checkout master
$ echo abc>>sample.txt       ファイルの修正
$ git checkout b01           b01へのチェックアウトして移動
error: Your local changes to the following files would be overwritten by checkout
    sample.txt
Please, commit your changes or stash them before you can switch branches.
Aborting

修正を一時退避してブランチを移動する

修正中の内容を破棄することもコミットすることもできない状態で、ブランチの移動を余儀なくされた場合は、git stashコマンドで変更内容を一時退避することができる。

  • 修正内容の一時退避
$ echo xyz>>sample.txt    (sample.txtを修正)
$ git stash save s1     (s1という名前で修正内容を一時退避する)
The file will have its original line endings in your working directory.
Saved working directory and index state On b03: s1
HEAD is now at 1514be5 a4
  • 一時退避リストの表示
$ git stash list
stash@{0}: On b03: s1
  • 一時退避した修正の取り出し
$ cat sample.txt
    abc
     
    $ git stash list
    stash@{0}: On master: s1
    stash@{1}: WIP on b03: 1514be5 s0
    $ git stash pop stash@{0}
    # On branch master
    # 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:   sample.txt
    #
    no changes added to commit (use "git add" and/or "git commit -a")
    Dropped stash@{0} (3631afdf1a9ee46a70af737a68a249e737e97233)
     
    $ cat sample.txt
    abc
    xyz     (一時退避された内容が復元される)