チェックアウトしたブランチのブランチポインターを移動するには、git reset --hard
コマンドを使用します。しかし、チェックアウトされていないブランチのブランチポインターを別のコミットを指すように移動する方法(追跡されたリモートブランチなど、他のすべてのものを保持する方法)
チェックアウトしたブランチのブランチポインターを移動するには、git reset --hard
コマンドを使用します。しかし、チェックアウトされていないブランチのブランチポインターを別のコミットを指すように移動する方法(追跡されたリモートブランチなど、他のすべてのものを保持する方法)
回答:
任意の参照に対してそれを行うことができます。これは、ブランチポインタを移動する方法です。
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>
一般的な形式:
git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>
必要に応じて、reflogメッセージについてnitを選択できますbranch -f
。1つは1つとは異なると思いますが、reset --hard
これは厳密にはどちらでもありません。
git branch -f
。具体的には、この方法は次のように見えます:(A)使いにくい(B)覚えにくい(C)より危険
git branch -f <branch-name> <new-tip-commit>
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
。(必要に応じて、reflogメッセージについてnitを選択できますbranch -f
。1つは1つとは異なると思いますが、reset --hard
これは正確にはどちらでもありません。)
git help branch
「-f、--force <branchname>がすでに存在する場合は、<force>を<startpoint>にリセットします。-fを指定しないと、gitブランチは既存のブランチの変更を拒否します。」
git branch -f master <hash>
、それはfatal: Cannot force update the current branch.
私が今何をしなければならないのかと私に伝えています、このコマンドを使用することを許可される前に他のランダムブランチをチェックしてください?
HEAD
それを指す)である場合は機能しません。
git reset --hard
コミット参照を渡すこともできます。
例えば:
git checkout branch-name
git reset --hard new-tip-commit
私はこのようなことをやや頻繁にしています。
この歴史を想定して
$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master
# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff
# Ditch that commit on this branch
$ git reset --hard HEAD^
# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master
git update-ref
、上で説明したように行う方が良いでしょう。
git reset --hard ...
、ここで繰り返す必要はありません。:-(
でgitk --all
:
既存のブランチを変更する代わりに再作成すると、追跡ブランチ情報が失われることに注意してください。(これは、リモートが1つだけあり、ローカルブランチがリモートの対応するブランチと同じ名前である単純なユースケースでは一般に問題ではありません。詳細についてはコメントを参照してください。この不利な点を指摘してくれた@mbdevplに感謝します。)
gitk
ダイアログボックスに3つのオプション(上書き、既存の変更、またはキャンセル)がある機能があったら、すばらしいでしょう。
あなたが通常私のようなコマンドライン中毒者でgit gui
ありgitk
、git使用のサブセット用に非常にうまく設計されている場合でも、私は、それらの得意な分野(つまり、git guiでインデックスにハンクを選択的にステージング/アウトすること、およびコミットすること)を使用することを強くお勧めします(署名付きの行を追加するにはctrl-s、コミットするにはctrl-enter 。)
gitk
いくつかのブランチを追跡しながら、アップストリームに送信するパッチシリーズに変更を整理したり、複数のブランチの途中にあるものを追跡する必要がある場合に最適です。
グラフィカルファイルブラウザーも開いていませんが、gitk / git guiが大好きです。
git status
出力も影響を受けます。さらに、いくつかのケースではgit fetch
とgit push
あなたが追跡ブランチを設定しない場合は、明示的に指定せずに、リモート動作しません。すべてのケースについてはわかりませんが、私にとっての一般的な経験則は、作業の便宜とスピードのためには、ブランチを順番に追跡することをお勧めします。
推奨される解決策git branch -f branch-pointer-to-move new-pointer
でTortoiseGit:
正直なところ、このgit push
コマンドについて誰も考えなかったのには驚きました。
git push -f . <destination>:<branch>
ドット(。)はローカルリポジトリを参照します。宛先が「リモートの対応するオブジェクトの背後にある」可能性があるため、-fオプションが必要になる場合があります。
このコマンドは変更をサーバーに保存するために使用されますが、結果はリモートブランチ(<branch>
)をローカルブランチ(<destination>
)と同じコミットに移動した場合とまったく同じです
-f
ローカルで何かを壊さないようにせずにこれを行うこともできます。たとえば、git fetch origin && git push . origin/develop:develop
チェックアウト不要のフェイルファストバージョンgit checkout develop && git pull --ff-only
ファイルを開き、.git/refs/heads/<your_branch_name>
そこに保存されているハッシュを、ブランチのヘッドを移動する場所に変更します。テキストエディタでファイルを編集して保存するだけです。変更するブランチが現在アクティブなブランチでないことを確認してください。
免責事項:おそらくお勧めできない方法ですが、仕事は成し遂げられます。
git branch <branch-name> <SHA-1-of-the-commit>
、古いブランチを使用してダンプしてみませんか?