2016-08-28 12 views
1

私はgit repoを混乱させてしまいました。私は悪くなったライブラリの依存関係をいくつかアップグレードしようとしました。私はそれらを取り消す方法を見つけることができませんでしたので、私はちょうど前のコミットに戻って、そこから作業し、後で物事をマージすると考えて決めました。しかし、私は起源/マスターが頭から切り離されて巻き取られましたが、今はリモートのレポに何かを押し込めません。ここでは、物事の現在の状態のスクリーンショットは、次のとおりです。Git detached head - 前回のコミットに戻ってそこから変更を適用してください

enter image description here

私はその枝についてはあまり気にしませんでした。私はちょうどそれがクロールした穴に戻ってほしいです。しかし、私はそれを実現させることはできません。

git push origin HEAD:master

To https://[email protected]/xxx/xxx.git ! [rejected] HEAD -> master (non-fast-forward)
error: failed to push some refs to ' https://[email protected]/xxx/xxx.git '
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

git revert 7921869

error: revert is not possible because you have unmerged files.
hint: Fix them up in the work tree, and then use 'git add/rm '
hint: as appropriate to mark resolution and make a commit.
fatal: revert failed

私も変更をプッシュしようとしました:

私はこのようなコミットを元に戻すために試してみましたgit push origin master --force

error: src refspec master does not match any.
error: failed to push some refs to ' https://[email protected]/xxx/xxx.git '

そして、私はこれでした:

git show-ref

79218694bc34715b3d632dc0057f01fc2df2c842 refs/remotes/origin/master

誰も私を外し頭を持っていないように私はこれをほどく助けることができますか? f0dd017と同じようにddf4a1fコミットと一貫性を持たせるためには、origin/masterが必要です.7921869はこれまでに起こったことがありませんでした。私がちょうどgit checkout masterまたはgit checkout e416f24を行うと、私は4回のコミットを失い、私はそれを起こさせることはできません。

ありがとうございました。私はよくこのことを説明していない場合は

EDIT

は、左のラインは完璧です。私はちょうど私がリモートに再度押すことができるように最終的なコミットを指すようにマスターを取得する必要があります。ピンクの枝を忘れて。それはごみです。私はそれをまったく使用したくありません。

EDIT 2

私はティムBiegeleisenにより、以下のアドバイスに従っていると私は、私はほとんどそこだと思います。今私は、この状態を持っている:私はgit push origin masterを行う際

enter image description here

は、だから今、私はこの取得:

To https://[email protected]/xxx/xxx.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ' https://[email protected]/xxx/xxx.git '
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

をしかし、私はメッセージが言うようにやるとgit pull ...を行う場合、私は全体を無効にしないだろうこれの目的はorigin/masterからゴミを取り戻すことですか?

git push origin master --forceとすればよいですか?

+0

>ファイルを結合解除しました。 これはあなたがマージしたことを意味しますが、半分が完了したことを意味します。 'git merge --abort'を実行する必要があります。 – ryenus

+0

' git push origin master --force'は 'origin/master'が分岐点より先にある2つのコミットを破棄し、' master'元の分岐点よりも先にある。これは、達成したいこととまったく同じように思えます。 – cmaster

+0

です。そしてそれは働いた。私は今すべて修正されています。ありがとう! – Alex

答えて

2

この狂気を終わらせるための1つのアプローチは、あなたがこの切り離されたヘッド状態にあるすべての作業をコミットし、真正なブランチを作成し、次に希望のコミットをmasterにチェリーピックすることです。ここでは、この操作を行うことができる方法である。

git commit -m 'final commit detached HEAD' # save any remaining work 
git checkout -b master_detached    # create new branch (perhaps optional) 

git checkout master       # switch to master 
git cherry-pick <SHA-1 detached #1>   # cherry-pick 1st commit 
git cherry-pick <SHA-1 detached #2>   # cherry-pick 2nd commit 
... 

コマンドgit cherry-pick <SHA-1>は、そのハッシュこの場合にはmasterだろう現在のブランチにSHA-1ある単一のコミットを適用するためのGitに指示します。つまり、チェリーピックを使用すると、分離したHEAD状態で行ったコミットを安全に保管するためにmasterブランチに効果的に移植することができます。チェリーピックは、1つのコミットのマージと考えることができます。そのため、チェリーピックの操作ごとにマージすることができます。

更新:

あなたが取り外された状態に作られた4つのコミットに加えて、あなたのmaster枝の上に悪いコミットのカップルを作ったことが表示されます。この場合、masterから2つのコミットを無効にすることができます。だから、あなたにぴったり上記git checkout master工程の後に次のことを試すことができます:

git reset --hard HEAD~2 

これは、コミットe416f24にコミット戻っ7921869からmasterをロールバックされます。この後は、切り離されたコミットをチェリーピックすることで、上記のように簡単に続行します。

あなたがmasterブランチの歴史を書き直したので、あなたは今経由でリモートにそれをプッシュする必要があります:masterは、多くの人々によって共有されている場合、これは望ましくないかもしれないことを心に留めておいてください

git push --force origin master 

+0

ありがとうございますが、これは「マスター」ブランチの人生を続けるでしょう。私はそれらが2つのコミットを望んでいない理由は、すべてをねじついたからです。ちょうど 'git checkout e416f24'をして、チェリーがあなたの提案したコミットを選ぶことができますか?それは同じことを達成するだろうか? – Alex

+0

うーん...あなたの質問が間違っているか、私の答えに従わない。私はあなたと同じことを言っています。ちょうどチェックアウト 'マスター'とチェリーピック。切り離されたHEAD状態で行ったコミットは、 'master'ブランチの_not_ではありません。 –

+0

おそらく後者です。私が 'git checkout master'を実行すると、私は7921869コミットに行きます。私はそこにいたくない。私が適用を開始したいコミットはe416f24です。私はf0dd017と7921869を捨てたいです。 – Alex

関連する問題