6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

フューチャーAdvent Calendar 2024

Day 11

個人的Gitおすすめtips 7選

Last updated at Posted at 2024-12-10

はじめに

フューチャー Advent Calendar の11日目の記事です。
ある程度Gitを触ったことがある人向けの記事になります。
それぞれの章が独立しているので気になる部分だけ見てもらえれば幸いです。

個人用の無視ファイルの管理 (.git/info/exclude)

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

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

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

管理ファイルのローカル差分無視 (assume-unchanged, skip-worktree)

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

対象ファイルを無視したい場合(どちらかのコマンドでOK)

対象ファイルを無視したい場合
$ git update-index --assume-unchanged {ignore file}
$ git update-index --skip-worktree {ignore file}

対象ファイルを無視を解除したい場合(どちらかのコマンドでOK)

対象ファイルを無視を解除したい場合
$ git update-index --no-assume-unchanged {ignore file}
$ git update-index --no-skip-worktree {ignore file}

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

無視したファイルを抽出したい場合は、以下のコマンドで確認可能です。

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

以下のようにコマンドを実行することでアクセスするアカウントを使い分けできます。

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方式でもアカウント使い分け可能です。

~/.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で指定した値に書き換える形です。

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操作ログを見ることができます。

git reflog
$ git reflog

戻したい断面が見つかったら git reset --hard HEAD@{1} のようなコマンドを叩いて断面を戻します。

注意点として

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

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

ブランチを指定してチェックアウト(git clone -b)

git cloneをするとデフォルトブランチがクローンされます。
クローン後に別ブランチをチェックアウトしてもよいですが以下のコマンドでブランチ名を指定しつつクローンができます。

ターゲットブランチ指定のクローン
git clone -b target_branch

私は、Dockerfile内で特定ブランチをクローンする場合に利用したりしています。

より安全なforce push(--force-with-lease)

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

より安全にpush
$ git push --force-with-lease origin main

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

おわりに

最後までお読みいただきありがとうございます。
他のフューチャー Advent Calendar の記事もお読みいただけると幸いです。
弊社ではGitブランチフロー規約を公開しておりますので、よろしければ合わせてお読みください。
皆さま、良いGitライフを!

6
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?