# GitHub

## **GitHubの基本概念**

リポジトリ（Repository）: プロジェクトのソースコードやファイルの格納場所です。リポジトリは個別のプロジェクト単位で作成され、Gitのバージョン管理を利用して変更履歴を管理します。

* リモートリポジトリ（Remote Repository）: リモートサーバ上に存在するリポジトリで、チームメンバーとの共有やコードのバックアップ、協力的な開発を実現します。
* プルリクエスト（Pull Request）: コードの変更を提案し、他の開発者にレビューを依頼するための機能です。プルリクエストはコードの改善や新機能の追加など、プロジェクトへの変更を管理するために使用されます。
* アカウントのセットアップ: GitHubを使用するには、まずGitHubアカウントを作成する必要があります。公式ウェブサイト（<https://github.com）からアカウントを作成し、セットアップを完了させます。>

### **GitHubアカウントの作成と設定**

1. アカウントの作成: GitHubのウェブサイトにアクセスし、新しいアカウントを作成します。必要な情報（ユーザ名、メールアドレス、パスワードなど）を入力し、アカウントを作成します。
2. プロフィールの設定: GitHubアカウントにプロフィール情報（名前、写真、自己紹介など）を追加します。これにより、他の開発者とのコミュニケーションやコラボレーションが容易になります。
3. SSHキーの追加（オプション）: SSHキーを追加することで、リモートリポジトリへのセキュアなアクセスが可能になります。キーの生成と公開鍵の登録に関する手順に従って、SSHキーを追加します。

### **Tips:おすすめしたい設定**

通常プライベートリポジトリへのContributeは外部に見えませんが、Contribution settingsのところで "Private contributions" にチェックを入れることでプライベートリポジトリのアクティビティも外部に可視化されるようになります。（草が生えるだけで、どのOrgのどのリポジトリにコミットしたかなどは外部に表示されることはありません）

<figure><img src="https://2877287750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FaxtxZfDlibILWOsdodIY%2Fuploads%2FRmd1zIjS4jQlIEEXV5T0%2Fimage.png?alt=media&#x26;token=9888c598-ef4f-49eb-8318-37c1a8cbcba8" alt=""><figcaption></figcaption></figure>

エンジニアとしての活動をしっかり継続し、アウトプットをしているということを可視化することはあなたのキャリアにとってプラスに働くので、設定しておくとよいでしょう。

### **リモートリポジトリの作成と初期設定**

1. リポジトリの作成: GitHubのウェブサイトから、新しいリポジトリを作成します。リポジトリの名前、説明、公開/非公開などの設定を指定し、リポジトリを作成します。
2. ローカルリポジトリとの接続: 作成したリモートリポジトリをローカルリポジトリと接続するために、以下のコマンドを使用します。

   ```bash
   git remote add origin <リモートリポジトリのURL>
   ```
3. 初期コミットのプッシュ: 初期コミットを行い、作業内容をリモートリポジトリにプッシュするために、以下のコマンドを使用します。

   ```bash
   git push -u origin master
   ```

これらの手順に従うことで、GitHubアカウントの作成と設定、リモートリポジトリの作成と初期設定を行うことができます。これにより、GitHubを使用してソースコードの共有とバージョン管理を行う準備が整います。

## **リポジトリの管理と共同作業**

ローカルリポジトリとの連携、リモートリポジトリへのプッシュとプル、ブランチの作成と切り替え、プルリクエストの作成とレビューについて説明します。

### **ローカルリポジトリとの連携**

1. リモートリポジトリのクローン: リモートリポジトリをローカルにクローンするために、以下のコマンドを使用します。

   ```bash
   git clone <リモートリポジトリのURL>
   ```
2. ローカルリポジトリの追加とプッシュ: 既存のローカルリポジトリをリモートリポジトリと連携させ、変更をプッシュするために、以下のコマンドを使用します。

   ```bash
   git remote add origin <リモートリポジトリのURL>
   git push -u origin master
   ```

### **リモートリポジトリへのプッシュとプル**

* プッシュ: ローカルリポジトリの変更をリモートリポジトリにプッシュするには、以下のコマンドを使用します。

  ```bash
  git push origin <ブランチ名>
  ```
* プル: リモートリポジトリから最新の変更を取得してローカルリポジトリを更新するには、以下のコマンドを使用します。

  ```bash
  git pull origin <ブランチ名>
  ```

### **ブランチの作成と切り替え**

* ブランチの作成: 新しいブランチを作成するには、以下のコマンドを使用します。

  ```bash
  git branch <新しいブランチ名>
  ```
* ブランチの切り替え: 既存のブランチに切り替えるには、以下のコマンドを使用します。

  ```bash
  git checkout <既存のブランチ名>
  ```

### **プルリクエストの作成とレビュー**

1. プルリクエストの作成: 変更内容を他の開発者にレビューしてもらうために、プルリクエストを作成します。
   1. ブランチを作成または切り替えし、変更をコミットします。
   2. GitHubのウェブサイトから、作業ブランチとマージ先のブランチを指定してプルリクエストを作成します。
2. プルリクエストのレビュー: プルリクエストを受け取った他の開発者は、変更内容を確認し、コメントや修正の指示を行います。修正が必要な場合は、作業ブランチに追加のコミットをプッシュして修正を行います。

これらの手順に従うことで、リポジトリの管理と共同作業を効果的に行うことができます。チームメンバーとの協力や変更のレビューを通じて、品質の高いコードの開発とプロジェクトの進行が促進されます。

## コードのバージョン管理とコラボレーション

### **コードのコミットとプッシュ**

* コミット: 変更内容をローカルリポジトリに記録するために、以下のコマンドを使用します。

  ```bash
  git commit -m "コミットメッセージ"
  ```
* プッシュ: ローカルリポジトリの変更をリモートリポジトリにプッシュするには、以下のコマンドを使用します。

  ```bash
  git push origin <ブランチ名>
  ```

### **コードの変更履歴の確認と比較**

* 変更履歴の確認: コミット履歴や変更内容を確認するには、以下のコマンドを使用します。

  ```bash
  git log
  ```
* 変更の比較: コミット間やブランチ間の変更を比較するには、以下のコマンドを使用します。

  ```bash
  git diff <コミットまたはブランチ1> <コミットまたはブランチ2>
  ```

### **コードレビューの実施とコメント**

* コードレビューの実施: プルリクエストを使用して、他の開発者にコードレビューを依頼します。レビュワーは変更内容を確認し、コメントや指摘を行います。
* コメントの追加と議論: プルリクエスト上で、コメントを追加し、変更点に関する議論を行います。コメントはコードの特定の行やファイルに対して追加することができます。

### **マージとコンフリクトの解決**

* マージ: プルリクエストが承認された場合、変更内容をマージしてリポジトリに統合します。マージはプルリクエストページ上で行います。
* コンフリクトの解決: マージ時に複数のブランチで競合（コンフリクト）が発生した場合、手動でコンフリクトを解消する必要があります。コンフリクトの解決には、競合箇所を編集して修正し、マージを再度実行します。

これらの手順を通じて、コードのバージョン管理とコラボレーションを効果的に行うことができます。プルリクエストとコードレビューを通じて品質の高いコードを維持し、マージとコンフリクトの解決によりチームメンバーとの協力を促進します。

## プロジェクト管理とイシュートラッキング

プロジェクト管理とイシュートラッキングについて、プロジェクトボードの作成と管理、イシューの作成と割り当て、マイルストーンとラベルの管理、イシュートラッキングと進捗管理について説明します。

### **プロジェクトボードの作成と管理**

* プロジェクトボードの作成: プロジェクトのタスクや進捗を管理するために、プロジェクトボードを作成します。GitHubのウェブサイトからプロジェクトボードを作成し、カラムやラベルを設定します。
* カードの追加と移動: プロジェクトボード上にタスクやイシューのカードを追加し、カラム間で移動させることで、タスクの進捗状況を管理します。

### **イシューの作成と割り当て**

* イシューの作成: 問題や改善点などのイシューを作成します。GitHubのウェブサイト上でイシューを作成し、タイトルや説明、担当者などの情報を追加します。
* イシューの割り当て: イシューを担当者に割り当てることで、タスクの責任を明確にします。イシューのページ上で担当者を指定します。

### **マイルストーンとラベルの管理**

* マイルストーンの作成: プロジェクトの範囲や期限を設定するために、マイルストーンを作成します。マイルストーンはイシューやプルリクエストに関連付けることができます。
* ラベルの管理: イシューやプルリクエストにラベルを追加して、カテゴリや重要度などを管理します。ラベルはカスタムで作成することも可能です。

### **イシュートラッキングと進捗管理**

* イシュートラッキング: プロジェクトボードやイシューページ上でイシューの状態や進捗を追跡します。カードの移動やステータスの変更により、イシューの進行状況を可視化します。
* 進捗管理の報告: プロジェクトボードやイシューページ上の情報を参照して、進捗状況や課題を報告します。定期的な報告や会議でプロジェクトの進行状況を共有し、必要な調整を行います。

これらの手順を通じて、プロジェクト管理とイシュートラッキングを効果的に行うことができます。GitHubの機能を活用して、タスクの管理と進捗の追跡を行い、プロジェクトの成功に向けてチーム全体で協力します。

## チームでの協力とコラボレーション

チームでの協力とコラボレーションについて、チームメンバーの招待と役割設定、コードレビューのベストプラクティス、コミュニケーションとディスカッションのツール、ソーシャルコーディングとフォークの利用について説明します。

### **コードレビューのベストプラクティス**

* コードレビューの実施: チームメンバーがコードレビューを行うために、以下の手順を実行します。
  1. プルリクエストを作成し、変更内容をレビュー対象にします。
  2. プルリクエストのページで、レビュワーにレビューを依頼します。
  3. レビュワーはコードの変更点を確認し、コメントや指摘を追加します。
* コードレビューのベストプラクティス: コードレビューを効果的に行うためには、以下のベストプラクティスを実践します。
  * コメントは具体的で明確に行い、改善点や修正箇所を明示します。
  * コードスタイルや規約に従ってレビューを行い、一貫性を保ちます。
  * レビュワーは丁寧で建設的なフィードバックを提供し、共同作業を促進します。
  * レビュー後に修正が必要な場合は、適切なタイミングで再度レビューを依頼します。

### **コミュニケーションとディスカッションのツール**

* コミュニケーションとディスカッション: チームメンバーとのコミュニケーションやディスカッションを促進するために、以下のツールを活用します。
  * コメント: プルリクエストやイシューのコメント機能を使用して、コードやタスクに対する議論や意見交換を行います。
  * リアクション: コメントやイシューに対してリアクションを追加し、賛成や感謝などのフィードバックを示します。
  * リポジトリのWiki: プロジェクトのドキュメントやガイドラインをWikiページにまとめ、共有します。
  * チームのコミュニケーションツール: チャットツールやビデオ会議ツールを使用して、リアルタイムでのコミュニケーションを行います。

### **ソーシャルコーディングとフォークの利用**

* ソーシャルコーディング: 他の開発者とのコラボレーションや貢献を促進するために、GitHub上の他のプロジェクトに対して貢献することができます。フォークやプルリクエストを使用して、オープンソースプロジェクトへの貢献を行います。
* フォークの利用: オープンソースプロジェクトを自分のリポジトリにフォークし、変更を加えることができます。フォークしたリポジトリは自身のアカウント内で管理されます。

これらの手順を通じて、チームでの協力とコラボレーションを効果的に行うことができます。GitHubの機能とツールを活用して、チームメンバーとのコミュニケーションを円滑にし、プロジェクトの成果を最大化します。

## **GitHubの応用**

セキュリティと権限管理、自動化とワークフローの設定、CI/CDの統合とワークフローの自動化、GitHub Actionsの利用とカスタマイズ、プラグインと拡張機能の活用について説明します。

### **セキュリティと権限管理**

セキュリティ機能の活用: GitHubは多くのセキュリティ機能を提供しています。例えば、コードの脆弱性スキャンや依存関係の監視、セキュリティイベントの警告などがあります。これらの機能を活用して、プロジェクトのセキュリティを向上させます。

### **自動化とワークフローの設定**

* GitHub Actions: GitHub Actionsは自動化ツールであり、ワークフローの作成や実行をサポートします。以下の手順でワークフローを設定します。
  * `.github/workflows`ディレクトリにワークフローの設定ファイル（YAML形式）を作成します。
  * ワークフローのトリガーやジョブ、ステップを定義します。例えば、コードのビルド、テスト、デプロイなどのステップを定義することができます。
* ワークフローのトリガー: ワークフローを実行するトリガーを設定することができます。例えば、コードのプッシュ、プルリクエストの作成、タグの作成などがあります。

### **CI/CDの統合とワークフローの自動化**

* CI/CDの統合: GitHub Actionsを使用してCI/CDパイプラインを設定することで、コードのビルド、テスト、デプロイなどの自動化を実現します。以下の手順を使用してCI/CDパイプラインを設定します。
  * ワークフローの設定ファイルにビルドやテストのステップを追加します。
  * デプロイメントの設定を行い、デプロイ先の環境やデプロイコマンドを指定します。

### **GitHub Actionsの利用とカスタマイズ**

* 既存のアクションの利用: GitHub Marketplaceやオープンソースプロジェクトから既存のアクションを利用することができます。アクションはワークフローのステップとして組み込むことができ、さまざまな機能やタスクを実行することができます。
* カスタムアクションの作成: GitHub Actionsでは、独自のカスタムアクションを作成することもできます。カスタムアクションを作成することで、特定のワークフローに合わせて独自の機能や処理を追加することができます。

### **プラグインと拡張機能の活用**

GitHub Marketplace: GitHub Marketplaceは、さまざまなプラグインや拡張機能を提供しています。これらのプラグインや拡張機能を利用することで、GitHubの機能やワークフローをさらに拡張することができます。例えば、コード品質のチェック、カバレッジレポートの作成、プロジェクト管理ツールとの連携などがあります。

これらの手順や機能を活用することで、GitHubの応用的な機能を活かしてセキュリティの強化や自動化を実現し、開発プロジェクトの効率を向上させることができます。

## **GitHubのベストプラクティスと今後の学習**

リポジトリの構造と命名規則、ブランチ戦略とワークフローの最適化、イシューの効果的な管理とトラッキング、GitHubのパフォーマンスと最適化のヒント、サードパーティツールとの統合、今後の学習リソースについて説明します。

### **リポジトリの構造と命名規則**

* リポジトリの構造: プロジェクトに応じた適切なリポジトリの構造を作成することで、コードやファイルの整理と可読性を向上させます。一般的な構造には、ソースコード、ドキュメント、テスト、リソースなどのディレクトリが含まれる場合があります。
* 命名規則: リポジトリ、ブランチ、イシューなどの命名規則を統一することで、一貫性を保ちやすくなります。例えば、プロジェクトの名前や機能に基づいた意味のある名前を使用することが重要です。

### **ブランチ戦略とワークフローの最適化**

* ブランチ戦略: プロジェクトに適したブランチ戦略を選択することで、コードの安定性と並行開発を両立させることができます。一般的な戦略には、メインブランチ（主に`main`や`master`）、フィーチャーブランチ、リリースブランチ、ホットフィックスブランチなどがあります。
* ワークフローの最適化: GitHub Actionsやその他の自動化ツールを使用して、ワークフローを最適化します。ビルド、テスト、デプロイなどのステップを自動化し、開発プロセスを効率化します。

### **イシューの効果的な管理とトラッキング**

* イシューの作成と割り当て: 問題や改善点をトラッキングするために、イシューを活用します。イシューを作成し、優先度や担当者などの属性を適切に割り当てます。
* ラベルとマイルストーン: ラベルやマイルストーンを使用して、イシューをグループ化し、カテゴリ分けします。これにより、プロジェクト全体の進捗管理や優先順位の付け方が容易になります。

### **プルリクエストとレビューの効果的な運用**

* issueを自分の中で整理して小さなステップに分け、小さなステップごとにスコープを絞ったブランチを作成して、都度プルリクエストをします。
* レビュアがチェックすべきことのスコープを絞れると、クリアに効率的にレビューできるので、マージまでが速くなるというメリットがあります。
* プロジェクトによっては`pytest`が設定されています。その場合はテストをクリアしてからpushしてプルリクエストという流れになります。
  * 具体的なコーディングに取り組む前に、後々に問題の切り分けがしやくなるため、デフォルトでpytestをdryrunなどしておくとよい

### **GitHubのパフォーマンスと最適化のヒント**

* リポジトリのサイズと履歴の管理: 不要なファイルやディレクトリを削除し、大きすぎるファイルをGit LFS（Large File Storage）で管理するなど、リポジトリのサイズと履歴を最適化します。
* プルリクエストのレビュー: 大きな変更や長いコードの変更を避け、プルリクエストのレビューを効率的に行います。

### **サードパーティツールとの統合**

* GitHub Marketplace: GitHub Marketplaceには、プロジェクト管理ツール、連携ツール、品質管理ツールなど、さまざまなサードパーティツールがあります。これらのツールを利用して、プロジェクトの管理やワークフローの自動化を強化します。

### **今後の学習リソース**

* GitHub Learning Lab: GitHub Learning Labは、GitHubの基本や応用についての学習コースを提供しています。実際のプロジェクトを通じて学習することができます。
* GitHub Docs: GitHub公式のドキュメントは、GitHubの各機能やツールの詳細な説明や手順を提供しています。
* GitHub Community: GitHubのコミュニティフォーラムやディスカッションに参加し、他の開発者との交流や知識共有を行います。

これらのベストプラクティスと学習リソースを活用することで、GitHubの効果的な利用やプロジェクトの管理を向上させることができます。
