前のコミットにロールバックして、そのコードを公開してから、最新のコミットに戻りたいです。
つまり、マスターが古いコミットバージョンを指しているので、そのバージョンをプルすることができます。次に、最初に行った最新のコミットに戻りたいと思います。
これどうやってするの?
回答:
これを実行してマスターを前のコミットに戻す場合:
git checkout master~1 # Checkout previous commit on master
git checkout -b new_master # Create branch for new master
git branch -D master # Delete old master
git branch -mv new_master master # Make new_master master
または:
git reset --hard master~1 # Reset current branch to one commit ago on master
あなたの質問は不明確です。私はあなたが求めているのはこれだと思います:
git push -f origin $old_commit_id:master
これは何をしますか?のブランチの新しいヘッドとして$old_commit_id
コミットをプッシュします。origin
origin
master
それがあなたが望むものであるならば、あなたはあなたの地元のmaster
支店に全く触れる必要はありません。
master (non-fast-forward)
は私にとって失敗を引き起こしました。@jtdubsソリューションが機能しました。
-f
強制的に渡すだけですが、リモートリポジトリはそれを禁止するように構成されている場合があります。答えを更新しました。
強制プッシュを回避したい場合は、リポジトリを古いコミットに戻し、介在するすべての作業を保持する方法を次に示します。
git checkout 307a5cd # check out the commit that you want to reset to
git checkout -b fixy # create a branch named fixy to do the work
git merge -s ours master # merge master's history without changing any files
git checkout master # switch back to master
git merge fixy # and merge in the fixed branch
git push # done, no need to force push!
完了!307a5cdを、リポジトリで必要なコミットに置き換えます。
(最初の2行を組み合わせることができることは知っていますが、それでは何が起こっているのかがわかりにくくなると思います)
ここにそれはグラフィカルにあります:
c1 -- c2 -- c3 -- c4 -- c2' -- c5 ...
\ /
'------------'
c3とc4を効果的に削除し、プロジェクトをc2に戻します。ただし、c3とc4は、もう一度見たい場合は、プロジェクトの履歴で引き続き使用できます。
次のようなコミットグラフを想定します。
| (A) ---------> (B) ----------> (C)
| ^
| (master)
最初にチェックアウトmaster
して、master
現在の場所を指すブランチを作成します。
git checkout master
git branch pointer master
今は次のようになります。
| (A) ---------> (B) ----------> (C)
| ^
| (HEAD, master, pointer)
すでにオンmaster
になっているので、master
ブランチに1つのコミットを後方に移動するように指示します。
git reset master~1
ここで、master
1スペース戻る必要がありますが、pointer
ブランチはまだ最新のコミットにあります。
| (A) ---------> (B) ----------> (C)
| ^ ^
| (HEAD, master) (pointer)
この時点でmaster
、リモートまたはどこにでもプッシュしてから、早送りしてpointer
ブランチにマージして戻すことができます。pointer
その時点でブランチを強制終了できます:
git push origin master
git merge --ff-only pointer
git branch -D pointer
最後の :
| (A) ---------> (B) ----------> (C)
| ^ ^
| [ origin/master ] (HEAD, master)
git push origin master
場合、現在のブランチの先端がリモートのブランチの背後にあるため失敗します。また、-fフラグを渡す必要があります。
あなただけのことができgit checkout <commit-id>
、そして、あなたがする必要があるものは何でもgit checkout master
戻って新しいコードを取得します。
古いコードを実際に変更してリリースする必要がある場合は、おそらく次のようにする必要があります。
git checkout -b my_release <commit-id>
... prepare code for release ...
... release code ...
git checkout master
git merge my_release
また、gitflowはお勧めできません。これにより、これらすべてが非常に簡単になります。
以前のバージョンに移動するには:
git checkout <version hash>
ここであなたの仕事をして、それをコミットしてください
git commit --amend
マスターに戻るには:
git checkout master
git reset --hard
彼のマスターブランチを古いコミットに戻したので、git checkout master
何もしません。
commit --amend
手順は十分に役立つと思います
--amend
?