2009-04-30 17 views
5

私は最近コミットしたローカルのgit repoを持っていて、共有リポジトリにプッシュしました。私が共有リポジトリにプッシュした後でさえ、私は醜い間違いを犯したことを実感しました。共有リポジトリへのGitコミットの修正

その後
git commit -C HEAD -a --amend 

、私は別のGitのプッシュ起源を試してみましたが、私は次のエラーを取得する:

! [rejected]  mybranch -> mybranch (non-fast forward) 

これを是正するための最良の方法は何私は私が私のソースを固定した後、ローカルで何の問題それを修正しません状況?

答えて

7

git does not(デフォルトでは)gitはブランチに "push"することができません。言い換えると、現在の分岐ヘッドが分岐チップの直接の親または祖先でない場合、プッシュは拒否される。

-fオプションをgit pushに設定するか、「+」を先頭に付けたrefspecを使用してプッシュしてみてください。 git push origin +mybranch:mybranch

通常、リモートリポジトリは、ローカルではないコミットを含まないブランチのヒントを別の人が無差別に押し込む可能性があるため、コミットを失う危険があるため、このようなことは起こりません。

この動作を無効にするには、リモートリポジトリの構成パラメータreceive.denyNonFastForwardsを変更します(リモートリポジトリへの適切なアクセス権があることを前提とします)。

このようなアクセス権がない場合は、リモートブランチを削除して再作成することでこれを実現できます。

git push origin :mybranch 
git push origin mybranch 

のgitの最新バージョンは、設定されている場合、作業からこの危険な可能性の回避策を防ぐことができます設定パラメータreceive.denyDeletesが含まれていることに注意してください。

+0

いいえ、私はdenyNonFastForwardsについて知らなかった:私はあなたにそれを強制するためのフックが必要だと思っていた。 – araqnid

5

プッシュを強制する場合は、... ehm ... --forcepushに渡すことができます。

しかし、一般的には、パブリックリポジトリの履歴を書き換えるのは悪い方法です。共有レポを想定し

0

はただ非早送りプッシュを強制的にプラス記号と支店名を接頭辞、ことができます:

git push origin +mybranch 
2

この場合、それはちょうど第二にコミットするために、おそらく最善です修正する。ローカルリポジトリで元の最初のコミットを既に変更しているので、変更を加えたコミットがガベージコレクションされるように、共有リポジトリからそのリポジトリを取り出し、HEADを移動したいと思うでしょう。

関連する問題