9

私は数日間開発しているローカル Git リポジトリを持っています。これまでに 18 個のコミットがあります。今夜、私はそれをプッシュしたいと思っていたプライベート Github リポジトリを作成しました。しかし、そうすると、18 件のコミットのうち 8 件が Github にプッシュされただけでした。Github リポジトリを削除して再試行しましたが、結果は同じでした。

なぜこれが起こっているのでしょうか?私は以前にこの手順を数回成功させたことがないので、少し困惑しています。

更新: このレポには master ブランチしかありません。投稿された回答のいくつかに対処するために...

4

7 に答える 7

18

問題のリポジトリを調べたところ、次のようになりました。

  • ある時点で、rpjはを実行していましたgit checkout [commit id]。これは、認識されたブランチではなく、ルーズコミットでHEADを指し示しました。これがCesarBが言及している「ぶら下がっているHEAD」の問題だと思います。
  • この問題に気づかずに、彼は変更を加えてコミットし続けましたが、それは毎回HEADを押し上げました。ただし、HEADは、認識されたブランチではなく、コミットのぶら下がっているチェーンを指しているだけでした。
  • 彼が変更をプッシュするために行ったとき、gitはすべてをマスターの一番上にプッシュしました。これは、彼がいる現在のツリーの約半分にすぎませんでした。
  • 混乱が続いた

この図はそれをより明確にするはずです:

                 -- D -- E -- F
                /             ^
   A -- B -- C -              |
   ^         ^               HEAD
   |         |
 remote    master

彼が自分の変更をプッシュしようとしたとき、AスルーだけCがプッシュされてremote上に移動しましたC。既知のブランチによって参照されていないため、プッシュするためのコミットDを取得できませんでした。F

この状態のときに表示される内容は次のとおりです。

$ git branch
* (no branch)
master

解決策は、コミットのぶら下がっているチェーンの上位に移動masterすることです。Fこれが私がそれをした方法です。

  • 現在の状態の正当なブランチを作成します。

    git checkout -b tmp

    • ブランチは、上の図tmpでコミットを指しています。F
  • masterに早送りtmp

    git checkout master

    git merge tmp

    • master現在、commitを指していFます。
  • 一時的な支店を捨てる

    git branch -d tmp

  • リモートリポジトリに喜んでプッシュすると、すべての変更が送信されます。

于 2008-11-09T20:13:26.857 に答える
5

Git 1.7.3 以降では、これを 1 つの簡単なコマンドで実行できます。

git checkout -B master

-bスイッチは「チェックアウトする前にここにブランチを作成する」という意味で-B、「ブランチが既に存在する場合でも、チェックアウトする前にここに移動してください」という無条件バージョンです。


この種の問題を修正するための非常に簡単な方法は、masterブランチを削除して再作成することです。結局のところ、git のブランチは単にコミットの名前であり、masterブランチは特別なものではありません。

したがって、現在のコミットがあなたが望むものであると仮定するmasterと、単純に

git branch -D master

既存のmasterブランチを削除してから実行します

git checkout -b master

mastera)現在のコミットを指すという名前の新しいブランチを作成し、 b)ブランチHEADを指すように更新しmasterます。その後、HEADにアタッチされるmasterため、masterコミットするたびに前進します。

于 2008-11-09T21:25:14.963 に答える
2

正しいブランチをプッシュしているかどうか、ブランチが実際に持っていると思っているものを持っているかどうかを確認してください。特に、分離された HEAD がないかどうかを確認してください。これは、意図的に行わないと非常に混乱する可能性があります。

確認する最も簡単な方法はgitk --all、すべてのブランチ、HEAD などをグラフィカルに表示する を使用することです。

于 2008-10-26T03:57:07.070 に答える
1

CesarBの以前の回答に直接コメントするという評判はありませんが、gitk --all既知のブランチのみがリストされているため、この場合は機能しません。

gitk HEADはこの問題を示していますが、完全には明確ではありません。喫煙銃は、master最新のコミットではなく、コミットツリーの下に表示されます。

于 2008-11-09T20:17:25.367 に答える
1

私が最初に行うことはgit fsck、ローカルリポジトリで実行して、すべてが正常であることを確認することだと思います.

私はこれまでこの問題を見たことがなく、何が問題なのか考えられません。

于 2008-10-26T02:35:27.157 に答える
0

私はこれと同じ問題を2回経験しましたが、最終的に私が何をしていたのかが原因であることがわかりました。古いコミットを編集する過程でgit rebase -i、を呼び出す代わりにgit commit --amend、私は習慣の力で呼び出していましたが、もちろんgit commit -aその直後に続きました。git rebase --continue他の誰かが舞台裏で何が起こっているのかを説明できるかもしれませんが、結果は分離されたHEADの問題であるようです。

于 2009-01-30T15:38:37.287 に答える
0

したがって、.git/refs/heads/master のコミット ハッシュが正しくなく、.git/logs/refs/heads/master の情報が不完全であることがわかりました。つまり、.git/refs/heads/master で指定されたコミット ハッシュまでしか含まれていませんでした。

これらのファイルを (手作業で) 修正し、Github にプッシュすると、すべてが元に戻りました。何が原因でこの状態になったのかはまだわかりませんが、少なくとも修正方法がわかったことがうれしいです。

.git/refs/heads/master を修正するために、そのファイルの内容を最新のコミット ハッシュ (HEAD) に置き換え、.git/logs/refs/heads/master を修正するだけです。 .git/logs/HEAD の内容を .git/logs/refs/heads/master にコピーしました。簡単なピージー... 違います。

于 2008-10-26T21:26:15.830 に答える