個人的Gitおすすめtips 7選

## はじめに
[フューチャー Advent Calendar](https://qiita.com/advent-calendar/2024/future) の11日目の記事です。
ある程度Gitを触ったことがある人向けの記事になります。
それぞれの章が独立しているので気になる部分だけ見てもらえれば幸いです。

## 個人用の無視ファイルの管理 (.git/info/exclude)
プロジェクトとしてGitに無視ファイルを追加する場合には `.gitignore` を使いますよね。
Gitに上げるべきではないが、検証用にGitディレクトリ配下に置きたい場合、`.git/info/exclude`を利用すると便利です。書き方は、`.gitignore`ファイルと同じです。
私は技術検証用のスクリプトを配置する場合などに利用してます。
VSCodeなどではデフォルトで `.git` ディレクトリが非表示にされているため、表示するように変更してます。

まとめるとそれぞれのパターンで差分無視する場合は以下の対応になります。
`assume-unchanged`, `skip-worktree`については次の章で紹介してます。

||Git管理されている|Git管理されてない|
|-|-|-|
|全体で差分無視したい|`git rm`|`.gitignore`に追加|
|ローカルでのみ<br>差分無視したい|`assume-unchanged`<br>`skip-worktree`|`.git/info/exclude`に追加|

## 管理ファイルのローカル差分無視 (assume-unchanged, skip-worktree)
すでにGit管理されているファイルの差分無視する方法として`assume-unchanged`, `skip-worktree`の機能があります。
コマンドは以下の通りになります。

対象ファイルを無視したい場合(どちらかのコマンドでOK)
```bash:対象ファイルを無視したい場合
$ git update-index --assume-unchanged {ignore file}
$ git update-index --skip-worktree {ignore file}
```

対象ファイルを無視を解除したい場合(どちらかのコマンドでOK)
```bash:対象ファイルを無視を解除したい場合
$ git update-index --no-assume-unchanged {ignore file}
$ git update-index --no-skip-worktree {ignore file}
```

`assume-unchanged`, `skip-worktree`で細かい挙動は変わります。
詳しく知りたい場合は別途調べていただけたらと思います。

無視したファイルを抽出したい場合は、以下のコマンドで確認可能です。
```bash:assume-unchanged, skip-worktreeの無視ファイル抽出
$ git ls-files -v | grep '^S'
```
`.gitignore`, `.git/info/exclude`と異なりコマンドを叩かないと見れないので、一覧を見るのは少し不便です。

私は、`.vscode/settings.json`を少し変えたい場合や、既存ファイルが環境依存でうまく動かず一時的に変更したい場合などに利用してます。
注意点としては、`assume-unchanged`, `skip-worktree`無視しているファイルに、更新が入りコンフリクトが発生すると解決が少し難しくなります。


## HTTPS方式での複数アカウント使い分け(アカウント名付きURL)
Githubなどで複数ユーザを切り替える際、`git clone` 時にアカウントIDをURLに含めることでアカウントを明示的に指定することが可能です。
例えばGithubで以下のようにそれぞれのリポジトリのユーザになっているとき
|アカウントID|組織|リポジトリ名|
|-|-|-|
|user_a|org_a|repo1|
|user_a|org_a|repo2|
|user_b|org_b|repo3|

以下のようにコマンドを実行することでアクセスするアカウントを使い分けできます。
```bash:Git cloneコマンド(https)
$ git clone https://user_a@github.com/org_a/repo1.git
$ git clone https://user_a@github.com/org_a/repo2.git
$ git clone https://user_b@github.com/org_a/repo3.git
```

コミットのユーザ名やemailを設定することは忘れないでください。

## SSH方式での複数アカウント使い分け(.ssh/configで複数ユーザ用意)
前章ではHTTPS方式での方法を記載しましたがSSH方式でもアカウント使い分け可能です。

```config:~/.ssh/config
Host github-a # user_aの接続情報
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_ed25519_user_a # user_a で発行した鍵
  TCPKeepAlive yes
  IdentitiesOnly yes

Host github-b # user_bの接続情報
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/id_ed25519_user_b # user_b で発行した鍵
  TCPKeepAlive yes
  IdentitiesOnly yes
```
のようにSSHのconfigの設定を行い、以下のコマンドで使い分けできます。
通常はgithub.comと指定するところを `Host`で指定した値に書き換える形です。

```bash:Git cloneコマンド(https)
$ git clone git@github-a:org_a/repo1.git
$ git clone git@github-a:org_a/repo2.git
$ git clone git@github-b:org_b/repo3.git
```

## 削除・変更してしまったブランチを救出する(git reflog)
リベースやブランチ削除により元のブランチが無くなったが、やっぱり戻したい場合に `git reflog`コマンドで救出できる場合があります。
ただ若干複雑かつデータを救えないケースもあるため、個人的には最終手段のような扱いになってます。

git reflogコマンドを叩くことでgit操作ログを見ることができます。
```bash:git reflog
$ git reflog
```
戻したい断面が見つかったら `git reset --hard HEAD@{1}` のようなコマンドを叩いて断面を戻します。

注意点として
* git操作ごとに行が増えるため過去のものほどたどりにくい
* git commitしていないファイルは救えない
    * コミット前に差分を消してしまった場合は救えない
などがあります。

私は、VSCodeなどのタイムライン機能で必要な差分がサルベージできることも多いため、`git reflog`コマンドはあまり活用せずに済んでいます。

## ブランチを指定してチェックアウト(git clone -b)
`git clone`をするとデフォルトブランチがクローンされます。
クローン後に別ブランチをチェックアウトしてもよいですが以下のコマンドでブランチ名を指定しつつクローンができます。
```bash:ターゲットブランチ指定のクローン
git clone -b target_branch
```
私は、Dockerfile内で特定ブランチをクローンする場合に利用したりしています。

## より安全なforce push(--force-with-lease)
こちらは知らなくてもgit GUIツールが裏で使っているかもしれませんが、
gitでリモートブランチを追記ではなく書き換える方法として`git push --force`と`git push --force-with-lease`の方式があります。
`--force-with-lease`を使うことでリモートとローカルでpush先を比較し、差分があったら失敗するようになります。
つまり、他の開発者が同一ブランチで開発していた場合にすでにPushされた変更を消してしまう可能性を下げられます。
```bash:より安全にpush
$ git push --force-with-lease origin main
```

注意点しては直前にfetchしてしまった場合にはローカルとリモートの差分が無くなるため、変更が消されてしまう可能性があります。
`--force-with-lease`を利用している場合であっても、Push前には改めてPush先のリモートブランチが想定通りの断面か確認しましょう。

## おわりに
最後までお読みいただきありがとうございます。
他の[フューチャー Advent Calendar](https://qiita.com/advent-calendar/2024/future) の記事もお読みいただけると幸いです。
弊社では[Gitブランチフロー規約](https://future-architect.github.io/coding-standards/documents/forGitBranch/git_branch_standards.html)を公開しておりますので、よろしければ合わせてお読みください。
皆さま、良いGitライフを！