git branch --copyとcheckoutの違いはありますか？


現在のブランチがb1として、下記コマンド2つに違いはありますか？

[code]

    git branch --copy b1 b2
    git checkout -b b2
    
[/code]

前者はどこのブランチからでも行える、後者は移動を伴うというのはわかるのですが、上記b2は同じものだと考えて間違いないでしょうか？




`b1` が **非**[追跡ブランチ(tracking branch)](https://git-
scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81#r_tracking_branches)の名前だとすると、質問文中に書かれている理解でも概ね問題ないかと思います。  
ですが、一般的な話で言うと違います。

細かいものも含めて誤解を指摘すると:

  * `git checkout -b ...` を意味的に分解すると、 `HEAD` の操作(`git checkout`) のついでにローカルブランチ作成する(`-b`)、ということなので、 _" 移動"_ は付随的なものでなく主目的です。
  * `git checkout -b b2 b1` と指定することもできるので、`git checkout` も _" どこのブランチからでも行え"_ ると言えるでしょう。
  * `-b` オプションに相当するのは `git branch b2 b1` です。(`--copy` オプションはつかない; コピーでなく新規作成) 
    * `--copy` はブランチの設定もコピーされます。[ユースケース](https://github.com/git/git/commit/52d59cc6452ed1aeec91f4c168a853ea8d9d5496): 

> This is useful for e.g. copying a topic branch to a new version,  
>  e.g. work to work-2 after submitting the work topic to the list, while  
>  **preserving all the tracking info and other configuration that goes  
>  with the branch**, and unlike --move keeping the other already-submitted  
>  branch around for reference.

要は、

[code]

    git branch b2 b1
    git checkout b2
    
[/code]

を1つのコマンドにまとめたのが

[code]

    git checkout -b b2 b1
    
[/code]

です。

ちなみに、

[code]

    git switch -c b2 b1
    
[/code]

も同じ動作です。

参考:

  * [`git-checkout`](https://git-scm.com/docs/git-checkout)
  * [`git-branch`](https://git-scm.com/docs/git-branch)
  * [`git-config`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-branchltnamegtmerge)(`branch.<name>.merge` など)




`b1` が **非**[追跡ブランチ(tracking branch)](https://git-
scm.com/book/ja/v2/Git-%E3%81%AE%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81%E6%A9%9F%E8%83%BD-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%96%E3%83%A9%E3%83%B3%E3%83%81#r_tracking_branches)の名前だとすると、質問文中に書かれている理解でも概ね問題ないかと思います。  
ですが、一般的な話で言うと違います。

細かいものも含めて誤解を指摘すると:

  * `git checkout -b ...` を意味的に分解すると、 `HEAD` の操作(`git checkout`) のついでにローカルブランチ作成する(`-b`)、ということなので、 _" 移動"_ は付随的なものでなく主目的です。
  * `git checkout -b b2 b1` と指定することもできるので、`git checkout` も _" どこのブランチからでも行え"_ ると言えるでしょう。
  * `-b` オプションに相当するのは `git branch b2 b1` です。(`--copy` オプションはつかない; コピーでなく新規作成) 
    * `--copy` はブランチの設定もコピーされます。[ユースケース](https://github.com/git/git/commit/52d59cc6452ed1aeec91f4c168a853ea8d9d5496): 

> This is useful for e.g. copying a topic branch to a new version,  
>  e.g. work to work-2 after submitting the work topic to the list, while  
>  **preserving all the tracking info and other configuration that goes  
>  with the branch**, and unlike --move keeping the other already-submitted  
>  branch around for reference.

要は、

[code]

    git branch b2 b1
    git checkout b2
    
[/code]

を1つのコマンドにまとめたのが

[code]

    git checkout -b b2 b1
    
[/code]

です。

ちなみに、

[code]

    git switch -c b2 b1
    
[/code]

も同じ動作です。

参考:

  * [`git-checkout`](https://git-scm.com/docs/git-checkout)
  * [`git-branch`](https://git-scm.com/docs/git-branch)
  * [`git-config`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-branchltnamegtmerge)(`branch.<name>.merge` など)

