(Translated by https://www.hiragana.jp/)
Git - Wikipedia コンテンツにスキップ

Git

出典しゅってん: フリー百科ひゃっか事典じてん『ウィキペディア(Wikipedia)』
Git
git logo
GitのWebインターフェース、gitweb
開発元かいはつもと 濱野はまのじゅん, リーナス・トーバルズ, ほか多数たすう
初版しょはん 2005ねん12月21にち (18ねんまえ) (2005-12-21)
最新さいしんばん 2.46.0[1] ウィキデータを編集 - 2024ねん7がつ29にち (18にちまえ) [±]
リポジトリ ウィキデータを編集
プログラミング
言語げんご
C, Bourne Shell, Tcl, Perl
対応たいおうOS UnixけいLinuxWindowsmacOS
種別しゅべつ バージョン管理かんりソフトウェア
ライセンス GNU General Public License バージョン2,GNU Lesser General Public License 2.1
公式こうしきサイト git-scm.com ウィキデータを編集
テンプレートを表示ひょうじ

Git(ギット[2][3][4][5])は、プログラムソースコードなどの変更へんこう履歴りれき記録きろく追跡ついせきするための分散ぶんさんがたバージョン管理かんりシステムである。Linuxカーネルのソースコード管理かんりもちいるためにリーナス・トーバルズによって開発かいはつされ、それ以降いこうほかのおおくのプロジェクトで採用さいようされている。Linuxカーネルのようなきょだいプロジェクトにも対応たいおうできるように、動作どうさ速度そくど重点じゅうてんかれている。現在げんざいのメンテナは濱野はまのじゅん (英語えいご: Junio C Hamano) で、2005ねん7がつから担当たんとうしている。

Gitでは、かくユーザのワーキングディレクトリに、ぜん履歴りれきふくんだリポジトリ完全かんぜん複製ふくせいつくられる。したがって、ネットワークにアクセスできないなどの理由りゆう中心ちゅうしんリポジトリにアクセスできない環境かんきょうでも、履歴りれき調査ちょうさ変更へんこう記録きろくといったほとんどの作業さぎょうおこなうことができる。これが「分散ぶんさんがた」とばれる理由りゆうである。

背景はいけいおよび概要がいよう

[編集へんしゅう]

Linuxカーネルの開発かいはつでは、Linux Kernel Mailing List[※ 1]投稿とうこうされる多数たすうのパッチをメンテナーたちがソースコードに適用てきようするという形式けいしき採用さいようされている。これらの作業さぎょう効率こうりつてきおこなうため、当初とうしょBitKeeperというバージョン管理かんりシステムをもちいていたが、このソフトウェアは商用しょうようソフトウェアであった(クライアントはバイナリばんのみ無料むりょうで、サーバ商用しょうようだがBitMoverしゃ厚意こうい無料むりょう使つかえていた)。この状況じょうきょうこころよおもわない人々ひとびとがBitKeeperのクローンを実装じっそうしたことから、この環境かんきょう使つかえなくなってしまい(BitKeeper#ライセンス問題もんだいBitKeeper#価格かかく変更へんこう参照さんしょう)、その代替だいたいとして2005ねんにGitが開発かいはつされた[6]

Linuxカーネルの開発かいはつでは、巨大きょだいなソースコードの集合しゅうごうあつかうため、変更へんこうてん抽出ちゅうしゅつやリポジトリ操作そうさができるかぎり高速こうそくにできる必要ひつようがある。様々さまざまなバージョン管理かんりシステムをあたったが、満足まんぞくのいくものがなかったため、Gitではこのような問題もんだい出来できかぎ解決かいけつできるよう、いくつかのアイデアが導入どうにゅうされている(この部分ぶぶんは、のバージョン管理かんりシステムにも同様どうよう機能きのう導入どうにゅうされるようになった)。

作業さぎょうなが

[編集へんしゅう]

Gitは分散ぶんさんがたのソースコード管理かんりシステムであるため、リモートサーバとうにある中心ちゅうしんリポジトリの完全かんぜんなコピーを手元てもと(ローカル環境かんきょう)に作成さくせいして、そのローカルリポジトリを使つかって作業さぎょうおこなう。

一般いっぱんてき開発かいはつスタイルでは、大雑把おおざっぱえば、以下いかのようなステップのかえしで作業さぎょうおこなわれる:

  1. リモートサーバとうにある中心ちゅうしんリポジトリをローカルに複製ふくせいする (git clone)。
  2. ローカルでコンテンツの修正しゅうせい追加ついか削除さくじょおこない、ローカルリポジトリに変更へんこう履歴りれき記録きろくする (git commit)。必要ひつようおうじて過去かこ状態じょうたい閲覧えつらん復元ふくげんなどをおこなう。場合ばあいによってはこのステップをなんかえす。
  3. ローカルの変更へんこう内容ないよう中心ちゅうしんリポジトリに反映はんえいさせる (git push)。作業さぎょうしゃごとの変更へんこう内容ないよう衝突しょうとつすることもある。Gitが自動じどう解決かいけつできる場合ばあいもあれば、手動しゅどうでの解決かいけつ (git merge)が必要ひつようなこともある。
  4. 更新こうしんされた中心ちゅうしんリポジトリ(他者たしゃ作業さぎょう内容ないよう統合とうごうされている)をローカルの複製ふくせいにも反映はんえいする (git pull)。これによりローカル環境かんきょうのコードも最新さいしん内容ないようになるので、あらためてステップ2の作業さぎょうおこなう。

リポジトリあいだ通信つうしん (clone, pull, push) では以下いかのプロトコルが使用しようできる[7]

以前いぜんrsync使用しようできたが、2.8.0で廃止はいしされた[11]

設計せっけい

[編集へんしゅう]

Gitの設計せっけいBitKeeperMonotoneもとになっている[12][13]元々もともとのGitはローレベルなエンジンとして設計せっけいされていたが、これは、開発かいはつしゃCogitoStGITのようなフロントエンドを容易ようい開発かいはつできるようにすることを目的もくてきとしていた[14]現在げんざいでは、Gitのコア自体じたいもユーザから直接ちょくせつ利用りようできるようになっている[15]

Gitの設計せっけいには、リーナスがだい規模きぼプロジェクトのメンテナンスをおこなった経験けいけんや、ファイルシステムのパフォーマンスにかんするふか知識ちしき、また実用じつようせいのあるシステムを短期間たんきかん作成さくせいしなければならないというせまった必要ひつようせいBitKeeper参照さんしょう)が反映はんえいされている。これらの影響えいきょうは、以下いかのようなかたち実装じっそうあらわれている。

  • ノンリニアな開発かいはつスタイルにたいする強力きょうりょくなサポート。Gitではブランチやマージが高速こうそくおこなえる。また、ノンリニアな開発かいはつ履歴りれき可視かし・ナビゲートするための専用せんようのツールをどうこりしている。また、ツリーにたいする1かい変更へんこうたいして、ふくすうかいのマージが発生はっせいするという前提ぜんていいているが、これは変更へんこうてん複数ふくすうのレビュアーによってレビューされることを想定そうていしているためである。
  • 分散ぶんさん開発かいはつ分散ぶんさんがたバージョン管理かんりシステム(MercurialBitKeeperDarcsBazaarSVKMonotone)と同様どうように、Gitでも各々おのおの開発かいはつしゃがリポジトリの完全かんぜんなコピーをローカルに保持ほじしており、かく開発かいはつしゃおこなった変更へんこうのリポジトリにコピーされる。これらの変更へんこうあたらしい開発かいはつようブランチとしてインポートされる。また、ローカルな開発かいはつようブランチへのマージも可能かのうである。
  • HTTPFTP、gitプロトコル(ssh利用りようしたトンネリングも可能かのう)を使用しようしたリポジトリの配布はいふ可能かのう。また、CVSサーバのエミュレーション機能きのう使用しようすれば、既存きそんのCVSクライアントやIDEのプラグインからGitリポジトリにアクセスできる。
  • git-svnを使用しようすれば、Subversionおよびsvkのリポジトリを直接ちょくせつ操作そうさできる。
  • おおきなプロジェクトにおける処理しょり効率こうりつ。Gitは非常ひじょう高速こうそくかつスケーラブルになるよう記述きじゅつされている[16]Mozillaによっておこなわれたパフォーマンステストでは、のリビジョンコントロールシステムと比較ひかくして10ばい処理しょりによっては100ばい高速こうそく動作どうさすることがしめされた[17][18]
  • ツールキットされた設計せっけい。gitはC言語げんごかれたプログラム一式いっしきと、それらのラッパーとなるなんほんかのシェルスクリプト構成こうせいされている[19]。GitをWindowsに移植いしょくする過程かていで、シェルスクリプトのほとんどはC言語げんごなおされた。しかし、現在げんざいでも複数ふくすうのコンポーネントをつなげることで複雑ふくざつ処理しょり容易よういおこなえるような設計せっけいになっている[20]
  • プラガブルなマージアルゴリズム。Gitでは不完全ふかんぜんなマージにたいするすぐれたモデルおこなわれている。また、不完全ふかんぜんなマージを補完ほかんするアルゴリズムも複数ふくすう存在そんざいする。最終さいしゅうてき自動的じどうてきなマージがおこなえなかった場合ばあいには、ユーザによる編集へんしゅう必要ひつようであるむねがユーザに通知つうちされる。
  • ガベージコレクションおこなわれない。操作そうさ中断ちゅうだんしたり変更へんこうしをおこなった場合ばあい、データベースちゅうには不要ふようなデータがのこったままになる。これらのデータは操作そうさ対象たいしょうのオブジェクトの履歴りれき比例ひれいしておおきくなる。git-gc --pruneコマンドを使用しようして明示めいじてきにガベージコレクションをおこなうこともできるが、この処理しょりには時間じかんがかかる[21]

Gitの特徴とくちょうひとつとして、ディレクトリツリーにたいするスナップショットを作成さくせいするてんげられる。初期しょきのバージョン管理かんりシステム(SCCSRCS)では、個々ここのファイルを処理しょり対象たいしょうとしており、直近ちょっきんのバージョンにたいして差分さぶん符号ふごうおこなうことでリポジトリのサイズを縮小しゅくしょうすることに機能きのう重点じゅうてんかれていた。以降いこうのバージョン管理かんりシステムでも、この「プロジェクトない複数ふくすうバージョンにまたがってひとつのファイルを追跡ついせきできる」という概念がいねん継承けいしょうされていた。

一方いっぽう、Gitではこのコンセプトを使用しようしていない[22]。その結果けっかとして、Gitはソースコードツリーちゅうのファイルのリビジョンあいだ関係かんけいせい記録きろくしなくなっている。これにより、Gitは以下いかのような特徴とくちょうをもつようになっている。

  • プロジェクト全体ぜんたい変更へんこう履歴りれき調しらべるよりも、ひとつのファイルの変更へんこう履歴りれき調しらべるほう時間じかんがかかる[23]特定とくていのファイルの変更へんこう履歴りれき取得しゅとくする場合ばあい、Gitはツリーの履歴りれき全体ぜんたい走査そうさし、かくリビジョンでそのファイルに変更へんこうがあったかどうか調査ちょうさする必要ひつようがある。ただしこの処理しょり手順てじゅんでは、ひとつのファイルにたいしても、任意にんいのファイルの集合しゅうごうたいしても、ほぼおな時間じかん履歴りれき調査ちょうさおこなえる。よくおこなわれる処理しょりとしては、たとえば「ソースツリーちゅうのあるサブディレクトリと、それに関係かんけいするヘッダファイルの調査ちょうさおこなう」といったものがある。
  • ファイルめい変更へんこう明示めいじてきあつかわない。CVSにたいしてよくげられる不満ふまんとして、ファイルのリネームや移動いどうおこなうと変更へんこう履歴りれき途切とぎれてしまう問題もんだいがある。これは、変更へんこう履歴りれき識別しきべつにファイルめい使用しようしているためである。CVS以降いこう開発かいはつされたバージョン管理かんりシステムのおおくでは、管理かんり対象たいしょうのファイルにたいしてファイルめいより寿命じゅみょうながい、内部ないぶてき名前なまえinode番号ばんごうのようなもの)を付与ふよすることでこの問題もんだい解決かいけつしている。一方いっぽう、Gitではそのような内部ないぶめい使用しようしておらず、そのてん長所ちょうしょであるとしている[24][25]。プログラムのソースコードたいしては、リネームのほかにも分割ぶんかつやマージといった処理しょりおこなわれる[26]。これらの処理しょり単純たんじゅんにファイルのリネームとして十把一絡じっぱひとからげにあつかうと、実際じっさいにソースコードツリーにたいしておこなわれた処理しょりなにであるか不明瞭ふめいりょうなまま履歴りれき記録きろくされてしまう。Gitでは、リネームの検出けんしゅつをスナップショット作成さくせいではなく履歴りれきのブラウズのさいおこなうことでこの問題もんだい解決かいけつしている[27]。(単純たんじゅんかんがえれば、リビジョンNなかのあるファイルにたいして、リビジョンN-1ちゅうおな名前なまえのファイルがあれば、それがもとファイルとかんがえられる。しかし、リビジョンN-1ちゅうたような名前なまえのファイルがない場合ばあいもある。この場合ばあいGitは、リビジョンN-1のみに存在そんざいし、かつたような内容ないようのファイルを検索けんさくする。)しかし、この処理しょり履歴りれき表示ひょうじおこなたびCPU負荷ふかのかかる処理しょり必要ひつようとなる。そのため、使用しようするヒューリスティックを選択せんたくするオプションが提供ていきょうされている。

リポジトリの保存ほぞん方法ほうほうについては批判ひはんもある。

  • Gitはあたらしく作成さくせいされたオブジェクトを個別こべつのファイルのかたち保存ほぞんする。かくファイルは圧縮あっしゅくされて保存ほぞんされるが、そうであったとしてもこの方法ほうほう記録きろく領域りょういき大量たいりょう必要ひつようとするため効率こうりつてきである。Gitはこの問題もんだいを“pack”を使用しようすることで解決かいけつしている。複数ふくすうのオブジェクトはひとつのファイル(またはネットワークバイトストリーム)のかたちにパックされ、かくpackあいだ差分さぶん圧縮あっしゅくおこなわれる。packの差分さぶん圧縮あっしゅくにはヒューリスティックもちいられる。たとえば、おな名前なまえのファイルは内容ないようである可能かのうせいたかいものとして処理しょりされる。ただし、リポジトリの正確せいかくせいたもつため、ヒューリスティックに完全かんぜん依存いぞんすることはない。現在げんざいのGitでもあたらしく作成さくせいされたオブジェクト(あたらしくくわえられた履歴りれき)はまず単一たんいつのファイルとして保存ほぞんされるため、空間くうかん効率こうりつたかたもつためには定期ていきてきさいパックが要求ようきゅうされる。Gitはこの定期ていきてきさいパックを自動的じどうてきおこなうが、git gcコマンドを使用しようすることで手動しゅどうさいパックをおこなうこともできる。

Gitは以下いかのマージアルゴリズムを実装じっそうしている。アルゴリズムはマージ選択せんたくすることができる[28]

resolve
従来じゅうらいどおりの3-wayマージアルゴリズムを使用しようする。
recursive
3-wayマージの変種へんしゅ使用しようする。ブランチのmergeやpullをおこな場合ばあいのデフォルトである。3-wayマージにおいて共通きょうつう祖先そせん複数ふくすうある場合ばあい共通きょうつう祖先そせんからのmerge treeを作成さくせいし、それをreference treeとして3-wayマージをおこなう。Linuxカーネル2.6の開発かいはつおこなわれたマージコミットの履歴りれきから、このアルゴリズムを使用しようするとマージの衝突しょうとつすくなく、マージれもなかったことが報告ほうこくされている。さらに、リネームをともなうマージにたいしても検出けんしゅつおよび処理しょり可能かのうである[29]
octopus
3つ以上いじょうのheadからのマージをおこな場合ばあいのデフォルトである。

歴史れきし

[編集へんしゅう]

名前なまえ由来ゆらい

[編集へんしゅう]

リーナス・トーバルズによれば[30]

ぼく自己じこ中心ちゅうしんてきやつだから、自分じぶんのプロジェクトには自分じぶんにちなんだ名前なまえけるようにしているんだ。最初さいしょLinuxで、今度こんどはGitだ。

英語えいごのスラングとして、Gitには「バカ」「間抜まぬけ」といったるい意味いみがある。この自虐じぎゃくネタはもちろん皮肉ひにくで、これはリーナスがLinuxの名前なまえめるさい自身じしん名前なまえにちなんだ名前なまえけるよう強要きょうようされたことからている。(Linux#名前なまえ由来ゆらい参照さんしょう)

Gitのオフィシャルサイトのウィキでは、“Git”という名前なまえたいしてほかにもいくつかの解釈かいしゃくがなされている。れいとしてはGlobal Information Trackerなどがげられる[31]

開発かいはつ初期しょき歴史れきし

[編集へんしゅう]

Gitの開発かいはつは、Linuxカーネルの開発かいはつしゃおおくがBitKeeperのシステムにたいするアクセスを禁止きんしされたことにはしはっしている(BitKeeper#価格かかく変更へんこう参照さんしょう)。これは、アンドリュー・トリジェル (Andrew Tridgell) がプロプラエタリなソフトウェアであるBitKeeperのプロトコルをリバースエンジニアリングしたことにたいし、BitKeeperの著作ちょさくしゃであるラリー・マクボイがこれをライセンス違反いはんであるとして、BitKeeperの無料むりょう提供ていきょうめたためである。Linux.conf.au 2005のキーノートにおいて、トリジェルはこのリバースエンジニアリングの手順てじゅんについて説明せつめいおこなったが、内容ないようはBitKeeperのサーバの適切てきせつなポートにtelnetでアクセスし“help”とタイプするだけという単純たんじゅんなものだった[32]

リーナスはBitKeeperとおなじように使つかえる分散ぶんさんがたバージョン管理かんりシステムをさがしていたが、無料むりょうのシステムでかれ要求ようきゅうとく速度そくどめんでの要求ようきゅう)に適合てきごうするものはつからなかった。リーナスがいたメールによると、2005ねん4がつ7にちごろ最初さいしょプロトタイプ作成さくせいしていたようである[33]

だけど、ぼくSCMたちはそれ(bk pull相当そうとうのこと)をするのが大変たいへんだったんだ。ぼくがやろうとしていることの1つは(じつはこれが一番いちばんなんだけど)その過程かてい十分じゅうぶん効率こうりつてきにすること。もし1つのパッチを適用てきようしてその変更へんこう境界きょうかい記録きろくするなどするのに30びょうかかったとすると(正直しょうじき、Linux規模きぼのプロジェクトで30びょうっていうのは大抵たいていのSCMでははやいほうの見積みつもりだけど)、250つうたとえばAndrew[※ 2]同期どうきするときにはけっしてめずらしいりょうじゃない)のメールパッチを適用てきようするのに2あいだかかることになる。

BKはスピードきょうではなくて、(のSCMと比較ひかくするとBKは1けたか2けたくらいは高速こうそくだけど)Andrew[※ 2]とマージをするときに1メールにつきやく10-15びょうかかっていた。だけど、BKではそれはおおきな問題もんだいにならなかったんだ。BK⇔BKあいだのマージは簡単かんたんだから、ぼく主要しゅよう開発かいはつしゃとは時間じかんがかかるメールでのマージをしたことはなかったから。パッチアプリケーションにもとづいたSCMにするなら、"マージ機能きのう" をBKよりもはやしなければならなくなる。それは本当ほんとう本当ほんとう大変たいへんなこと。

だから、ぼくはいまスクリプトをいていて、変更へんこうをずっとはや追跡ついせきできるようにしているんだ。最初さいしょ目標もくひょうはパッチを適用てきようするのとおなじくらい高速こうそくにそれをおこなうこと。だけどはっきりいって、いまのところできたのはおお見積みつもってもまだ半分はんぶんくらいで、おもわぬ障害しょうがいにぶつかったら全然ぜんぜんうそになるかもしれないけど。いずれにせよ、ぼくがそれをすぐにできる理由りゆうは、ぼくのスクリプトがSCMではないからで、とても特別とくべつで "Linuxの状態じょうたい記録きろくする" ようなものだからなんだ。それはリニアなパッチを十分じゅうぶん効率こうりつてき時間じかんでマージできるようになるだろう。

(パッチの適用てきようが3びょうでできるなら、おおきな1つながりのパッチでも問題もんだいにはならない: 途中とちゅう失敗しっぱいしても1ふんか2ふんがつくなら、それで十分じゅうぶんで、手作業てさぎょう修正しゅうせいすることができる。時間じかん重要じゅうよう理由りゆうはそこにある。-- "オフライン" で効果こうかてきにそれができるなら、問題もんだいきたときぼく定義ていぎどおりそれを修理しゅうりできずにいるだろう)

リーナスは以下いかのような原則げんそくもとづいて設計せっけいおこなっている。

  1. CVSを「わる見本みほん」とする。設計せっけいじょうのことで確信かくしんてない場合ばあいは、CVSとぎゃく決断けつだんをする。リーナスは冗談じょうだんめかして以下いかのようにかたっている。
    • “カーネルメンテナンスの最初さいしょの10年間ねんかんぼくらは文字通もじどおりtarボールとパッチを使つかっていた。CVSよりもずっとすぐれたソース管理かんりシステムさ。ぼく営利えいり企業きぎょうトランスメタ[34])でCVSを7年間ねんかん使つかわされたことで、CVSを強烈きょうれつにくむようになった。CVSを強烈きょうれつにくんでいるとときには、このこともっておかなくちゃいけないね。観衆かんしゅうなかにSVN (Subversion) のユーザがいるなら、このからったほうがいいかもしれない。ぼくがCVSを強烈きょうれつ嫌悪けんおしているということは、ぼくがSubversionが史上しじょう最大さいだい無意味むいみなプロジェクトであるとおもっていることも意味いみしているんだ。Subversionのしばらくのスローガンは‘ちゃんとCVSをやる’とかそんなものだったよね。そんなスローガンからはじめたら、どこにも辿たどりつけないよ。CVSをちゃんとやるなんて不可能ふかのうなのさ。”[35]
  2. 分散ぶんさんがたの、BitKeeperのようなワークフローをサポートする。
    • “BitKeeperだけが、「まあ使つかってもいいかな」と最初さいしょおもわせてくれたSCMだというわけではないけれど、BitkeeperはSCMというものの存在そんざい意義いぎと、実際じっさいにどう使つかうことができるのかをおしえてくれた。だから、Gitは技術ぎじゅつてき観点かんてんとかいろんなところでBitkeeperとは随分ずいぶんちがうものになっているけど(それはもうひとつの設計せっけい目標もくひょうでもある。Bitkeeperのクローンではないことをはっきりさせたかったから)、Gitのワークフローのおおくは、Bitkeeperがおしえてくれたフローから直接ちょくせつきたものになっているんだ。”[35]
  3. データ破壊はかいたいする強力きょうりょく抑止よくし機能きのう。データ破壊はかいは、偶然ぐうぜんによるものと意図いとてきなものの両方りょうほう想定そうていしている[36][35]
  4. 非常ひじょうたか処理しょり速度そくど

最初さいしょの3つの条件じょうけんによって、既存きそんのバージョン管理かんりシステムはMonotoneのぞすべせんれてしまい、4つ条件じょうけん該当がいとうするものがなくなってしまった[35]。そのため、Linuxカーネル2.6.12-rc2のリリース直後ちょくご[35]、リーナスは自分じぶん開発かいはつはじめた[35]

Gitの開発かいはつは2005ねん4がつ3にち開始かいしされた[37]。プロジェクトとしてのアナウンスは4がつ6にちおこなわれ[38]、4がつ7にちにはセルフホスティングされるようになった[37]。4月18にちには複数ふくすうのブランチからのマージが最初さいしょおこなわれた[39]。4月29にちにはリーナスの目標もくひょうとしていた処理しょり速度そくど実現じつげんされた。Linuxのカーネルツリーにパッチをてるベンチマークで、初期しょきのGitでは毎秒まいびょう6.7のパッチを処理しょりしている[40]。6月6にちには、GitによるLinuxカーネル2.6.12のリリースがおこなわれた[41]

BitKeeperからの影響えいきょうで、リーナスは従来じゅうらいおなじようなアプローチを意図いとてきけており、結果けっかとしてGitは非常ひじょうにユニークな設計せっけいになっている[42]技術ぎじゅつけたユーザがGitを利用りようできるようになるレベルまではリーナスが開発かいはつおこなっており、その、2005ねん6がつ26にちにはプロジェクトへの主要しゅよう貢献こうけんしゃであった濱野はまのじゅん (Junio C Hamano) にメンテナンスががれた[43]濱野はまのは2005ねん12月21にちにバージョン1.0のリリースをおこな[44]、2021ねん5がつ現在げんざいかれがメンテナンスをおこなっている。

ブランチモデル

[編集へんしゅう]

ソフトウェア開発かいはつにおけるGitブランチの作成さくせい更新こうしんモデルをブランチモデルぶ。

GitHub flowはブランチモデルの一種いっしゅである[45]。GitHub flowの方針ほうしんは「masterブランチはつねにデプロイ可能かのう」である[46]。コードの変更へんこうおこなさいにはトピックを名称めいしょうとするブランチをmasterからforkする。マージふく他者たしゃからの意見いけん募集ぼしゅう・レビューをおこなさいにはpull request(merge request)をもちいる。pull request自動じどうテスト(c.f. 継続けいぞくてきインテグレーション)をおこなうことでmergeの安全あんぜんせい確保かくほし、masterつね正常せいじょう = デプロイ可能かのうたもたれる。GitHub flowが有効ゆうこう分野ぶんや継続けいぞくてきデリバリー継続けいぞくてきデプロイメント有効ゆうこう分野ぶんやたとえばWebサービスがげられる。

2011ねん提唱ていしょう比較ひかくして、GitHubしゃではモデルの一部いちぶ変更へんこうしている。オリジナルのGitHub flowでは更新こうしんmasterへマージされ、そこからデプロイされる。GitHubしゃではレビュー(CI)のtopic branchが最終さいしゅうテストとしてプロダクション環境かんきょうへデプロイされる。そこで問題もんだいがないと確認かくにんされたのちにmasterへmergeされている[47]。このモデル変更へんこうにより、CIで判明はんめいしなかったバグが発生はっせいした場合ばあいmasterのrevert commitではなくmasterさいデプロイで対応たいおうできる。

Gitはブランチのマージ(merge)に対応たいおうしている。

マージがおこなわれるとマージコミットえい: merge commit)が生成せいせいされる。コンフリクトが発生はっせいしない場合ばあいgit mergeがマージコミットを自動じどう生成せいせいする[48]。コンフリクトが発生はっせいした場合ばあい、まず安全あんぜん範囲はんいがマージされインデックスとワーキングツリーが更新こうしんされる[49]自動じどうマージできないコンフリクトは、ワーキングツリーに特定とくてい記法きほう両方りょうほう変更へんこう併記へいきされた状態じょうたいになる[50]。ユーザーによるコンフリクト修正しゅうせいgit addをおこない、git commitあるいはgit merge --continueをおこなってはじめてマージコミットが生成せいせいされる[51]

マージコミットの実体じったいは2つ以上いじょうのparent属性ぞくせいつただのコミットオブジェクトである(特別とくべつなGitオブジェクトではない)[52]通常つうじょうのコミットオブジェクトと同様どうよう変更へんこうファイルセットがtreeに記録きろくされ、更新こうしんもととなっている(複数ふくすうの)コミットがparentに設定せっていされているだけである。

注釈ちゅうしゃく

[編集へんしゅう]

出典しゅってん

[編集へんしゅう]
  1. ^ 濱野はまの じゅん; "[ANNOUNCE Git v2.46.0"]; 出版しゅっぱん: 2024ねん7がつ29にち; 閲覧えつらん: 2024ねん7がつ29にち.
  2. ^ Tech Talk: Linus Torvalds on git. 該当がいとう時間じかん: 1ふん30びょう. 2014ねん7がつ21にち閲覧えつらん
  3. ^ Git - IT用語ようご辞典じてんe-words”. 2014ねん7がつ29にち閲覧えつらん
  4. ^ Gitとは”. クラウド・データセンター用語ようごしゅう/IDCフロンティア. 2024ねん8がつ4にち閲覧えつらん
  5. ^ 入門にゅうもんGit (ギット)”. Google Books. 2024ねん8がつ4にち閲覧えつらん
  6. ^ Scott Chacon「1.2 使つかはじめる-Gitりゃく」『Pro Git』https://git-scm.com/book/ja/v2/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E7%95%A5%E5%8F%B22021ねん3がつ7にち閲覧えつらん 
  7. ^ a b c d e Scott Chacon. “4.1 Git サーバー - プロトコル”. 2013ねん1がつ19にち閲覧えつらん
  8. ^ Scott Chacon; Ben Straub. “Pro Git 2nd Edition 4.6 Gitサーバー - Smart HTTP”. 2021ねん8がつ26にち閲覧えつらん
  9. ^ Git - user-manual Documentation” (英語えいご). 2021ねん8がつ26にち閲覧えつらん。 “(See also setup-git-server-over-http for a slightly more sophisticated setup using WebDAV which also allows pushing over HTTP.)”
  10. ^ git-clone(1) Manual Page” (英語えいご). 2017ねん6がつ14にち閲覧えつらん。 “in addition, ftp, and ftps can be used for fetching, but this is inefficient and deprecated; do not use it”
  11. ^ Documentation/RelNotes/2.8.0.txt” (英語えいご). 2017ねん6がつ14にち閲覧えつらん。 “The rsync:// transport has been removed.”
  12. ^ Linus Torvalds (5 May 2006). "Re: [ANNOUNCE] Git wiki". linux-kernel (Mailing list). 2009ねん3がつ3にち閲覧えつらん Gitのもととなったプログラムにかんする歴史れきしてき経緯けいい
  13. ^ Linus Torvalds (7 April 2005). "Re: Kernel SCM saga". linux-kernel (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  14. ^ Linus Torvalds (8 April 2005). "Re: Kernel SCM saga". linux-kernel (Mailing list). 2008ねん2がつ20日はつか閲覧えつらん
  15. ^ Linus Torvalds (23 March 2006). "Re: Errors GITtifying GCC and Binutils". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  16. ^ Linus Torvalds (19 October 2006). "Re: VCS comparison table". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  17. ^ Stenback, Johnny (2006-11-30), “bzr/hg/git performance”, Jst's Blog, http://weblogs.mozillazine.org/jst/archives/2006/11/vcs_performance.html 2008ねん2がつ20日はつか閲覧えつらん , "git diff"と"bzr diff"のベンチマーク結果けっか比較ひかく。ケースによっては、gitの処理しょり速度そくどはBazzarの100ばい以上いじょうになる。
  18. ^ Roland Dreier (2006ねん11月13にち). “Oh what a relief it is”. 2009ねん3がつ3にち閲覧えつらん, "git log"は"svn log"と比較ひかくして100ばい以上いじょう高速こうそくだが、これは後者こうしゃはリモートのサーバにアクセスする必要ひつようがあるためである。
  19. ^ Linus Torvalds (18 October 2006). "Re: VCS comparison table". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん, Gitのスクリプト指向しこうデザインについて
  20. ^ iabervon (2005ねん12月22にち). “Git rocks!”. 2009ねん3がつ3にち閲覧えつらん, Gitを使つかったスクリプトのきやすさにかんする賞賛しょうさん
  21. ^ Git User's Manual” (2007ねん8がつ5にち). 2009ねん3がつ3にち閲覧えつらん
  22. ^ Linus Torvalds (10 April 2005). "Re: more git updates." linux-kernel (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  23. ^ Bruno Haible (11 February 2007). "how to speed up "git log"?". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  24. ^ Linus Torvalds (1 March 2006). "Re: impure renames / history tracking". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  25. ^ Junio C Hamano (24 March 2006). "Re: Errors GITtifying GCC and Binutils". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  26. ^ Junio C Hamano (23 March 2006). "Re: Errors GITtifying GCC and Binutils". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん
  27. ^ Linus Torvalds (28 November 2006). "Re: git and bzr". Git (Mailing list). 2009ねん3がつ3にち閲覧えつらん, git-blameコマンドを使用しようしたソースファイルあいだのコードの移動いどう調査ちょうさについて
  28. ^ Linus Torvalds (2007ねん7がつ18にち). “git-merge(1)”. 2009ねん3がつ4にち閲覧えつらん
  29. ^ Linus Torvalds (2007ねん7がつ18にち). “CrissCrossMerge”. 2009ねん3がつ4にち閲覧えつらん
  30. ^ “After controversy, Torvalds begins work on git”. InfoWorld. (2005-04-19). ISSN 0199-6649. http://www.infoworld.com/article/05/04/19/HNtorvaldswork_1.html 2008ねん2がつ20日はつか閲覧えつらん. 
  31. ^ GitFaq: Why the 'git' name?”. 2007ねん3がつ21にち閲覧えつらん
  32. ^ Jonathan Corbet (2005-04-20), “How Tridge reverse engineered BitKeeper”, Linux Weekly News, http://lwn.net/Articles/132938/ 2009ねん3がつ26にち閲覧えつらん 
  33. ^ Linus Torvalds (7 April 2005). "Re: Kernel SCM saga." linux-kernel (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  34. ^ Linus Torvalds (31 October 2005). "Re: git versus CVS (versus bk)". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  35. ^ a b c d e f Linus Torvalds (3 May 2007). Google tech talk: Linus Torvalds on git. 該当がいとう時間じかん: 02:30. 2007ねん5がつ16にち閲覧えつらん
  36. ^ Linus Torvalds (10 June 2007). "Re: fatal: serious inflate inconsistency". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん Gitにおけるデータの完全かんぜんせいかんする設計せっけい目標もくひょうかんする概要がいよう説明せつめい
  37. ^ a b Linus Torvalds (27 February 2007). "Re: Trivia: When did git self-host?". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  38. ^ Linus Torvalds (6 April 2005). "Kernel SCM saga." linux-kernel (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  39. ^ Linus Torvalds (17 April 2005). "First ever real kernel git merge!". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  40. ^ Matt Mackall (29 April 2005). "Mercurial 0.4b vs git patchbomb benchmark". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  41. ^ Linus Torvalds (17 June 2005). "Linux 2.6.12". git-commits-head (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  42. ^ Linus Torvalds (20 October 2006). "Re: VCS comparison table". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん Git vs. BitKeeperの議論ぎろん
  43. ^ Linus Torvalds (27 July 2005). "Meet the new maintainer..." Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  44. ^ 濱野はまのじゅん (Junio C Hamano) (21 December 2005). "ANNOUNCE: GIT 1.0.0". Git (Mailing list). 2009ねん3がつ26にち閲覧えつらん
  45. ^ a b Scott Chacon (2011ねん8がつ31にち). “GitHub Flow”. 2020ねん5がつ31にち閲覧えつらん
  46. ^ "#1 - anything in the master branch is deployable.
    This is basically the only hard rule of the system."[45]
  47. ^ GitHub Guides”. 2020ねん5がつ31にち閲覧えつらん。 “With GitHub, you can deploy from a branch for final testing in production before merging to master.”
  48. ^ "A merged version ... is committed, and your HEAD, index, and working tree are updated to it."[git 1]
  49. ^ "Paths that merged cleanly are updated both in the index file and in your working tree."[git 1]
  50. ^ "When both sides made changes to the same area, however, Git cannot randomly pick one side over the other, and asks you to resolve it by leaving what both sides did to that area."[git 1]
  51. ^ "Edit the files into shape and git add them to the index. Use git commit or git merge --continue to seal the deal."[git 1]
  52. ^ "the branches to be merged must be tied together by a merge commit that has both of them as its parents."[git 1]
  1. ^ a b c d e git-merge - git 2020-11-01閲覧えつらん

関連かんれん項目こうもく

[編集へんしゅう]

外部がいぶリンク

[編集へんしゅう]