Azure DevOps Services |Azure DevOps Server |Azure DevOps Server 2022 |Azure DevOps Server 2020
Git 履歴の簡略化は、混乱を招く可能性があります。 99%、それが存在することさえ知りませんが、Git の暗いコーナーから飛び出して噛み付くこともあります。 この記事では、履歴の簡略化とは何か、およびファイル履歴を見るときに混乱を引き起こす可能性がある方法について説明します。
一般的なシナリオから始めましょう。
- 変更をファイルにプッシュし、変更をメインにマージします。
- 同僚の中には、ブランチをメインにマージする人もいます。
- しばらくすると、変更が欠落していることに気付きます。
- 犯人を探して、あなたはファイルの履歴と通知を見に行きます...変更が一覧に表示されない場合は、次の手順を行います。
Git コミット履歴はツリーです。 時系列履歴が実際のファイル ツリー履歴と同じでない場合があります。 この状況は、マージ コミットによってファイルが元の状態に戻されるときに最も頻繁に発生します。 その場合、ファイルが技術的に変更されていないため、既定の履歴ビューには 実際にすべての変更が表示されるわけではありません。 このシナリオでは、Git は履歴を簡略化できることに気付き、最も可能性の高い "変更" がログから削除されます。
あなたが以前にそれにぶつかっていない限り、あなたは私の変更がどこに行ったのか疑問に思って、不満になるかもしれません?
履歴の簡略化: 既定でオン
既定では、ファイルに対して log コマンドを実行すると、 git log file.txt によって履歴が自動的に簡略化され、一部のコミットが出力から非表示になる可能性があります。 詳細については、 git ログの man ページを参照してください。
混乱を招くのは、を実行するだけでは履歴の簡略化が発生git logということです。これは、すべての変更を見ているため、簡略化するものは何もありません。
履歴の簡略化を無効にするには、コマンド ライン スイッチ --full-historyを使用する必要があります。
履歴の簡略化の例
簡略化のしくみをより深く理解するために、独自の履歴簡略化の例を作成します。 まず、作成する履歴の図を見てみましょう。
ご覧のとおり、次の手順を実行します。
- ファイルを作成します。
- ブランチ (動物) 内のそのファイルに行を追加します。
- 別のブランチ (フルーツ) 内のそのファイルに別の行を追加します。
- ブランチ 動物 をメインにマージします。
- ブランチ フルーツ をメインにマージし、フルーツブランチからファイルのコピー全体を選択します。
- ファイルの履歴を確認します。
Git は、履歴を簡略化します。 手順 5 が重要です。 動物の枝からのすべての変更を無視しました。 Git は、基本的に手順 1 と手順 5 の間でファイルが 変更されなかった ことに気付きます。そのため、 2 つの履歴エントリのみが表示されます。
まず、ファイルを作成し、リポジトリに追加します。
> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"
次に、動物の枝のファイルに "donkeys" というテキストを追加することにしました。
> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"
実験中は、代わりにファイルにフルーツを入れたいと考えたので、別のブランチを作成し、代わりにファイルの末尾に "bananas" というテキストを追加します。
> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"
変更に満足して、動物の枝をメインにマージすることにしました。
> git checkout main
> git merge animals
次に、 test.txt ファイルのログを見てみましょう。
> git log test.txt
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
ここまでは良いですね。 ログ出力では通常とは何も表示されません。 次に、考えを変えて、フルーツブランチをマージすることにしたとします。
>git merge fruit
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
ええと、マージの競合。 いくつかの検討の後、私たちはフルーツブランチ から test.txt ファイル全体を使用 することにしました。 通常は、何らかのテキスト エディターまたはマージ ツールを使用しますが、ファイル全体を再作成するのは 2 行だけであるためです。
> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"
次に、 test.txt ファイルの履歴を見てみましょう。
> git log test.txt
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
確かに、最初の実験からの変更はログに表示されません。また、マージも表示されません。 彼らはまだそこにいますか? Git は変更を完全に排除しましたか?
> git log --full-history test.txt
ご覧のように、 full-history フラグなしでログが簡略化されましたが、Git ではすべての変更が保持されています。
> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
Merge: 6b33d99 fdd4dfd
Date: Mon Feb 15 10:59:34 2016 -0500
Fixed merge conflict
commit fdd4dfd816c4efebc5bdb240f49e934e299db581
Date: Mon Feb 15 10:51:06 2016 -0500
We have added a fruit
commit 6b33d99b996c430a60c9552b79245d1aa8320339
Date: Mon Feb 15 10:45:33 2016 -0500
We have added an animal
commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
Date: Mon Feb 15 10:44:18 2016 -0500
Initial commit
Git 履歴の簡略化の概要
履歴の簡略化に関する点は、ほとんどの場合、それに気付かないということです。 しかし、マージの競合が発生し、何が起こったかを知りたい場合は、Git ログの履歴を見て、変更がどこに行ったのか疑問に思うかもしれません。
これで、パニックになる代わりに、次のことが分かります。
- 既定では、ファイルの履歴の簡略化が有効になっています
-
--full-historyフラグを使用すると、より包括的なファイル履歴が表示されます
更新: この記事を書いて以来、 Azure DevOps Services では、Web 上で多くの素晴らしい履歴表示オプションが導入されています。 つまり、コマンド ラインでログ記録を行いたくない場合は、エクスプローラーで履歴を表示するファイルをプルするだけで、次の履歴フィルターが表示され、単純な履歴ビューまたは単純でない履歴ビューを指定できます。
(c) 2016 Microsoft Corporation。 All rights reserved. このドキュメントは"as-is." で提供されています。URL やその他のインターネット Web サイトの参照を含め、このドキュメントに記載されている情報およびビューは、予告なしに変更される場合があります。 使用するリスクを負います。
このドキュメントは、Microsoft 製品の知的財産権に関する法的な権利をお客様に許諾するものではありません。 内部での参照を目的とする場合、このドキュメントをコピーして使用できます。