はじめに
フューチャー 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
で細かい挙動は変わります。
詳しく知りたい場合は別途調べていただけたらと思います。
無視したファイルを抽出したい場合は、以下のコマンドで確認可能です。
$ 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://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方式でもアカウント使い分け可能です。
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 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 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 --force
とgit push --force-with-lease
の方式があります。
--force-with-lease
を使うことでリモートとローカルでpush先を比較し、差分があったら失敗するようになります。
つまり、他の開発者が同一ブランチで開発していた場合にすでにPushされた変更を消してしまう可能性を下げられます。
$ git push --force-with-lease origin main
注意点しては直前にfetchしてしまった場合にはローカルとリモートの差分が無くなるため、変更が消されてしまう可能性があります。
--force-with-lease
を利用している場合であっても、Push前には改めてPush先のリモートブランチが想定通りの断面か確認しましょう。
おわりに
最後までお読みいただきありがとうございます。
他のフューチャー Advent Calendar の記事もお読みいただけると幸いです。
弊社ではGitブランチフロー規約を公開しておりますので、よろしければ合わせてお読みください。
皆さま、良いGitライフを!