0

状況

  • ローカルの Git リポジトリがあります。

ここに画像の説明を入力

  • 私はブランチにしか持っていません: master .

  • 以前は別のブランチがありましたが、それをマージしてmasterから削除しました。

  • から分岐したそのようなマージおよび削除されたブランチfe6263e

  • 0c81926だった -- の修正c79dc19

  • タグも、 を指している他のものもありませんc79dc19。オブジェクトが修正されたコミットを指している場合、そのようなコミットは引き続き履歴に表示されることを理解しています。しかし、そうではありません。

質問

  • 歴史の線が平らにならなかったのはなぜですか?

  • なぜまだc79dc19表示されているのですか?

  • どうやってそうなった?

私が言及したように、それを指すものは何もないので、git -gcハングしているコミットをクリーンアップするために を実行しました。

4

3 に答える 3

2

タグも他の [commit] もありません。c79dc19

それは歴史が示すものではありません。

実行してみてくださいgit show HEAD- マージの 2 つの親が何であるかが表示されます。グラフからは のように見えますc79dc19。そのため、履歴に表示されます。

最も可能性が高いのは、ブランチが実際に開始されたc79dc19(つまり、すでにc79dc19マスターにあった) か、ブランチが先頭にあったときに早送りとしてマスターにマージされたことです。


加工イラスト:

  1. 初期状態

    fe62 <=master <=HEAD
    
  2. 新しいコミット

    fe62 <- c79d <=master <=HEAD
    
  3. 新しいブランチをチェックアウトする

    fe62 <- c79d <=master <=branch <=HEAD
    
  4. amend (ブランチ上) は、そのブランチ上0c81置き換える が変更されない新しいコミットを提供しますc79dmaster

    fe62 <- c79d <=master
         \- 0c81 <=branch <=HEAD
    
于 2016-11-09T18:34:49.420 に答える
1

100%確実なことは難しいですが、これはよくあることなので、おそらくこれが正しい答えです。

という名前のブランチが 1 つしかないことに言及していますmaster。私はあなたを信じています!しかし、レポジトリは 1 つだけではありません。より正確には、クローンがあり、さらに別のクローンがあります。おそらく、originGitHub などの中央サーバーや企業サーバーで呼び出したリモート上にあります。サーバーにコミットを送信し、サーバーからコミットを取得します。

の使用についても言及しgit commit --amendました。git commit --amend は正確にどのように機能しますか? を参照してください。( Jubobs のコメントのように) 詳細については説明しますが、要するに、これはコミットを変更するのではなく、新しい置換コミットを優先して押しのけるだけです。ただし、おそらく元のコミットは既にプッシュされているため、別のリポジトリのmasterブランチにあることになります。

だからあなたは今0c81926あなたの先端として持っていましたがmaster、彼ら(起源)は持っていましたc79dc19. 次に、 new commit を作成f6429ebしたため、それをmaster指すようになりました。

次に、実行したに違いありませんgit pull(そして、ほとんどの場合、実行するように構成または指示git pullしていませんgit rebase)。これにgit fetch続いて実行されましたgit mergegit fetchがリモートで確認したところ、 が commit指していることoriginがわかりました。実行されたは自分のブランチをあなたのブランチとマージし、 merge commit を生成しました。 masterc79dc19git mergegit pull706b1ef

結局、これが意味することは、masterと master という 2 つの異なるブランチがあったということです。そのうちの1人があなたのマスターであり、そのうちの1人が他の誰かのマスターであるというだけです。

たとえば、 (混乱が始まる直前のポイント)を使用して、コミットc79dc19 マージを取り除くことができることに注意してください。不要な余分なコミットを削除し、残りの履歴を平坦化し、マージを省略します。(または、Jeff Puckett IIの回答の方法を使用してください。)ただし、これを行うと、履歴は上の履歴から分岐します。それらには、コミット(取り除こうとしているのと同じ)があります。 . そのため、プッシュを強制せずにプッシュすることはできません (オプションで、最後にチェックしてからさらにコミットを受けていないことを確認するために、「リースを強制」します) 。git rebase -i fe6263egit rebaseoriginc79dc19masterc79dc19

于 2016-11-09T19:21:03.153 に答える