Branch

ブランチとは?

ブランチとは平行世界のようなものである。 ブランチを活用することでmasterブランチをそのまま据え置いた状態で、別のブランチで新機能を試しながら作ることができる。

ブランチの正体は?

github公式ドキュメントによると、

ブランチとは(中略)コミットを指す軽量なポインタに過ぎません と説明されている。

リポジトリの正体は.gitという隠しフォルダのことであり、この中にあるrefs/heads/masterファイルこそがブランチの正体である。 このファイルの中身をcatしてみると

dd95ddf066d452949bb54304bbf43ab3dadfee25

のように英数字の羅列が保存してある。これはコミットIDまたはコミットハッシュ値と呼ばれている。またコミットによって生成されたデータのことをコミットオブジェクトといい、一つのコミットオブジェクトに対して40文字のIDを割り当てるのがコミットIDである。

つまりブランチとはただ単に特定のコミットIDを指しているだけである。

またコミットオブジェクトにはそれぞれ

  • tree
  • parent
  • author
  • committer

の情報が保存されており、parentが一つ前のコミットIDを示している。

作成したsample.txtに何かしらの変更を加え、

$ git add sample.text
$ git commit -m "2回目のコミット"
$ git log

とすると、次のような結果が得られる。

コミットしたときのログ

このとき以下のように実行すると、コミットオブジェクトを確認することができる

$ git cat-file -p 0e9556

tree e290b48b356d721ae54d1edb03993802cc98bad8

parent 02f11b759bfeb461e117c5da18bb2dcbe06d862a

author llminatolllXXX@mail.coml1562052826 +0900

commit errllminatolllXXX@mail.coml1562052826 +0900

このparentの部分が前のコミットのコミットIDを表しており、一番はじめのコミットではpaerntは保存されていない

ひとことメモ ** コミットIDは何を元に作られているの?**

コミットID(コミットハッシュ値)は、実はこのコミットオブジェクトのバイト数と中身を使い、計算されて作られています。よって、コミットした人の名前やコミットした時間、指し示すparent、treeが違えばコミットハッシュ値も違うものになります。

その証拠に、同じ内容をコミットしていても、あなたの練習用リポジトリとわかばちゃんのコミットIDは違うはずです。コミットハッシュ値についてもっと深く知りたい方は、こちらの記事が詳しいのでおすすめです。

ブランチの操作

  • 今存在するブランチの確認

    $ git branch
    

    アスタリスクのついているブランチが現在のブランチ

  • ブランチの作成

    $ git branch <branch name>
    
  • ローカルブランチの作成をリモートにプッシュ

    $ git push origin <branch name>
    
  • ブランチの移動

    $ git checkout <branch name>
    

    ※指定したブランチへ移動する

    • -bオプションを指定するとブランチの作成とチェックアウトを同時に行える
    • -fオプションを指定するとブランチを強制的に切り替えることができる(コミットしていない作業データは消えるため注意)
  • リモートブランチの反映

    $ git fetch origin
    
  • ブランチの削除

    $ git branch -d <branch name> # ローカルブランチの削除(強制削除する場合は`-D`オプションに変更)
    $ git push origin --delete <branch name> # リモートブランチの削除(`$ git push origin :<branch name>` でも可)
    
  • remote には存在するブランチが local には存在しない場合

    $ git brantch -a 
    

    でブランチを表示

    $ git checkout -b release origin/release
    

    で解決できる!

  • ブランチのマージ:devブランチにmainブランチの内容をマージ(取り込む)

    ただしマージしただけではリモートリポジトリに反映されないので、その後pushする必要あり

    $ git checkout dev
    $ git fetch
    $ git merge origin/main
    
    • コンフリクトした場合に強制的にマージする際は、フェッチした後に$ git reset --hard origin/main
  • logの確認

    $ git log
    
    • option:
      • –graph: グラフ形式で表示
      • –decorate=“short”: ブランチ名の表示形式を変更 # select “short”, “full”, or “no”
      • –date=“relative”: 日時表示 # select “relative”, “local”, “default”, “iso”, “rfc”, “short”, or “raw”
  • shtash: 変更内容を隠す

    $ git stash
    $ git stash save "comment"    # コメント付きでstash
    $ git stash list              # stashした内容の一覧を表示
    $ git stash apply             # stashした内容を再度適用(stashした内容は保持)
    $ git stash pop               # stashした内容を再度適用(stashした内容は削除)
    $ git stash drop stash@{1}    # stashした内容を削除
    $ git stash clear             # stashした内容を全て削除
    

参考