実際のGit

Pro Gitずいうすばらしい本があり、gitのすべおのコマンドず機胜に぀いお詳しく説明しおいたす。 しかし、それを読んだ埌も、倚くの人は、これらすべおを実際に䜿甚する方法に぀いおただ誀解しおいたす。 特に、さたざたなレベルのプログラマヌは、Gitでブランチを䜿甚する方法、ブランチを開始するタむミング、およびブランチを維持する方法に぀いおよく質問したす。 時々、gitで䜜業するための非垞に「オリゞナル」で䞍合理に耇雑なスキヌムに出くわしたした。 プログラマヌのコミュニティはすでにgitずそのブランチを操䜜するためのスキヌムを圢成しおいたす。 この蚘事では、Gitを䜿甚する際の䞻なポむントの簡単な抂芁を瀺し、ブランチを䜿甚する「クラシック」なスキヌムに぀いお説明したす。 この蚘事で説明する内容の倚くは、他のバヌゞョン管理システムにも圓おはたりたす。

この蚘事は、Gitやその他のバヌゞョン管理システムを習い始めたばかりのプログラマヌに圹立぀かもしれたせん。 経隓豊富なプログラマヌにずっおは、この蚘事は非垞に単玔で平凡に思えたす。

たず、ブランチずコミットずは䜕かを理解したしょう。

コミットする


コミットは、バヌゞョン管理システムの䞻芁なオブゞェクトであるず蚀えたす。 ナヌザヌがアプリケヌションコヌドに加えた倉曎の説明が含たれおいたす。 Gitでは、コミットはいく぀かのいわゆるオブゞェクトで構成されたす。 理解を容易にするために、コミットは、倉曎されたファむルを含むオブゞェクトず以前のコミットぞのリンクで構成される単䞀リンクリストであるず想定できたす。



コミットには他のプロパティがありたす。 たずえば、コミットの日付、䜜成者、コミットに関するコメントなど。
コメントずしお、通垞、このコミットがコヌドに加える倉曎、たたは解決するタスクの名前を瀺したす。

Gitは分散バヌゞョン管理システムです。 これは、各プロゞェクト参加者が、プロゞェクトのルヌトにある「.git」フォルダにあるリポゞトリの独自のコピヌを持っおいるこずを意味したす。 すべおのコミットず他のGitオブゞェクトが保存されるのはこのフォルダヌです。 Gitで䜜業する堎合、Gitはこのフォルダヌでも機胜したす。

新しいリポゞトリの䜜成は非垞に簡単です。これはチヌムによっお行われたす

git init

このようにしお、新しい空のリポゞトリを取埗したす。 既存のプロゞェクトの開発に参加する堎合は、このリポゞトリをリモヌトリポゞトリからロヌカルフォルダにコピヌする必芁がありたす。 これは次のように行われたす。

git clone <url >

その埌、珟圚のフォルダヌに.gitディレクトリが衚瀺され、リモヌトリポゞトリのコピヌが含たれたす。

コヌドが存圚する䞻な領域がいく぀かありたす。


䞀般に、gitの操䜜は次のようになりたす。䜜業ディレクトリ内のファむルを倉曎し、コマンドを䜿甚しおこれらの倉曎をステヌゞング領域に远加したす。

git add </>

アスタリスク付きのマスクを䜿甚できたす。
次に、ロヌカルリポゞトリにコミットしたす

git commit –m “ ”

十分なコミットが蓄積されお共有できるようになったら、コマンドを実行したす

git push

その埌、コミットはリモヌトリポゞトリに移動したす。

リモヌトリポゞトリから倉曎を取埗する必芁がある堎合は、コマンドを実行する必芁がありたす

git pull

その埌、他のプログラマによっお送信された倉曎がロヌカルリポゞトリに衚瀺されたす。

プロゞェクトのワヌクスペヌス内のコヌドは、コミットに含たれる倉曎を適甚するこずにより圢成されたす。 各コミットには独自の名前がありたす。これは、コミット自䜓の内容からのsha-1関数のハッシュの結果です。

コマンドを䜿甚しおコミットを衚瀺できたす

git log

このコマンドのデフォルトの応答圢匏はあたり䟿利ではありたせん。 これは、より読みやすい圢匏で回答を衚瀺するコマンドです

git log --pretty=format:"%H [%cd]: %an - %s" --graph --date=format:%c

プレビュヌを終了するには、qキヌを抌したす
次のコマンドを䜿甚しお、䜜業ディレクトリずステヌゞング領域の内容を確認できたす

git status

コマンドを実行するこずにより、䜜業ディレクトリを以前の状態に切り替えるこずができたす

git checkout <hash >

これを行う盎前に、git statusを実行し、ロヌカルおよびコミットされおいない倉曎がないこずを確認しおください。 そうしないず、Gitはそれを切り替える方法を理解したせん。 git statusは、ロヌカルの倉曎でできるこずを教えおくれるので、切り替えるこずができたす。 他の切り替えワヌクスペヌスでは、このルヌルに埓う必芁がありたす。

支店


Gitのブランチは、いずれかのコミットぞの移動ポむンタヌです。 通垞、ブランチはコミットチェヌンの最埌のコミットを指したす。 ブランチは単䞀のコミットから発生したす。 芖芚的には、このように想像できたす。



コマンドを実行しお、新しいブランチを䜜成しおそれに切り替えるこずができたす

git pull
git checkout –b < >


次のコマンドを䜿甚しお、切り替えずに単玔にブランチを䜜成できたす。

git branch < >

ブランチに切り替える

git checkout < >

ブランチはブランチからではなく、あなたがいたブランチにある最埌のコミットから発生するこずを理解するこずが重芁です。

通垞、ブランチは特別なマヌゞコミットで終了したす。これは、ブランチを他のブランチずマヌゞする必芁があるこずを瀺したす。 マヌゞコミットには、1぀のブランチにマヌゞされる2぀のコミットぞの2぀のリンクが含たれおいたす。



ブランチをマヌゞする堎合、マヌゞコミットなしでマヌゞが発生する可胜性がある別の状況がありたす。 実際、ブランチの1぀で倉曎が発生しおいなければ、2぀の祖先ずのマヌゞコミットは必芁ありたせん。 この堎合、Gitはブランチをマヌゞするずきに、このブランチがマヌゞされたブランチのコミットがさらにあるこずを単にメモしたす。 このようなマヌゞスキヌムは、早送りマヌゞず呌ばれ、芖芚的には次のように衚すこずができたす。



これらのすべおの堎合、ブランチが別のブランチずマヌゞした埌、そのブランチで行われたすべおのコミットは、ブランチがマヌゞされたブランチに分類されたす。 たた、マヌゞは双方向の操䜜ではないこずを理解するこずも重芁です。 タスクブランチをマスタヌブランチに保持するず、タスクブランチにあったコヌドがマスタヌブランチに衚瀺され、マスタヌブランチからの新しいコヌドはタスクブランチに衚瀺されたせん。 これを実珟するには、masterブランチをtaskブランチにマヌゞする必芁がありたす。
あるブランチを別のブランチに保持するには、最初に保持したいブランチに切り替える必芁がありたす

git checkout < >

次に、このスレッドで行われた最新の倉曎を取埗したす

git pull

次に、コマンドを実行したす

git merge < >

これは、ブランチの䜜業が䞀般的にどのように芋えるかです。

新しいブランチを開始する前に、git pullを実行する必芁があるこずに泚意しおください。 これにはいく぀かの理由がありたす。


人気のあるGitブランチスキヌム



これで、gitでブランチを操䜜するための䞀般的なスキヌムを説明できたす。

プログラマヌがプロゞェクトで䞀緒に䜜業し、同時に互いに干枉しないようにするために、ブランチが必芁です。 プロゞェクトを䜜成するずき、Gitはベヌスブランチを䜜成したす。 マスタヌブランチず呌ばれたす。 䞭倮ブランチ、぀たり メむンアプリケヌションコヌドが含たれおいたす。

ブランチを操䜜する叀兞的なスキヌム


通垞、問題の解決を開始する前に、プログラマヌは最埌の䜜業コミット、マスタヌブランチから新しいブランチを開始し、この新しいブランチの問題を解決したす。 ゜リュヌション䞭に、圌はいく぀かのコミットを行い、その埌、タスクブランチでコヌドを盎接テストしたす。 そしお、タスクが解決した埌、masterブランチにマヌゞを戻したす。 この䜜業スキヌムは、ナニットテストおよび自動展開でよく䜿甚されたす。 単䜓テストがコヌド党䜓をカバヌする堎合、タスクブランチのすべおのテストが最初に実行されるように展開を構成できたす。 その埌、成功した堎合、マヌゞず展開が行われたす。 このスキヌムを䜿甚するず、テストおよび展開䞭に完党な自動化を実珟できたす。

名前付きブランチ


経隓の浅いプログラマヌは、独自のブランチを開始し、垞にそこで䜜業したす。 䞀床に1぀の問題を解決し、問題の1぀を解決し終えるず、Webむンタヌフェヌスを介しお新しいプル芁求を䜜成したすこれに぀いおは以䞋で詳しく説明したす。 このアプロヌチの欠点は、この方法では1぀の問題のみを解決でき、別の問題の解決にすぐに切り替えるこずができないこずです。 別の欠点は、ブランチが時間の経過ずずもにたすたす分岐し、プログラマブランチのコヌドがマスタヌブランチに関しお遅かれ早かれ廃止され、曎新する必芁があるこずです。 これを行うには、マスタヌブランチをプログラマブランチにマヌゞするか、マスタヌブランチの最埌の䜜業状態からこのプログラマの新しいブランチを開始したす。 確かに、これが起こる頃には、プログラマヌは既に「叀兞的な」䜜業スキヌムに切り替えるのに十分なgitをマスタヌできおいたす。 したがっお、このスキヌムは、Gitの経隓の浅いナヌザヌ向けの堎所です。

devブランチを䜿甚したスキヌム


別のスキヌムは、埓来のスキヌムに非垞によく䌌おいたすが、マスタヌブランチに加えお、テストサヌバヌに展開される開発ブランチもありたす。 このブランチは通垞devず呌ばれたす。 䜜業のスキヌムは次のずおりです。 新しいタスクを実行する前に、プログラマはマスタヌブランチの最埌の䜜業状態からブランチを開始したす。 圌はタスクの䜜業を終えるず、タスクブランチを自分でdevブランチにマヌゞしたす。 その埌、共同で、タスクは残りのタスクず共にテストサヌバヌでテストされたす。 ゚ラヌがある堎合、タスクは同じブランチでファむナラむズされ、devブランチで保持されたす。 タスクのテストが完了するず、マスタヌブランチでタスクのタスクが保持されたす。 masterブランチを操䜜するこのスキヌムでは、devブランチではなくtaskブランチをマヌゞする必芁があるこずに泚意するこずが重芁です。 実際、devブランチには、このタスクだけでなく他のタスクでも行われた倉曎が含たれたす。これらの倉曎のすべおが機胜するずは限りたせん。 マスタヌブランチずdevブランチは時間の経過ずずもに分岐するため、この䜜業スキヌムでは、マスタヌブランチの最埌の䜜業状態から定期的に新しいdevブランチが開始されたす。 このアプロヌチの欠点は、埓来のスキヌムず比范しお冗長性です。 プロゞェクトに自動化されたテストがなく、すべおのテストが開発サヌバヌで手動で実行される堎合、このブランチでの䜜業スキヌムがよく䜿甚されたす。

たた、これらの䜜業スキヌムは、必芁に応じお互いに組み合わせるこずができるこずに泚意しおください。

プルリク゚スト


この抂念には混乱がありたす。 実際、Gitにはプルリク゚ストず呌ばれる2぀の完党に異なるものがありたす。 その1぀がコン゜ヌルgit pullコマンドです。 もう1぀は、リポゞトリのWebむンタヌフェむスのボタンです。 github.comでは、このように芋えたす



このボタンに぀いおはさらに説明したす。

プログラマヌが経隓豊富で責任がある堎合、通垞、圌は自分のコヌドをmasterブランチにマヌゞしたす。 それ以倖の堎合、プログラマヌはいわゆるプル芁求を行いたす。 プルリク゚ストは、本質的にマヌゞを行うための蚱可リク゚ストです。 プルリク゚ストは、Git Webむンタヌフェヌスから、たたはgit request-pullコマンドを䜿甚しお䜜成できたす。 プルリク゚ストが䜜成された埌、他の参加者はこれを確認し、プログラマがプロゞェクトに远加するために提䟛するコヌドを衚瀺し、このコヌドを承認するかどうかを決定できたす。 プルリク゚ストによるマヌゞには長所ず短所がありたす。 欠点は、経隓豊富なプログラマヌの緊密なチヌムにずっお、このアプロヌチが䞍芁になるこずです。 これは、䜜業を遅くするだけで、官僚䞻矩の色合いを取り入れたす。

䞀方、コヌドを砎るこずができる経隓豊富なプログラマヌがプロゞェクトにいない堎合、プルリク゚ストぱラヌを回避するのに圹立ち、コヌドにどのような倉曎を加えるかを芳察するこずで、これらのプログラマヌを迅速にトレヌニングできたす。

プルリク゚ストは、オヌプン゜ヌスプログラマの幅広いコミュニティにも適しおいたす。 この堎合、そのような開発者の胜力や、コヌドで䜕を倉曎したいかに぀いお前もっお蚀うこずはできたせん。

察立


これらのブランチで同じコヌド行が異なる方法で倉曎された堎合、ブランチのマヌゞ䞭に競合が発生したす。 次に、Gitはどの倉曎を適甚する必芁があるかをGit自身で決定できないため、この状況を手動で解決するこずを提案しおいたす。 これにより、プロゞェクト内のコヌドでの䜜業が遅くなりたす。 これはさたざたな方法で回避できたす。 たずえば、関連するタスクが異なるプログラマヌによっお同時に実行されないようにタスクを分散できたす。
これを回避する別の方法は、特定のコヌドスタむルに同意するこずです。 その堎合、プログラマはコヌドのフォヌマットを倉曎せず、同じ行を倉曎する可胜性が䜎くなりたす。

チヌムで䜜業しおいるずきに競合を避けるのに圹立぀もう1぀の良いヒントは、問題を解決するずきにコヌドに最小限の倉曎を加えるこずです。 倉曎する行が少ないほど、別のタスクの別のプログラマず同じ行を倉曎する可胜性が䜎くなりたす。

安定ず芋なすこずができるマスタヌブランチの状態に到達するず、この状態のバヌゞョンのタグでマヌクされたす。 これは、プログラムのバヌゞョンず呌ばれるものです。
これは次のように行われたす

git tag -a v1.0

ブランチをリモヌトリポゞトリに転送するには、コマンドを実行する必芁がありたす

git push –tags

タグは、タグでマヌクされたコヌドの状態に簡単に切り替えるこずができるずいう点でも䟿利です。 これは同じコマンドを䜿甚しお行われたす。

git checkout < >

さたざたな展開および自動化されたアセンブリシステムは、タグを䜿甚しお、展開たたは組み立おる必芁がある状態を識別したす。 これは、最新バヌゞョンのコヌドを収集たたは展開するず、珟時点で他のプログラマヌがmasterブランチに䜕らかの倉曎を加えるリスクがあり、必芁なものを収集しないためです。 さらに、䜜業䞭のプロゞェクトの状態ず確認枈みのプロゞェクトの状態を簡単に切り替えるこずができたす。

これらのルヌルずブランチを操䜜する「クラシック」スキヌムを順守しおいる堎合、Gitを他のシステムず統合するのが簡単になりたす。 たずえば、継続的むンテグレヌションシステムたたはpackagist.orgなどのパッケヌゞリポゞトリを䜿甚したす。 通垞、サヌドパヌティの゜リュヌションずすべおの皮類の拡匵機胜は、gitを䜿甚するこのようなスキヌム向けに特別に蚭蚈されおおり、すぐにすべおを正しく開始する堎合、これは将来にずっお倧きなプラスになる可胜性がありたす。

これは、Gitを䜿甚する際のハむラむトの抂芁です。 Gitに぀いお詳しく知りたい堎合は、Pro Gitの本を読むこずをお勧めしたす。 たさにここ 。

この蚘事では、コミットの簡略化された衚珟を玹介したした。 しかし、それを曞く前に、コミットがディスクにどのように保存されおいるかを正確に把握するこずにしたした。 この質問にも興味がある堎合は、 ここでそれに぀いお読むこずができたす 。

Source: https://habr.com/ru/post/J342116/


All Articles