2017-05-24 23 views
2

私のGIT(BitBucket)リポジトリを押して次の問題が見つかりました。GITリポジトリでこのコミットをプッシュできないのはなぜですか?エラー:my_repoにいくつかの参照をプッシュできませんでした

私はGitのプッシュをすれば、私は次のエラーメッセージを得る:

$ git push 
fatal: You are not currently on a branch. 
To push the history leading to the current (detached HEAD) 
state now, use 

    git push origin HEAD:<name-of-remote-branch> 

だから私はGitのプッシュ原点マスターを行うが、私に次のエラーメッセージ与えようと試み:

$ git push origin master 
To https://bitbucket.org/AndreaNobiliProjects/glis-trigger.git 
! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://[email protected]/AndreaNobiliProjects/glis-trigger.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. 

何が問題なのでしょうか?どのように私はそれを修正しようとすることができますか?

私は、このエラーメッセージ取得私が前にやっていることを説明します。リポジトリに別の人によって行われたいくつかの変更があったので、私はプッシュしてみましたが、私はできません

  • を。
  • 私はリポジトリからプルしますが、これらの変更を使用しないため、プロジェクトの内容を自分のバージョンに置き換えました(私はプル前にバックアップを実行しました)。
  • 私は再度コミットしてプッシュし、このエラーが発生しています。

この状況を解決するにはどうすればよいですか?それは早送りプッシュではないので

答えて

1

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

プッシュは、リモートリポジトリ内のフックによって拒否されます。ローカルマスタとリモートマスタが分岐します。

ローカルマスタをバックアップリビジョンにリセットし、git pull --rebase origin masterを実行します。新しいローカルコミットは、リモートマスターのヒントにリベースされます。リベース後、プッシュは早送りになります。

+0

Ok ...「早送りプッシュ」とは何ですか?私は何を正確にする必要がありますか?私が理解しているところでは、私のバックアップ(私のバージョンのコード)を取ってから、 "git pull --rebase origin master"を実行する必要があります。このように正確に何をしていますか? – AndreaNobili

+0

リベースは予想される結果を生成する可能性は低いです。ここで必要とされるのは、木が目標状態にあることが分かっているからです。 'filter-branch'を使ってフープを実行するのではなく、私の答えのような手続きを使ってマスターのために新しいコミットを準備するだけです。 –

+0

@AndreaNobiliプッシュは、実際にはローカルブランチをリモートリポジトリ内のリモートターゲットブランチにマージすることです。リモートターゲットブランチのヘッドがローカルブランチのヘッドの祖先である場合、プッシュは早送りマージになります。そうでない場合、2つの分岐が分岐する。ローカルブランチがa-b-c-dであり、ターゲットがa-b-c-eであると仮定する。 eはdの祖先ではありません。 'git pull --rebase'によって、ローカルはa-b-c-e-d 'になります。今、eはd 'の祖先です。プッシュは早送りプッシュになります。早送りマージと真マージは 'git merge --help'で説明されています。 – ElpieKay

1

エラーの原因となったことについての説明では、不明な点や不明な点があります。あなたは分離されたHEAD状態にあります。これは通常、ブランチ名以外の何かのcheckoutを意味します。それは大丈夫ですが、それは重要な詳細です(正確に何が何をしたのか、復旧手順に影響を与える理由を知る)。

にチェックアウトしなかった場合、予期しない方法でHEADの値が変更されたことがあります。プロジェクトファイルを復元すると、バックアップには.gitディレクトリの一部(またはすべて)が含まれていましたか? (.gitのディレクトリをgitコマンド以外で操作するのは危険です。)

とにかく、最初のエラーはあなたが分離ヘッド状態にあることを示しています。 2番目のエラーは、分離したHEADがマスターから分岐したことを示しています。言い換えると、あなたのローカルレポには、

X --- X --- X --- A <--(origin/master) 
      \ 
       B <--() 
        ^HEAD 

またはそれに類するものがあります。今、「マスターにプッシュ」とは、「origin/masterをここにポイントさせる」という意味です。デフォルトではgitはorigin/masterBを指していることに抵抗します。なぜならAorigin/masterから以前は到達できなくなったからです。これは、リポジトリの他のすべてのユーザにとって効果的な上流リベースです(のgit rebase文書の「上流リベースからのリカバリ」を参照)。

この安全機能は無効にすることができますが、私はそれに反対します。そのような決定はチームによって意図的に行われるべきであり、あなたがこのポジションで自分を間違って見つけたように思われます。

代わりに、あなたはおそらく

X --- X --- X --- A --- B' <--(origin/master) 

のような結果を目指すべきとB'Aからのすべての変更を元に戻すために発生した場合、それはあなたとあなたの同僚の間です。それでここからどうやって行くの?

あなたの作業ツリー(プロジェクトディレクトリ.git/ディレクトリを除く)があなたの望むように見えるとすれば、それをマスターに持ち運ぶことができます。

git reset --mixed master 

は、HEADとインデックス状態をマスターに移行しますが、そのまま作業ツリーを維持します。

git add . 

あなたの作業ツリーに一致するようにインデックスが更新されます。 (mixedリセットの後にリセットリセットを使用してaddを使用します。インデックスが作業ツリーと一致することが確認されている場合は - 確かめてください...)

git commit 
git branch -f master 

origin/masterは暫定で、まだ多くのコミットを拾っていない限り、今、あなたは、プッシュすることができるはずです。

0

detached HEADにあるコミットは、ローカルのmasterブランチにコミットとして存在する必要があります。したがって、detached HEADからローカルのmasterブランチに移行し、リモートのmasterブランチからローカルブランチを更新するには、masterブランチをbitbucketにプッシュする必要があります。詳細は次のとおりです。

#If you are still detached HEAD status 
git checkout -b temp 
git checkout master 
git merge temp 
git pull origin master -X ours #To keep the conflict files as local version, or you can use git pull origin master --rebase 
git push origin master 
関連する問題