86252


いつも release ブランチを切る時  
bitbucket 上で master から release/xxxxxx をUI上で作ってるんですが  
ローカルから git コマンドで簡単にやる方法ってないでしょうか

ローカルのブランチのどの状態にあっても  
リモートの master の状態から release をきって  
ローカルは元の作業状態に戻りたいです

[code]

    #!/bin/bash
    CURRENT=`git branch --show`
    git stash
    git checkout master
    git pull
    RELEASE=release/`date "+%Y%m%d-%H%M%S"`
    git branch $RELEASE
    git checkout $RELEASE
    git push --set-upstream origin $RELEASE
    git checkout $CURRENT
    git stash pop
    
[/code]

こんな感じでやろうとしたんですがローカルの作業状態によって stash や checkout が失敗します

プッシュコマンドだけでブランチ移動せずに  
git push origin/master => origin/release/xxxxxx にコピーするようなことってできませんか？


CC BY-SA 4.0
2022-02-10T03:28:56.767
86241
2022-02-10T19:30:55.983
question
git
リモート上のブランチコピーをローカルからコマンドだけで行いたい


"ローカルの作業状態によって失敗します" の原因までは分かりませんが、単純にブランチの移動をせずにコピーであれば以下の通り `git branch` の
`--copy` で実行できます。

[git-branch | Git Documentation](https://git-scm.com/docs/git-branch)

[code]

    $ git branch --copy <oldbranch> <newbranch>
    
[/code]

* * *

**追記:**

Git は仕組み上、リモートの環境を直接触るわけでは無いので、ローカルでの作業を反映したい場合には必ず同期の必要があると思います。

ブランチを切る代わりに **タグ** を使う方法もあります。

[リポジトリ タグ | Bitbucket Cloud](https://support.atlassian.com/ja/bitbucket-
cloud/docs/repository-tags/)

>
> タグを使用することで、リポジトリ履歴のある時点での特定のコミットにマークを設定できます。コミットにタグを設定すると、それ以前のすべての変更が含まれます。タグをあとから比較して、履歴の
> 2 つの時点で差分を確認することができます。タグは一般にリリース バージョンのマークに使われ、タグ名はリリース名になります。


CC BY-SA 4.0
2022-02-10T05:24:17.490
86242
2022-02-10T07:26:28.260
2022-02-10T07:26:28.260
3060
3060
86241
answer


自分はこんな感じの alias 組んでます

[code]

    alias release='export BRANCH=release/`date +%Y.%m.%d.%H%M`; git pull; git branch $BRANCH master; git push --setupstream origin $BRANCH'
    
[/code]

最初に全部 pull してますが master だけでよければ  
git pull origin master:master  
とかにかえてもいいのかも

`git branch <作成するブランチ> (<元ブランチ>)`  
で省略するとカレントブランチが使われるだけなので元ブランチを指定すれば checkout せずにコピーというかブランチできます

\--copy フラグは知らなかったんですが調べてみると設定（リモートプッシュ先とか？）までコピーするみたいなのでこの場合つけないほうがいいかも

master から --copy で作ったブランチは --setupstream をつけわすれて push するとおそらくリモートの master
にプッシュすることになりそうなので危険です（試してないですが）

push も同じく  
`git push (<プッシュするブランチ>)`  
で省略するとカレントブランチを push するだけなので  
ブランチを指定すれば checkout せずに push できます

初回（--copy を指定しなければ）追跡ブランチがセットされてなくて  
\--setupstream してくれって警告が出ると思うのでしてあげるだけです  
\--setupstream origin とかけば暗黙で origin/<同じ名前> にプッシュしてくれます


CC BY-SA 4.0
2022-02-10T07:14:13.840
86252
2022-02-10T07:14:13.840
86241
answer


開発作業とリリースブランチ作成作業という異なる作業を、並行して同一の作業ディレクトリで行おうとしているのが問題を複雑化させているように思われます。

どちらの作業も継続的に発生するのであれば、 各々作業ディレクトリを用意しておけば良いのではないでしょうか。

  * [Atlassian Japan 公式ブログ: Git 2.x シリーズの 6 つの素晴らしいフィーチャー](https://www.atlassian.com/ja/blog/cool-features-git-2-x) > 複数クローンの優れた取り扱い: Git Worktree

にある通り、 `git worktree` が利用できます。


CC BY-SA 4.0
2022-02-10T19:30:55.983
86260
2022-02-10T19:30:55.983
2808
86241
answer