【Git】個人的に役立ったGitコマンドたち

# こんな時に使える Gitコマンド集
個人的に役立ったGitコマンドをつらつらと。


## リモートブランチとローカルブランチを作成する
前提として、githubでリポジトリを作成（リモートブランチ作成）＆ローカルに資材作成しておく。

①ローカルの資材をgit管理するための初期化（ローカルブランチ作成）
```
git init
```
②リモートブランチとローカルブランチを関連付けるためのコマンド
```
git remote add origin https://github.com/<username>/<repository name>.git
```
③リポジトリに対してローカルブランチをpush
```
git push -u origin main
```


## ローカルブランチを削除
ローカルブランチを削除するためのコマンド

```
git branch -D 削除したいブランチ名
```

必ず、削除したいブランチ以外のブランチに切り替えてから実行すること。
じゃないとエラーになる。
`-D`は未マージのブランチも削除できる強制削除なので、マージされてるローカルブランチだけ消したい場合、`-D`の代わりに`--merged`や`-d`を使う。

たくさんブランチがあって消すのが面倒な人向けに、**不要なローカルブランチをまとめて消すコマンド**
```
git branch | egrep -v "(^\*|残したいブランチ名1|残したいブランチ名2)" | xargs git branch -D
```
`(^\*|残したいブランチ名1|残したいブランチ名2)`の箇所に、残したいブランチを`|`で繋いでいけば、必要なブランチだけを残して、不要なローカルブランチを一気に削除可能。
※ windows端末では、`Git Bash`で実行しないとコマンドが使えないかもしれないです。


## リモートブランチをローカルブランチに取り込む
リモートブランチをローカルブランチに取り込むためのコマンド
他人と作業していて、変更を取り込む際に使用する
```
git fetch
git rebase origin/取り込みたいブランチ名

# 以下、例
git rebase origin/master
git rebase origin/20220505
```


## Conflict 解消時の操作
リモートブランチの最新状態を取り込んだ際に、ローカルブランチの Commit との Conflict が発生した場合の対処方法

```
# ローカルブランチでの作業をCommitする
git status
git add .
git commit -m "作業内容"

# リモートブランチの最新状態を取り込む
git fetch
git rebase origin/hoge  ←ここで Conflict発生

# Conflictを修正する（取り込むべき変更を取り込む）
# Conflict修正後、変更をStagingして、rebaseを継続する
git status
git add .
git rebase --continue
```
その後、リポジトリに対してローカルブランチをpushする
```
git push origin 作業ブランチ名
```

## 現在のブランチの作業履歴を確認したい
ブランチの派生やコミット履歴を確認したいときに。

### 各コミットをツリー形式で表示
```
git log --graph
```

```ruby:実行結果
* commit aaaaa (HEAD -> hoge, origin/hoge)
| Author: user1 <user1@example.com>
| Date:   Mon Dec 16 02:47:34 2024 +0900
| 
|     2024/12/15 最新コミット
| 
* commit bbbbb
| Author: user1 <user1@example.com>
| Date:   Fri Dec 13 10:15:48 2024 +0900
| 
|     2024/12/13 1つ前のコミット
| 
* commit ccccc
| Author: user2 <user2@example.com>
| Date:   Fri Dec 13 02:44:40 2024 +0900
```

### 各コミットを一行で表示
```
git log --oneline
```

```ruby:実行結果
aaaaa (HEAD -> hoge, origin/hoge) 2024/12/15 最新コミット
bbbbb 2024/12/13 1つ前のコミット
ccccc 2024/12/12 2つ前のコミット
ddddd (origin/master, master) 2024/12/11 masterの最新コミット
```

### 各コミットを特定ファイル単位で差分表示
```
git log -p path/to/file.tsx
```

```ruby:実行結果
commit aaaaa
Author: user1 <user1@example.com>
Date:   Fri Dec 13 02:44:40 2024 +0900

    2024/12/12 このコミットでの変更

diff --git a/app/_layout.tsx b/app/_layout.tsx
index 693d6ad..e5b60d6 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -1,42 +1,6 @@
-import { useState, useEffect } from 'react';
-import { loadAsync } from 'expo-font';
 import { Stack } from 'expo-router';
-import * as SplashScreen from 'expo-splash-screen';
```
パスは、実際に資材がある場所の絶対パス。
例）`/Users/user1/Git/TestApp/app/index.tsx`
ファイルに基づくすべての変更履歴が出るため、大量の変更があった場合にはどのコミットでの変更なのか見づらいことがある

### 各コミットを特定ファイル単位で差分表示２
```
git log --word-diff -p path/to/file.tsx
```

```ruby:実行結果
commit aaaaa
Author: user1 <user1@example.com>
Date:   Fri Dec 13 02:44:40 2024 +0900

    2024/12/12 コミット１での変更

diff --git a/app/_layout.tsx b/app/_layout.tsx
index 693d6ad..e5b60d6 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -1,42 +1,6 @@
[-import { useState, useEffect } from 'react';-]

    2024/12/12 コミット１での変更

diff --git a/app/_layout.tsx b/app/_layout.tsx
index 693d6ad..e5b60d6 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -1,42 +1,6 @@
[-import { useState, useEffect } from 'react';-]
[-import { loadAsync } from 'expo-font';-]
import { Stack } from 'expo-router';
[-import * as SplashScreen from 'expo-splash-screen';-]

[-// Prevent the splash screen from auto-hiding before asset loading is complete.-]
[-SplashScreen.preventAutoHideAsync();-]

commit bbbbb
Author: user2 <user2@example.com>
Date:   Tue Dec 10 01:27:57 2024 +0900

    2024/12/9 コミット２での変更

diff --git a/app/_layout.tsx b/app/_layout.tsx
index fe25ceb..693d6ad 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -11,24 +11,31 @@ const customFonts = {
};

export default function Layout() {
  {+//+} const [fontLoaded, setFontLoaded] = useState(false);
```
こちらもパスは、実際に資材がある場所の絶対パス。
各コミットの変更単位で差分が表示されるため、変更箇所が見やすい。