0

私のプロジェクトには、サーバー上に裸のレポがセットアップされています。私は現在ブランチに0.9/developいます。0.9/develop別の開発者が取り組んでいたブランチとマージしました。彼の変更を完全に消去するよりも、彼のコードを修正するがはるかに手間がかかることが判明しました。残念ながら、git push origin 0.9/developマージをコミットした後に既に実行しており、それらの変更を開発およびステージングサーバーにプルしました(はい、私は愚かです)。

私は SO で幾分似たような質問をたくさんしてきましたが、どれも私の正確なケースをカバーしていないようです。これは特に役に立ちました: Git リポジトリを以前のコミットに戻すには?

その質問からの情報を使用して、プロジェクトの最後のコミットを首尾よく消去することができました。具体的にはgit reset --hard f6c84a0、他の開発者の n00bery を自分の詩にマージする直前に、ローカル リポジトリをコミットにリセットすることに成功しました。

わかりました。あとは、裸のレポを修正するだけです。だから私は試しgit push --force origin 0.9/developました。残念ながら、サーバーが送り返した特定のメッセージを失いましたが、それは「成功」に沿ったものであり、リモート リポジトリが更新されて f6c84a0 がコミットされたことを示していました。

サーバーに SSH 接続してからステージング環境に移動して を実行しようとすると、次git pullのような応答がありました。

From /home/ben/web/example
 + 77d54e4...f6c84a0 0.9/develop -> origin/0.9/develop  (forced update)
Already up-to-date.

ただし、git logステージング サーバーから実行したとき、マージからのすべてのコミットはまだ0.9/developブランチにあります。のようないくつかのことを試しましたgit pull --forceが、悪いコミットをなくすことはできませんでした。

じゃ、いいよ。猫の皮をむく方法はたくさんあります。私はステージング サーバーを完全に消去し、新しいサーバーをgit clone --recursive --no-hardlinks example.git stage.example.com作成して、いくつかのサーバー メンテナンス作業を行う必要なセットアップ スクリプトを実行しました。

今、私は自分に戻ることができません0.9/develop branch。以前は単純に を実行git checkout 0.9/developしていましたが、今それを実行すると、次のようになります。

Branch 0.9/develop set up to track remote branch 0.9/develop from origin.
Switched to a new branch '0.9/develop'

待って…何?0.9/develop新しいブランチではありません。この質問からの情報を操作する: Git ですべてのリモート ブランチを複製する方法は? 私は agit branch -aを実行し、次の結果を取得しました。

* 0.9/develop
  master
  remotes/origin/0.8/develop
  remotes/origin/0.8/master
  remotes/origin/0.9/develop
  remotes/origin/HEAD -> origin/master
  remotes/origin/category-address
  remotes/origin/jaminimaj
  remotes/origin/master
  remotes/origin/permissions
  remotes/origin/ticket-duration
  remotes/origin/timzone-support

その後、試してみgit checkout origin/0.9/developましたが、次のメッセージが表示されました。

Note: checking out 'origin/0.9/develop'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at f6c84a0... bugfix: revert email helper

良いニュースは、ステージング サーバーが適切なコード ベースを持つようになったことですが、私は切り離された HEAD 状態にあります。私はおそらくここで非常に些細なことを見逃していることを認識していますが、それは確かに私の金曜日の夜を台無しにしています. ステージング サーバーの HEAD が の HEAD を指すようにするにはどうすればよい0.9/developですか? また、開発環境でも同じことをしたいのですが、gitサーバー全体を消去して最初からやり直すよりも、適切な方法で実行したいと考えています。私はそれを行うことができますか、それともレポからサーバーを再構築することによってブルートフォースする必要がありますか? みんな助けてくれてありがとう!

4

3 に答える 3

0

おそらくあなたの根本的な問題はここで解決されます

あなたのような操作の後、クライアントはいくつかのコミットをリセットして再度プルする必要があります。これは、リポジトリが強制プッシュよりも進んでいるためです。

たまたま離れた場所にいる場合でもcheckout地元の支店だけを心配する必要はありません。ダイレクト ハッシュ、タグ、またはリモート ブランチでチェックアウトを使用したり、何らかの操作の途中でチェックアウトしたりすると、簡単に発生します。現在、ブランチにいないことを意味します。

あなたはそれを手に入れました

git checkout origin/0.9/develop

ローカル ブランチを失ったかどうかは不明です。を使用git branchして、持っているかどうかを確認し、持っている 0.9/develop場合はチェックアウトします。そうでない場合は、git guiブランチの作成メニューを起動して使用し、追跡ブランチから作成します。

于 2013-06-28T23:30:51.837 に答える