Git初心者がプログラムをGitHubに置いておく方法

GitHubを使ってプログラムをたまに管理しています。たまにしか使わないこともあって、コマンドを忘れることも多く備忘録としてメモしておきます。
いつかきちんと理解する際には記事[「Git でよく使われるコマンドにイラストによる説明を加えて1枚のチートシートにまとめてみた」](https://qiita.com/kozzy/items/b42ba59a8bac190a16ab)を参考にしようと考えています。

いつも間にかデフォルトブランチ名が変更されていました。このせいで大きく混乱しました・・・(2022/8追記)

https://www.publickey1.jp/blog/20/githubmainmastermain.html

# 前提と環境

- Ubuntu 18.0.4 LTSを使っています
- GitHubのアカウント作成済
- ローカルにGitインストール済

# 最初からGitHubで管理する場合の手順
最初からGitHubで管理する場合の手順を載せておきます。
## 1. GitHubにリポジトリ作成
[GitHub](https://github.com/)にブラウザでログインし、「New」ボタンを押してリポジトリを作成します。
<img width="302" alt="10.GitHub01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/8779c08e-5a1c-cca2-49f0-16658852e40e.png">

リポジトリ名などの情報を入力して、「Create Repository」ボタンを押します。
<img width="561" alt="10.GitHub02.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/297091c7-45ac-b7e3-4380-b394aad02606.jpeg">

コピーアイコンを押して後で使うリポジトリのURLをクリップボードにコピーしておきます。
<img width="741" alt="10.GitHub03.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/20a67998-1bdf-69a3-9071-422e131d905d.jpeg">


## 2. リポジトリのクローン
ターミナルからリポジトリをローカルにクローンします。

```bash
git clone <コピーしたリポジトリのURL>
```

## 3. 開発物追加
開発をしてプログラムが作成されたと仮定して"test.py"という空ファイルを作ります。

```bash
touch test.py
```

## 4. add
git管理にすべてを追加します。

```bash
git add .
```

GitHubに反映させたくないファイルやディレクトリがある場合には、".gitignore"というファイルを使って設定します**add の前に設定しておきましょう。** また、再設定させる場合には[「.gitignoreを再反映をさせる方法」](#gitignore%E3%82%92%E5%86%8D%E5%8F%8D%E6%98%A0%E3%82%92%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95)を見てください。

```bash
touch .gitignore
```

.gitignoreのパターンは以下のとおりです。記事[「.gitignore の書き方」](https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff)参照。**[.gitignoreテンプレート](https://github.com/github/gitignore)を参考にすると捗ります**:robot:

```:.gitignore
# 特定拡張子の除外(*は任意の文字のワイルドカード)
# .python cacheファイルの除外
*.pyc

# フォルダ除外
.idea/

# 特定ファイル名の除外
test.py

# フォルダ内の特定ファイル名の除外
test/test.py
```

## 5. コミットとPush
コミット時にコメントを追加。
PushをしてGitHubに反映させます。

```bash
git commit -m "Comment"
git push origin main
```

# プロプラム作成後にGitHubに保存したいと思った場合
開発中/後にGitHubに保存したいと思った場合の手順です。
## 1. GitHubにリポジトリ作成
これは[「最初からGitHubで管理する場合の手順」](#1-github%E3%81%AB%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E4%BD%9C%E6%88%90)と同じです。

## 2. 初期化
開発物のルートディレクトリでinitします。

```bash
# From root directory
git init
```

## 3. リモートリポジトリの追加
リモートリポジトリを追加します。GitHubのリポジトリ画面でコピーしたURLを使います。

```bash
git remote add origin <コピーしたリポジトリのURL>
```

## 4. Push
一度ローカルの内容をPushします。

```
git add .
git commit -m "comment"
git push origin main
```

これをしないと、以下のエラーが出ました。

https://qiita.com/r-wakatsuki/items/095d5d88d1288df6f9c6

## 5. Pull
追加したリモートリポジトリであるGitHubからPullをします。

```bash
git pull
```

## 6. Merge
Pullした内容とローカルリポジトリをマージします。Mergeしたことで、GitHubで登録した"README.md"がローカルに反映されます。
正直なところ、処理内容を正確に理解していないのですがこれをしないとPushでGitHubに反映しようとする時にrejectエラーが起きます。
記事[「初めてGitHubリポジトリにpushしたらrejectedエラーになったときの対応メモ」](https://qiita.com/takanatsu/items/fc89de9bd11148da1438)を参考にしました。

```bash
git merge --allow-unrelated-histories origin/main
```

## 7. add
git管理にすべてを追加します。.gitignoreでの設定に関しては[「最初からGitHubで管理する場合の手順」](#4-add)と同じです。

```bash
git add .
```

## 7. コミットとPush
コミット時にコメントを追加。
PushをしてGitHubに反映させます。

```bash
git commit -m "Comment"
git push origin main
```

# その他
## .gitignoreを再反映をさせる方法
Gitの追跡対象にした後に、「やっぱりいらなかった」と思うことは多々あります。その場合、インデックスからファイルを削除することで追跡対象から除外されます。

```bash
git rm --cached <FILE_NAME>
```

## 空ディレクトリを作る方法
logファイル保存などのために空ディレクトリを作っておきたい場合があります。その場合は、空ディレクトリに以下の".gitignore"ファイルを置いておきます。
記事[「空のディレクトリを維持するための、 .gitkeep と .gitignore の使い分け」](https://qiita.com/ndxbn/items/f124d2b183b60cb074e2)を参考にしました。

```:.gitignore
# .gitignoreのみが必要。
*
!.gitignore
```

## SSHの設定をしていない場合
SSHでのアクセスエラーが出たことがありました。

```bash
git@xxxx.xxx: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

こちらを参考に解決しました。Windowsだったので、"config"ファイルは不要でした。
[gitでPlease make sure you have the correct access rights and the repository exists. が出た時の対処法](https://qiita.com/GakuNaitou/items/81dbbd3ea6211af71648)