3

みなさん、お礼

私は、UNIXスクリプトとgitの使用についてさらに学ぶために、小さな夏のプロジェクトとしてbashスクリプトに取り組んできました。

gitでブランチを使用するのはこれが初めてで、通常はマスターに固執します。

git log --graph'develop'ブランチが'master'とマージされているように見えることに気付いたとき、グラフ()でgitログを表示していました。このようなもの:

マスター----1-------- 3 ---- 4 ---- 5 ---- 6 ---- HEAD
開発\---2---/

ただし、コミット3以降は開発ブランチ内で実行されました。これを実行し、これが真実であることgit checkout mastergit checkout develop示しました。

正確には何が起こっているのですか?これは早送りとして知られているものですか?

更新#1:

コミット1は、実際には私のリポジトリの最初のコミットではなく、「マスター」で行った最後のコミットです。

更新#2:

これはで与えられたグラフですgitk --all

                   タグ「1.0-0」
                        |
マスター-*-*-*-*-*-*----2\
開発\1---- 3 ---- 4 ---- 5 ---- 6

更新#3:

私は詳しく調べて、gitkコミット1までのすべてのコミットが「開発」ブランチと「マスター」ブランチの両方で発生したことを発見しました。

私の誤った使用を指摘してくれたSimoneDemoGentiliに感謝しますgit checkout develop

PS:コミット1と2も、コミット2が実際にはコミット1の修正であるということで、私には謎です(私が思った限りでは、このアドバイスを使用しました)

4

1 に答える 1

2

ブランチ

gitブランチは、特定のコミットへの移動可能なポインターにすぎません。それらのコミットには、ブランチプロパティがアタッチされていません。コミットがブランチポインタが接続されているコミットの祖先である場合、Gitはブランチに属するコミットを表示します。

次の履歴があるとします。

     4 <- A
     |\
     | \
     2  3 <- B
     | /
     |/
     1
     |
     0

次に、すべてのコミットはブランチAにあります。これは、すべてのコミットがコミット4の祖先であり、ブランチAが指すためです。ただし、これらのコミットはコミット3の履歴であるため、ブランチBには0、1、および3のみがあります。

早送り

早送りマージはマージであり、1つのブランチのブランチポインタを、履歴を失うことなく新しいコミットに簡単に移動できます。これは、ターゲットコミットが、ブランチが現在指しているコミットの後継である場合に当てはまります。前の例では、コミット4はコミット3の後継であるため、ブランチAをブランチBにFFマージできます。このマージの後、BはAポイントにもコミット4を要求します。次の履歴は、非FFマージの例を示しています。 :

A -> 2  3 <- B
     | /
     |/
     1
     |
     0

ここで、Bをコミット2に移動することはできません。これは、コミット3が履歴から外れるためです。これを解決するには、2と3の間の実際のマージを作成する必要があり、次の履歴につながります。

     4 <- B
     |\
     | \
A -> 2  3
     | /
     |/
     1
     |
     0
于 2012-06-22T11:04:27.543 に答える