83626


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

[code]

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

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


CC BY-SA 4.0
2021-11-14T17:47:01.870
83621
2021-11-15T14:30:21.880
2021-11-14T18:20:07.290
7300
7300
question
git
git branch --copyとcheckoutの違いはありますか？


ちょっとやってみました。同じものです。  
絶対にそうだと確認して、何らかのプログラムに使いたい場合はだめですけど  
ちょっと知りたい程度ならやってみて確認でよいのでは。

前者が欲しければ、一次情報あたるしかないですしね。。

以下の確認結果では、★1と★2の値が同じで、copyもbranchも同じコミットをポイントしています。

[code]

    <workdir>>git commit -m "2st"
    [master 076b1b6] 2st
     1 file changed, 1 insertion(+)
    
    <workdir>>git checkout -b branch
    Switched to a new branch 'branch'
    
    <workdir>>git log
    commit 076b1b61511a85612e7b4f7e29c849ea5657a7f6 (HEAD -> branch, master)
    ★1
    
    Author: Some User <xxxxx@yyyyy>
    Date:   Mon Nov 15 07:15:10 2021 +0900
        2st
    
    ...
    
    <workdir>>git checkout master
    Switched to branch 'master'
    
    <workdir>>git branch --copy branch copy
    
    <workdir>>git checkout copy
    Switched to branch 'copy'
    
    <workdir>>git log
    commit 076b1b61511a85612e7b4f7e29c849ea5657a7f6 (HEAD -> copy, master, branch)
    ★2
    Author: Some User <xxxxx@yyyyy>
    Date:   Mon Nov 15 07:15:10 2021 +0900
    
        2st
    
    ....
    
[/code]


CC BY-SA 4.0
2021-11-14T22:28:39.707
83623
2021-11-15T01:26:25.463
2021-11-15T01:26:25.463
3060
10174
83621
answer


`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` など)


CC BY-SA 4.0
2021-11-15T02:23:28.777
83626
2021-11-15T14:30:21.880
2021-11-15T14:30:21.880
2808
2808
83621
answer