チェックアウトせずに他のブランチを現在のブランチにリセットする


110

Gitワークフロー用のスクリプトをいくつか書いています。

チェックアウトせずに、他の(既存の)ブランチを現在のブランチにリセットする必要があります。

前:

 CurrentBranch: commit A
 OtherBranch: commit B

後:

 CurrentBranch: commit A
 OtherBranch: commit A

に相当

 $ git checkout otherbranch 
 $ git reset --soft currentbranch
 $ git checkout currentbranch

(注--soft:作業ツリーには影響しません。)

これは可能ですか?


これがEgitでも可能かどうか誰か知っていますか?
zedoo 2018年

回答:


84

説明するワークフローは同等ではありません。実行reset --hardすると、作業ツリー内のすべての変更が失われます(必要に応じて、reset --soft)。

必要なのは

git update-ref refs/heads/OtherBranch refs/heads/CurrentBranch

3
refs/heads/
ああ

41
これを行うより良い方法はgit push . current:otherです。これはrefs/heads(/ cc @elliottcable)がなくても機能し、チェックアウトされたブランチを更新することもできません。+current:other更新が早送りでない場合は、-fを渡す(またはを使用する)必要があることに注意してください。
リリーバラード

4
また、-m 'some text'引数を使用してgit reflog OtherBranch、「CurrentBranchに同期」などのコマンドで表示されるref更新の理由を記録することもできます。後で行った理由を覚えておくと役立ちます。
Levi Haskell

18
なぜ、git update-ref refs/heads/OtherBranch refs/heads/CurrentBranchまたは代わりにgit push . CurrentBranch OtherBranchはるかにクリーナー(IMO)をgit branch -f OtherBranch CurrentBranch使用できるのですか?(下のgitブランチ-fで私の回答を参照)
Colin D Bennett 14年

1
@BenHymersしたがって、「git push」のマニュアルページはうそつきです。コマンドは "Update remote refs ..."と記述されています。実際、ローカル参照を正常に更新できる場合。
Kaz

228

実行otherbranch時と同じコミットを指すように設定しcurrentbranchます

git branch -f otherbranch currentbranch

-f(強制)オプション伝えgit branch はい、私は本当にすべての既存の上書きするわけotherbranch新しいものに参照を

ドキュメントから:

-f
--force

既に存在する場合はリセットします。-fなしでは、gitブランチは既存のブランチの変更を拒否します。


6
これが最も簡単な答えです。ありがとう!
Robert Karl

私が得るfatal: Cannot force update the current branch.これを実行しようとしたとき。
Fuad Saud 2014年

4
@FuadSaudは、すでにotherbranchチェックアウトしているためです。このSOの質問は特に、別のブランチを別のコミットにリセットすること(つまり、チェックアウトしたブランチをリセットしないこと)に関するものです。あなたがしたいことはgit reset targetbranch、現在のブランチがを指すように強制するために現在のブランチをリセットすることですtargetbranch。追加--hardして、作業ツリーをそのコンテンツに強制します。または--soft、インデックスをそのままにして、ブランチ自体のみを変更します。
コリンDベネット2014年

そうですね、リセットについて知っています。私が探していたのは、ルーチン内で、チェックアウトされたものとは関係なく、常にローカルマスターをアップストリーム/マスターにポイントする方法でした。できると思っbranch -fた。
Fuad Saud 2014年

9
イモ、これは受け入れられる答えになるはずです。これによりワークフローが大幅に改善されました!
致命的なギター

23

このコマンドでブランチをいつでも同期できます

$ git push . CurrentBranch:OtherBranch -f

また、-fを指定しないと、このコマンドセットが置き換えられます

$ git checkout OtherBranch
$ git merge CurrentBranch
$ git checkout CurrentBranch

CurrentBranchですべてのファイルをコミットする必要がないため、別のブランチに切り替えることができない場合に役立ちます。


「リモート:エラー:早送りを拒否しています」の原因となる可能性があります
Basilevs

3
-fどうしても避けられない場合を除いて、オプションは含めません。それは私の場合それなしでうまくいきます。
Melebius
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.