20210912のGitに関する記事は7件です。

【初級者向け】ターミナル(zsh)にgitのブランチ名表示&補完機能を公式ドキュメントをじっくり読み解いて実装

はじめに やまだゆう(@yamaday0u)です。 今回は、ターミナル(zsh)でgitを操作するときにとても便利な以下の機能を実装します。 ブランチ名の表示 Tab補完 目標 自身のターミナルで以下のようにブランチ名の表示とTabキーによる補完機能を実装することを目標とします。 チャレンジ 原典・一次情報から学ぶ習慣を身につけるべく、なるべく公式ドキュメントを参考にしていきます。 手っ取り早く実装したい場合は以下の記事を読んでください。大変わかりやすい記事です。 【zsh】絶対やるべき!ターミナルでgitのブランチ名を表示&補完【git-prompt / git-completion】(Qiita) gitのドキュメント ブランチ名の表示とTab補完は、それぞれgitの公式ドキュメントの中のgit-promptとgit-completionに実装方法が記載されているので、この指示に従って実装します。 git/contrib/completion/git-prompt.sh、 git/contrib/completion/git-completion.zshのコメントアウト部分の説明をぜひ1度ご覧ください! ブランチ名の表示機能を実装(git-prompt) git/contrib/completion/git-prompt.shの指示を1つずつ確認していきます。 手順1:git-prompt.shファイルをコピー git/contrib/completion/git-prompt.sh # 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). ※訳:このファイル(git-prompt.sh)をどこかにコピーしてください。 今回はzshフォルダを作成して、このフォルダ下にファイルをコピーします。 ターミナル % mkdir ~/.zsh % cd ~/.zsh % curl -o git-prompt.sh https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh コピーするURLhttps://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.shは以下の「Raw」をクリックすることで開かれるページです。 curl -o ファイル名 URLコマンドで、URLから取得したソースコードを指定した名前のファイルに出力して保存してくれます。 参考:curl公式サイト、curl コマンド(hydroculのメモ) ちなみにcurlという名前はclient for urlから来ているらしいです。(IT用語辞典 e-Words) 手順2:.zshrcファイルに設定を追記 git/contrib/completion/git-prompt.sh # 2) Add the following line to your .bashrc/.zshrc: # source ~/.git-prompt.sh ※訳:次のコードを.bashrcか.zshrcファイルに追記してください。 今回はzshを使用していることを前提としているので、.zshrcファイルに設定を追記します。 ちなみに.zshrcファイルのrcはRun Commandの略だそうです。(【.zshrc解説】コピペで簡単zshカスタマイズ【設定方法】(Suwaru blog)) ~/.zshrc source ~/.zsh/git-prompt.sh このコードの追記により、git-promptを読み込みます。 手順3:表示形式の設定 git/contrib/completion/git-prompt.sh # 3a) Change your PS1 to call __git_ps1 as # command-substitution: # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' # ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' # the optional argument will be used as format string. .zshrcファイルに以下のように追記します。 ~/.zshrc # プロンプトのオプション表示設定 GIT_PS1_SHOWDIRTYSTATE=true GIT_PS1_SHOWSTASHSTATE=true GIT_PS1_SHOWUNTRACKEDFILES=true GIT_PS1_SHOWUPSTREAM=auto # プロンプトの表示設定(好きなようにカスタマイズ可) setopt PROMPT_SUBST ; PS1='%F{green}%n@%m%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f \$ ' プロンプトのオプション表示設定はの説明は以下の通りです。 GIT_PS1_SHOWDIRTYSTATE(ファイル変更の有無) ステージング(git add)されている変更があればブランチ名の横に"+"が表示され、ステージングされていない変更があると"*"が表示されます。 以下の例では、ステージングされていない変更(Top.jsx)があるため、ブランチ名の横に"*"が表示されています。 GIT_PS1_SHOWSTASHSTAT(スタッシュの有無) スタッシュに入っているものがあるとブランチ名の横に"$"が表示されます。スタッシュが何かについてはこちらの記事が最近公開されたものでわかりやすいので参照してください。以下の例では、スタッシュを削除したことで、"$"の表示が消えています。 - GIT_PS1_SHOWUNTRACKEDFILES(新規ファイルの有無) ステージング(git add)されていない新規ファイルがあると"%"が表示されます。以下の画像ではgit add .される前は"%"が表示され、された後は"+"が表示されています。 GIT_PS1_SHOWUPSTREAM(HEADとそのアップストリームの違い) 現在のブランチのアップストリームより進んでいれば">"、遅れていれば"<"、同じであれば"="が表示されます。アップストリームは比較対象のブランチで、設定を変えていなければorigin/masterのブランチがアップストリームになっているようです。 git commitをするとHEADの方がorigin/masterより進んだため">"と表示され、 git pushすると">"から"="に表示が変わりました。 Tab補完機能を実装(git-completion) git/contrib/completion/git-completion.zshの指示を1つずつ確認していきます。 手順1:git-completion.zshファイルとgit-completion.bashファイルをコピー git/contrib/completion/git-completion.zsh # The recommended way to install this script is to make a copy of it as a # file named '_git' inside any directory in your fpath. # # For example, create a directory '~/.zsh/', copy this file to '~/.zsh/_git', *訳:このファイル(git-completion.zsh)を_gitというファイル名で好きなフォルダにコピーしてください。 先ほど作成した.zshフォルダ下でコピーします。 ターミナル % cd ~/.zsh % curl -o _git https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.zsh 手順2:.zshrcファイルに設定を追記(その1) git/contrib/completion/git-completion.zsh # and then add the following to your ~/.zshrc file: # # fpath=(~/.zsh $fpath) *訳:.zshrcファイルに次の一文(fpath=(~/.zsh $fpath))を追記してください。 .zshrcファイルに以下のように追記します。 ~/.zshrc fpath=(~/.zsh $fpath) 手順3:.zshrcファイルに設定を追記(その2) git/contrib/completion/git-completion.zsh # You need git's bash completion script installed. By default bash-completion's # location will be used (e.g. pkg-config --variable=completionsdir bash-completion). # If your bash completion script is somewhere else, you can specify the # location in your ~/.zshrc: # # zstyle ':completion:*:*:git:*' script ~/.git-completion.bash *訳:git-completion.bashもインストールしておく必要があります。git-completion.zshでは デフォルトでgit-completionの位置が使われます。 すでにgit-completion.bashのスクリプトがある場合は、.zshrcファイル内でgit-completion.bash の場所を指定できます。(要は次の一文「zstyle〜」も追記せよということ) .zshフォルダ下でgit-completion.bashをコピーします。 ターミナル % cd ~/.zsh % curl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bash 次に、.zshrcファイルに以下のように追記します。 ~/.zshrc zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash 最終形の確認 最終的に、.zshrcファイルには以下の記述がされています。 ~/.zshrc # git-promptの読み込み source ~/.zsh/git-prompt.sh # git-completionの読み込み fpath=(~/.zsh $fpath) zstyle ':completion:*:*:git:*' script ~/.zsh/git-completion.bash autoload -Uz compinit && compinit # プロンプトのオプション表示設定 GIT_PS1_SHOWDIRTYSTATE=true GIT_PS1_SHOWSTASHSTATE=true GIT_PS1_SHOWUNTRACKEDFILES=true GIT_PS1_SHOWUPSTREAM=auto # プロンプトの表示設定(好きなようにカスタマイズ可) setopt PROMPT_SUBST ; PS1='%F{green}%n@%m%f: %F{cyan}%~%f %F{red}$(__git_ps1 "(%s)")%f \$ ' これでブランチ名の表示機能とTab補完機能が実装されたはずです。 快適なgitライフを! 参考資料 Git - git/contrib/completion/git-completion.zsh - git/contrib/completion/git-prompt.sh - 【git stash】コミットはせずに変更を退避したいとき(Qiita) zsh - ZSH - THE Z SHELL(公式サイト) - 【.zshrc解説】コピペで簡単zshカスタマイズ【設定方法】(Suwaru blog) - 【zsh】絶対やるべき!ターミナルでgitのブランチ名を表示&補完【git-prompt / git-completion】(Qiita) - 【Git】Gitプロンプトを便利にする方法(ちょっと厨二っぽいSEのブログ) - Bash のプロンプトに Git のブランチ名を表示する(Qiita)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

安心してforce pushしたい。

雑メモです。 git で force push したいけど、操作を誤っていないか毎度ビクビクしてしまう。 そんな心労に少しでも楽になる方法を考えてみました。 私の事例で恐縮ですが、force push する際に怖いのは... 1. 誤ったブランチを指定してしまう 2. 共同開発してるブランチで, 相方のコミットを吹き飛ばしてしまう この2点が代表的だと思います。 1点目に関しては、大切な main (master) や, topic といったマージコミットのみを集合とするようなブランチは、そもそも git push による直接更新をできないようにしておくべきでしょう。 ブランチ保護機能を有効にします。 Github の設定方法 Gitlab の設定方法 2点目に関しては, force push する場合のオプション指定でほとんどの場合をカバーすることが出来るでしょう。 *1 具体的には, git push --force-with-lease --force-if-includes branch名 とするようにします。 長いので alias 貼っておきましょう。 git config --global alias.pushf 'push --force-with-lease --force-if-includes' ... # git pushf <ブランチ名> --force-with-lease オプションについて git push -f をやめて --force-with-lease を使おう しかし, git fetch を行った後だと 誤ったforce push が出来てしまう点が課題でした。 --force-if-includes について Git Reference When should I use "git push --force-if-includes" --force-with-lease の課題である fetch後の誤ったforce push を回避するオプションになります。 上記の設定をしておくことで、少しでも安心して作業ができるのではないでしょうか。 fishシェル特有の悩み 余談ですが、 fishシェルはありがたいサジェッションのおかげで過去に入力したコマンドを素早く再入力できるのですが、 force push を行う際に異なるブランチ名がサジェストされがちで、気をつけないと行けません。 (作業してるブランチと異なる別ブランチにpushしてしまう可能性がある) 回避策として以下のコマンドを自作しました。 特徴はとしては2点。 1. push先のブランチ名が作業ブランチと異なると怒ってくれる。 2. force push オプションに --force-with-lease --force-if-includes を付けていること。 あえてブランチ名を要求することで、脳死で打たせないようにしています。 $HOME/.config/fish/functions/gpf.fish function gpf --wraps='git push origin' --description 'gpf is git push origin force' set -l targetBranch $argv set -l currentBranch (git branch | grep -E "^\*" | cut -c 3-) if test $currentBranch = $targetBranch git push --force-with-lease --force-if-includes origin $targetBranch echo "done ?" else echo "" echo \ """ Careful!! Make sure you push to the same branch you are checking out now.""" echo " you: $currentBranch , push to: $targetBranch" end end 上記の関数を $HOME/.config/fish/functions に保存します。 git repository 配下で以下のようなコマンドで実行出来ます。 gfpじゃないのはご愛嬌ということで... gpf <ブランチ名> *1 コメントで頂いた内容を反映しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Powershellでgit stash showすると「Too many revisions specified: 'stash@' 'MAA=' 'xml' 'text'」と表示される

Gitのstash内容を表示しようとすると「Too many revisions specified: 'stash@' 'MAA=' 'xml' 'text'」とエラーが表示されます。 > git stash show stash@{0} Too many revisions specified: 'stash@' 'MAA=' 'xml' 'text' 原因は{}が構文解析されているためです。 stash名を文字列扱いとさせれば正常に動きます。gitの問題ではなくpowershellの問題です。 解決方法は3つあります。 1.エスケープする。 git stash show stash@`{1`} 2.文字列にする。 git stash show "stash@{1}" 3.構文解析対象外にする。 about_Special_Characters Stop-parsing token (--%) git --% stash show stash@{0}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

一発で、現在のrepoのremote urlとpathをブラウザで開く方法

TL;DR % [sudo] gem install git-browse-remote % git browse-remote . その他の方法 1. 自作 % sudo cat >> /usr/local/bin/gitremote << 'END' git remote -v | awk -v P="$(git rev-parse --show-prefix | sed 's/\/$//g' | nkf -WwMQ | sed 's/=$//g' | tr = % | tr -d '\n')" '/origin.*push/ { sub(/\.git$/, "", $2); newvar=$2"/tree/master/"P; print newvar}' | xargs open END % sudo chmod +x /usr/local/bin/gitremote % gitremote 2. git-open % git open # 残念なことに、現在のpathはサポートされていない 3. git-browse-remote (おすすめ) % git br % vi ~/.gitconfig # This is Git's per-user configuration file. [pull] ff = only [init] defaultBranch = master [web] browser = open [alias] br = browse-remote . pr = browse-remote --pr 4. hub 多機能で、開くだけなら git-browse-remote
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gitコミットでignoreされるThe following paths are ignored by one of your .gitignore files:

状況: % git add . githubにpushしたのになぜか一つのファイルだけ無視されている % git add index.html The following paths are ignored by one of your .gitignore files: index.html hint: Use -f if you really want to add them. hint: Turn this message off by running hint: "git config advice.addIgnoredFile false" 解決: -f for force addの後にオプション ”-f” + ファイル名 % git add -f index.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Android StudioとGitHubとの連携手順

概要 GitHubにプライベートリポジトリが無償作成できるようになって、アプリ開発をする際のバージョン管理が楽になりました。 が、意外に手順を忘れかけた時に必要となってくるので忘備録を残しておきます。 環境 基本的に、WindowsでもmacOSでもLinuxでも手順は変わらないので、あえてOS別には書きません。 今回はWindows10です。 Android Studio Android Studioのバージョンは、「Arctic Fox //2020.3.1」です。 一応、日本語化してます。(日本語化:https://mergedoc.osdn.jp/ ) Git Git:https://git-scm.com/ Gitをインストールしている状態にしてください。 GitHubで管理するにしても、裏ではGitのコマンドを実行しているので・・・ GitHub GitHub: https://github.com/ GitHubにアカウントを持っている前提です。 連携手順 手順1:GitHubでTokenを入手する まずは、GitHubにサインインして、「Setting」-「Developer settings」-「Personal access tokens」と開きます。 続いて、「Generate new token」ボタンをクリックしてTokenの作成をします。 "Note"欄は、管理上の名前なのでTokenを使うPCの名前など入れておくといいかもしれません。 "Expiranation"は、有効期限を無期限にするといろいろセキュリティ上の懸念材料になるので「90days」ぐらいでしょうか。 3か月経ったら失効するので、再度生成する必要があります。 "Select scopes"は、毎回repoとadmin:orgのreading、gistにチェックしてるぐらいですね。 「Generate token」ボタンを押してTokenを生成します。 生成したTokenは、Android Studio以外でも使えるので、メモしておくのもありですが、細かく管理したいなら必要数のTokenを作ってください。 Token生成すると表示されるTokenは、ここでメモしておかないと、後で生成したTokenを再度見ることはできません。 手順2:Android StudioのProjectをVCS管理する メニューから「VCS」を選択し、「バージョン管理統合を使用可能にする」をクリック バージョン管理の種類を聞かれるので、「Git」(初期選択)を選択して「OK」 そうすると、メニューが「VCS」→「Git」に変わります。 メニューから「Git」を選択し、「GitHub」を選択、「GitHubでプロジェクトを共用」をクリック 共用する際のダイアログが表示されるので リポジトリー名: GitHub上のリポジトリで表示される名称 Private:チェックを入れるとPrivateリポジトリになる。入れないと公開(Share状態)になる Add account:クリック Log in with Token... を選択 「トークン」欄に、手順1でメモしたTokenを貼り付ける 「アカウントの追加」ボタンをクリック そうすると「Share by:」欄にTokenのアカウントが表示されるので「共用」ボタンをクリックする GitHubにコミット&プッシュする一覧が出てくるので、内容を確認して「コミット・メッセージ」に適宜入力して「追加」ボタンをクリックする Android Studioの右下に成功のメッセージが表示されたら完了。 手順3:GitHubで確認する GitHub側のリポジトリ一覧に追加される(すぐ反映されます)ので、中身を確認します。 GitHubにサインインしてないと、もちろん確認できません GitHubのPrivateは見れるのは自分だけ? 意外に心配性なので確認してみると、自分しか見れない状態だとわかります。 ただ、生成したTokenを使うと、普通に見れるので管理は注意しましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

共同開発

インターン生で共同開発をしようという提案が通り、レシピを投稿する簡単なサービスを開発しました。共同開発したサービスの概要、過程、利用したツール等についてまとめていきます。 メンバー 僕を含めた3人(特に分野を決めていませんでしたが、結果的に僕が開発、他2人が設計中心になりました。「特に苦労したこと」) サービス概要 Food Frofessor レシピを投稿し、編集、お気に入り登録、コメントができる基本的なサービスです。 特に苦労したことの経緯や、「共同開発」を経験するといった目的が理由でそこまでハイレベルなサービスにしませんでした。 URL: https://food-professor.herokuapp.com/top (初回のみデータの読み込みに時間がかかります) GitHub: https://github.com/akira-iguchi/FoodProfessor-Backend / https://github.com/akira-iguchi/FoodProfessor-Frontend 使用技術 React (React Hooks, React Router) TypeScript Tailwind CSS Ruby 2.6.6 Rails 6.1.32 MySQL 8.0.23 Heroku Docker/docker-compose Figma Notion drawio VScode 機能一覧 ユーザー機能 ユーザーの新規登録 プロフィール画像の追加 ユーザー情報の編集 レシピ一覧 人気のレシピ トップ3 早くできるレシピ トップ3 最近追加したレシピ レシピ投稿機能 材料、手順を複数追加可能 関連するタグ追加可能 お気に入り機能 レシピのお気に入り登録、解除 お気に入りしたレシピの一覧 検索機能 レシピ名をキーワードに検索 関連するタグ、材料から検索 コメント機能 レシピのコメントの投稿、削除 コメントの一覧 ER図 Notionでタスク管理、設計 Notionという有名なタスク管理ツールでAPI設計、ミーティングメモ、重要な情報等を保存し、タスクを管理しました。 FigmaでUI設計 メンバーの方にFigmaというこれまた有名なデザインツールでUI設計していただき、それを元にFigma to Codeというプラグインで実装していきました(個人的に、このプラグインはそれほど使えなかった)。 環境構築 docker-composeでサービス(rails、react、mysql)をつくろうとしましたが、なんやかんやで1週間以上経過。最終的に1人がdocker-composeファイルをフロントとサーバーサイドで分けて別々で構築したいと提案し(そうじゃないとややこしくてできないと主張)、フロントとサーバーサイドのフォルダに分けて構築しました。 git管理 Fork→cloneしたリポジトリがFork元を追跡するようにし、オリジナルのリモートリポジトリに変更を及ぼすことなく変更をテストすることができるようにしました。 設定方法 ①GitHubから開発したいリポジトリ(オリジナルのプロジェクトのrepo)のページへ飛び、Forkボタンを押します。 ②Forkしたリポジトリ(組織じゃなくて自分のアカウントのレポジトリ)からcloneします。 git clone git@github.com:user_name/app_name.git ③ここで git remote -vを打ってローカルにcloneしたレポジトリがどのように関連づけられているか確認します。 ここで、オリジナルの方がoriginになってたらオリジナルのmasterを変更してしまうことになるので、originのURLを変える必要があります(おそらくそうなってたらOriginalの方からcloneしています)。 $ git remote -v // Forkしたリポジトリのみがoriginとして表示されます origin git@github.com:user_name/app_name.git (fetch) origin git@github.com:user_name/app_name.git (push) // もしOriginalの方をoriginとして登録されていたら $ git remote set-url origin YOUR_FORK_REPO_URL ④Fork元のリポジトリをローカルのリポジトリに関連づけます(URLを追加する) $ git remote set-url upstream ORIGINAL_REPO_URL ⑤upstreamとしてURLが追加されているか確認 $ git remote -v origin git@github.com:user_name/app_name.git (fetch) origin git@github.com:user_name/app_name.git (push) upstream git@github.com:team/app_name.git (fetch) upstream git@github.com:team/app_name.git (push) ⑥(upstreamとしてOriginalのリポジトリをURLに登録した後) git fetch upstream でリモートにあるOriginalの最新の変更状態をローカルに持ってきます。 ⑦git merge upstream/master で、自分のいるローカルのブランチにOriginalのローカルリポジトリ(upstream)のmasterブランチの変更分を適用させます。 ⑧ローカルで開発を進める。 個人的おすすめは git add 前にOriginalの変更分をfetchしておくこと git stash → git fetch && merge → git stash apply → git add && commit && push ローカルのoriginリポジトリ(Fork先の個人用リポ)へpushを続けていれば、組織のOriginalブランチに影響を及ぼさず、個人レポジトリで開発進められます。 特に苦労したこと 設計、環境構築までは空いた時間ながらもメンバーと協力し合い順調に進んだのですが、開発を進めていくうちに就職活動等でメンバーの方々が忙しくなり、まともな開発時間を有するのは僕だけになりました。このとき僕も共同開発後の予定を立てており、1人で悠々と作業を進める時間はありませんでした。このままでは、計画も意味をなくし、共同開発が断念される恐れがありました。 どうやって乗り越えたか それでも何とかサービスを完成させてデプロイまで終わらせたいと考えた僕は、メンバーと話し合い、機能の削減、メンバーの必要最低限の作業などを提案し、その後の開発は僕が中心となって進めました。そして、実装したい機能を妥協しながらも、許容範囲の期間でデプロイまで終わらせることができました。 まとめ 設計やgit管理など、個人開発とは違った実務に近い良い経験ができました。また、ほぼ無知だった僕にNotionなどのツールや専門知識などをお教えくださり、メンバーには感謝の気持ちでいっぱいです。優秀なメンバーの方々に負けないようこれからも頑張っていこうと思います。 気がかりとしては、まともなissue管理ができなかったので、今後は複数人での開発に向けてissueの扱いを学んでおきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む