ワークフローを改善できるGitのヒント15選 #GitLab #Git
この記事は1年以上前に投稿されました。情報が古い可能性がありますので、ご注意ください。
本ブログは「GitLab」社のブログで2020年4月7日に公開された「15 Git tips to improve your workflow」の日本語翻訳です。
ワークフローを改善できるGitのヒント15選
投稿者:Suri Patel
2020年で、Gitが誕生してから15周年を迎えました。Git Merge 2020での体験や、Gitフローの問題、最新のGit機能であるPartial Clone など、Gitの誕生と影響について今まで様々な投稿をしてきました。
Gitを使い始めたばかりの人であっても、コマンドラインを使いこなすレベルの人であっても、自分自身のスキルを自己研磨する姿勢は素晴らしいものです。そこで今日は、Gitを使用してワークフローを改善できる15の方法を紹介します。
1. Gitのエイリアス
日々のワークフローを改善できる最もインパクトのある方法の1つは、一般的なコマンドのエイリアスを作成し、ターミナルでの作業時間を短縮することが挙げられます。
次のコマンドを使うと、最もよく使われる Git コマンドである checkout 、 commit 、 branch のエイリアスを作成できます。
git config --global alias.co checkout git config --global alias.ci commit git config --global alias.br branch
git checkout master と入力する代わりに、 git co master とだけ入力すればよいのです。
また、 ~/.gitconfig ファイルを直接修正することで、これらのコマンドの編集や追加ができます。
[alias] co = checkout ci = commit br = branch
2. ターミナルのプロンプトでリポジトリのステータスを見る
リポジトリのステータスを可視化したい場合は、 git-prompt.sh を実行してみましょう。(ダウンロードして、手順に従ってご利用中のシステムで使用できます。)Linuxを使用していて、パッケージマネージャでGitをインストールしている場合は、 /etc/bash_completion.d/. の下に、すでに存在しているかもしれません。
標準のシェルプロンプトを、もう少し面白いものに置き換えられます:
Oh-my- zsh の themes wiki からの引用:
3. コマンドラインからのコミットの比較
git diff コマンドを使用すると、同じファイルのコミットやバージョン間の差分を簡単に比較できます。
同じファイルの異なるコミット間を比較したい場合は、以下のコマンドを実行します:
$ git diff $start_commit..$end_commit -- path/to/file
2つのコミット間の変更点を比較したい場合は、以下のコマンドを実行します:
$ git diff $start_commit..$end_commit
これらのコマンドにより、ターミナル内でdiffビューを開けますが、もっと視覚的なツールを使ってdiffを比較したい場合は git difftool の使用をお勧めします。Meldは、diffを視覚的に比較するのに便利なビューア/エディタです。
Meldの設定:
$ git config --global diff.tool git-meld
diffの閲覧開始:
$ git difftool $start_commit..$end_commit -- path/to/file # or $ git difftool $start_commit..$end_commit
4. コミットされていない変更を一時的に隠す
プロジェクトのある機能に取り組んでいて、そのプロジェクトで緊急に修正を行う必要が生じた場合、問題に直面する可能性があります。まだ未完成の機能をコミットしたくない上、現在の変更点を失いたくもないはずです。 git stash コマンドでこれらの変更を一時的に隠せば、この問題を解決できます:
$ git stash
git stash コマンドにより、変更を隠せるようになり、クリーンな作業ディレクトリが確保できます。現在の状態を保存するために無意味なスナップショットをコミットすることなく、新しいブランチに切り替えて更新を行えます。
修正作業を終えて、以前の変更時点に戻したい場合は、以下のコマンドを実行します:
$ git stash pop
こうすることで、変更箇所が復元されます。
もし、これらの変更が不要になり、stashスタックをクリアしたい場合、以下のコマンドを実行します:
$ git stash drop
5. 頻繁にプルする
GitLab Flow を使用しているのであれば、フィーチャーブランチで作業していることを意味します。機能の実装にかかる時間にもよりますが、master ブランチには何度か変更が加えられる可能性があります。重大なコンフリクトを避けるには、master ブランチから自分のブランチに変更を頻繁にプルすべきです。これは、コンフリクトをできるだけ早く解決するためだけでなく、自分のブランチをmaster にマージしやすくするためでもあります。
6. オートコンプリートコマンド
コンプリートスクリプト を使えば、 bash 、 tcsh 、 zsh のコマンドを素早く入力できます。
git pull と入力したい場合、最初の文字だけを git p と入力し、その後に Tab を押すと、次のように表示されます:
pack-objects -- create packed archive of objects pack-redundant -- find redundant pack files pack-refs -- pack heads and tags for efficient repository access parse-remote -- routines to help parsing remote repository access parameters patch-id -- compute unique ID for a patch prune -- prune all unreachable objects from the object database prune-packed -- remove extra objects that are already in pack files pull -- fetch from and merge with another repository or local branch push -- update remote refs along with associated objects
利用可能なすべてのコマンドを表示するには、ターミナルで git と入力し、続いて Tab を2回押してください。
7. グローバル .gitignore の設定
もし .DS_Store や Vim swp と言ったファイルをコミットしないようにしたい場合は、グローバルな .gitignore ファイルを設定できます。
ファイルを作成します:
touch ~/.gitignore
そして以下のコマンドを実行します:
git config --global core.excludesFile ~/.gitignore
または、手動で ~/.gitconfig に追加します:
[core] excludesFile = ~/.gitignore
Gitに ignore させたいもののリストを作成できます。詳しくは、 gitignore documentation をご覧ください。
8. Gitの autosquash 機能をデフォルトで有効にする
Autosquash を使用すると、対話型リベース中にコミットを簡単に破棄できます。 git rebase - i -- autosquash を使ってリベースごとに有効にできますが、デフォルトでオンにしておく方が簡単です。
git config --global rebase.autosquash true
または、手動で ~/.gitconfig に追加します:
[rebase] autosquash = true
9. フェッチ/プル時に、リモートから削除されたローカルブランチを削除
ローカルリポジトリに古いブランチがあり、リモートリポジトリにはもう存在しないことがあります。各フェッチ/プルで削除するには、次を実行します:
git config --global fetch.prune true
または、手動で ~/.gitconfig に追加します:
[fetch] prune = true
10. Git blameをより効率的に使用する
Git blameは、ファイル内のある行を誰が変更したかを確認できる便利なコマンドです。異なるオプションを指定することで、何を表示するかを指定できます:
$ git blame -w # ignores white space $ git blame -M # ignores moving text $ git blame -C # ignores moving text into other files
11. マージリクエストをローカルでチェックアウトするためのエイリアス追加
マージリクエストには、リポジトリのすべての履歴と、そのマージリクエストに関連するブランチへ追加されたコミットが含まれます。ソースプロジェクトがターゲットプロジェクトのフォークであっても(またプライベートフォークでも)、パブリックマージリクエストをローカルでチェックアウトできます。
ローカルでマージリクエストをチェックアウトするには、 ~/.gitconfig に次のエイリアスを追加します:
[alias] mr = !sh -c 'git fetch $1 merge-requests/$2/head:mr-$1-$2 && git checkout mr-$1-$2' -
これで、どのリポジトリでも、リモートからでも、マージリクエストをチェックアウトできるようになります。たとえば、GitLabに表示されているID 5のマージリクエストを upstream のリモートからチェックアウトするには、次のコマンドを実行します:
git mr upstream 5
これで、マージリクエストをローカルの mr-upstream-5 ブランチに取り込み、チェックアウトします。上記の例では、 upstream はリモートでGitLabを指し、 git remote -v を実行すれば確認できます。
12. HEAD のエイリアス
@ は、 HEAD と同等になりました!リベース中に使うと安心です:
git rebase -i @~2
13. ファイルのリセット
コードを修正している際に、急遽変更した内容が良くないことに気づき、リセットしたくなることがあります。編集したすべてのファイルの取り消しをクリックするのではなく、ブランチの HEAD にリセットできます:
$ git reset --hard HEAD
1つのファイルのみをリセットしたい場合は、次のコマンドを実行します:
$ git checkout HEAD -- path/to/file
すでにコミット済みの変更をまた元に戻したい場合は、次のコマンドを実行します:
$ git reset --soft HEAD~1
14. git-open プラグイン
もし、今いるリポジトリのホストであるウェブサイトを素早く訪れたい場合は、 git-open が必要です。
インストールして、GitLab.comからリポジトリのクローンを試してみてください。ターミナルからリポジトリに移動し、 git-open を実行すると、GitLab.com のプロジェクトページに遷移します。
このプラグインは、GitLab.comでホストされているプロジェクトではデフォルトで動作しますが、ご自身のGitLabインスタンスでのご使用も可能です。
その場合、次のようにドメイン名を設定します:
git config gitopen.gitlab.domain git.example.com
ドメイン名を設定した場合は、今までと異なるリモートとブランチを開くことになります。詳しくは、使用例をご覧ください。
15. git-extras プラグイン
Gitをより多くのコマンドで強化したい場合は、 it-extras プラグインを試してください。 git info (リポジトリに関する情報を表示)や git effort (ファイルごとのコミット数)などのコマンドが含まれます。
Gitについてさらに知る
シニア・デベロッパー・エバンジェリストのBrendan O'Learyが、この度、Gitの記念日を祝して15のビデオを作成することを発表しました。リベースやマージ、チェリーピックコマンドやブランチまで、さまざまなトピックに焦点を当てる予定です。シリーズ第1弾の動画(日本語字幕未対応)を、ぜひご覧ください。