93177


下記のgit pushコマンドについて質問です。

1のコマンドではリモートリポジトリのdevブランチに、現在のHEADをプッシュすると考えているのですが、2の場合は何が違うのでしょうか？

  1. `git push origin dev`
  2. `git push origin origin/dev`


CC BY-SA 4.0
2022-12-31T08:18:25.643
93121
2023-01-04T06:00:57.197
2022-12-31T10:21:52.123
19110
46713
question
git
git push するとき、dev と origin/dev は何が違うのでしょうか？


"origin/dev" ブランチは、"origin" というリモートの "dev" というブランチに対する「リモート追跡ブランチ」です。これに対して
"dev" ブランチはローカルのブランチです。

詳しくは Pro Git の解説が分かりやすいです: [Git のブランチ機能 - リモートブランチ](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)


CC BY-SA 4.0
2022-12-31T10:21:11.370
93125
2022-12-31T10:21:11.370
19110
93121
answer


まず、[Git で「追跡ブランチ」って言うのやめましょう -
Qiita](https://qiita.com/uasi/items/69368c17c79e99aaddbf)
の説明と図がわかりやすいかなと思いますのでそちらの説明を読んでみてください。

[![画像の説明をここに入力](https://i.stack.imgur.com/ETVYo.png)](https://i.stack.imgur.com/ETVYo.png)

リンク先の説明でわかる通り、ひとくちに `master` と言っても、 ローカルに `master` と `origin/master`の2つと、リモートに
`master` の1つが一般的には関わってきます。

さて、 `git push origin dev` コマンドは、 ローカルの `dev` ブランチをリモートの `dev`
ブランチに同期させるコマンドです。  
("現在のHEADをプッシュする" わけではありません)

同様に、 `git push origin origin/dev` は、ローカルの `origin/dev` ブランチをリモートの `origin/dev`
ブランチに同期させるコマンドということになります。

`origin/dev`
ブランチは冒頭リンク先の説明にある通りリモートを追跡しているブランチなので、それをリモートにpushするという行為は普通に考えて意味が無いです。  
従って **2\. のようなコマンドを実行する機会は無いでしょう** 。

* * *

(完全ではないですが、私がわかるところまで説明してみます)

実際に何が起こっているのかは、次のような手順で確認することができると思います。

まず、ローカルにリモート(origin)リポジトリとローカルリポジトリを作成します。

[code]

    mkdir temp
    cd temp
    mkdir origin-repo
    cd origin-repo
    git init --bare
    cd ..
    git clone origin-repo local-repo
    cd local-repo
    
[/code]

この時点のリモートリポジトリの refs を見てみます。

[code]

    tree ../origin-repo/refs/
    
[/code]

結果:

[code]

    ../origin-repo/refs
    ├── heads
    └── tags
    
[/code]

続いて、ローカルでcommit, pushをおこなった後、同様にリモートリポジトリの refs を確認してみます。

[code]

    git commit --allow-empty -m init
    git push origin HEAD
    tree ../origin-repo/refs/
    
[/code]

結果:

[code]

    ../origin-repo/refs/
    ├── heads
    │   └── main
    └── tags
    
[/code]

`refs/heads/main` が作成されているのがわかります。  
続いて、 `origin/main` を push してみます。

[code]

    git push origin origin/main
    tree ../origin-repo/refs/
    
[/code]

結果:

[code]

    ../origin-repo/refs/
    ├── heads
    │   └── main
    ├── remotes
    │   └── origin
    │       └── main
    └── tags
    
[/code]

`refs/remotes/origin/main` が作成されました。

ところで、このブランチは `git branch -r` で表示されません。  
checkout するには被らないような名前のローカルブランチにpullすれば良さそうです。

[code]

    git pull origin origin/main:origin-main
    git checkout origin-main
    
[/code]


CC BY-SA 4.0
2023-01-04T05:32:14.113
93177
2023-01-04T06:00:57.197
2023-01-04T06:00:57.197
2808
2808
93121
answer