Git/GitHubで困った時の解決方法・TIPS

Git/GitHubおじさん初心者です

 Git/GitHubおじさんになって気づいたら半年くらいになりました。Git/GitHubに関しては下記記事参照下さい。

 そして、気づいたら大人の事情により Git/GitHub/Bitbucket おじさんになったりしているわけですが、未だにrebaseとかしたことないレベルの初心者マークのGitおじさんです最近ついに初めてrebase使ったので追記!そんな私でも、使っているうちに「あれ?これどうするんだっけ?」とか「これもっと早く知っていれば…」とか色々あったので、忘れないうちにTipsやFAQをメモしておこうと思います。初心者マークが取れるまでは随時追加していく予定です。間違っているところとか、アドバイスあれば色々教えていただけるとありがたいです。

 そして、肝心のGit/GitHub/Bitbucketの布教活動ですが社内(部署内)では…という状況です。むしろ社外の方に輪が広がっている状況で、外から囲んで行く作戦(?)にしようかなと思っています。それでいいのか?という気もしますが、自分の会社はソフトに理解のない会社な上、そもそも部署内にも本気でソフトやるという人がいないような状況なので仕方ないかなと…

Git/GitHub FAQ Tips

 基本的にGitHubを対象としてますが、Bitbucketでも基本的に共通と思います。全部は試せてないのでもし違うものあれば教えてください。

初期設定

 Gitは初期設定しないとcommitもpushもできません。いつもググってしまうのでメモ。最低限以下です。

$ git config --global user.name "karaage umauma"
$ git config --global user.email "karaage@umauma.com"

 その他の設定とかは、以下を参考にすると良いかと思います

Gitをインストールしたら真っ先にやっておくべき初期設定 - Qiita

パスワードの省略

 Macの場合は以下実行するだけです。

$ git config --global credential.helper osxkeychain

 Linuxの場合は ~/.netrcというファイルに以下のように記載すればパスワード(アクセストークン)の入力は不要になります。usernameaccesstokenには、自分のGitHubのユーザー名とアクセストークンを入れてください。

machine github.com
login username
password accesstoken

 詳細は以下記事参照ください。

gitレポジトリとhttpで通信する場合にユーザ情報の入力を省略する - Qiita

 もう少しセキュアな方法としては、認証用のCLIghを使うと楽です。以下コマンドでghをインストールします。

$ curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
$ sudo apt update
$ sudo apt install -y gh

 インストール後は以下コマンド実行してghを起動します。

$ gh auth login

 質問に基本は全てYで答えると、ブラウザで認証ができます。

コミットを取り消したい

 git resetを使います。よくあるのが、git addを取り消したい時。以下コマンドでもどせます。sample.txtを間違えてaddしちゃった場合です。

$ git reset HEAD sample.txt

 実ファイルの編集内容も含めて、全て前回のcommitまで戻したいときは以下コマンドで戻せます。ファイルの中身も戻っちゃうから気をつけてね。

$ git reset --hard HEAD^

 単純に特定のファイルを前回のcommit前まで戻したいときは、以下のようにgit checkoutしてやればよいです。

$ git checkout sample.txt

 それ以外の方法やgit resetの理解は、以下のサイトが参考になります。

git reset についてもまとめてみる - murankの日記

 しょっちゅう忘れるのと、間違えると怖いのでresetの前は未だに確認してから実行するようにしています。

リモートのリポジトリにローカルのリポジトリを強制一致させたい場合

 参照元の記事曰く

「ええーいリモートが合ってるんだからアイツに合わせたいんだよ!」

 という場合。

$ git fetch origin
$ git reset --hard origin/master

トピックブランチで作業中に、master ブランチで重要な変更が加えられた。どうすればよい?

 作業中のブランチで以下コマンドでmasterにマージしちゃうのが良いようです。

$ git merge master

リモートリポジトリのブランチ削除方法(+git pushの詳細理解)

 例えばリモートリポジトリのhogeというブランチを削除したいときは以下コマンド

$ git push origin :hoge

 なんで:いるのかという説明などは以下記事が参考になりました。git pushの理解も深まるので一度目を通しておくとよいかと思います。

今さら聞けないgit pushコマンド - Shoichi Matsuda's diary

リポジトリの全行数を確認

 行数なんかどうでも良いじゃん!と思う人もおおいでしょうが、そこは大人の事情(察してください)というやつです。

$ git ls-files | xargs -n1 git --no-pager blame -w | wc -l

同じマシンで複数のGitHub/Bitbucketアカウントを使い分ける

 複数のGitHubアカウントを使い分けたいとき、commit,pushするたびにアカウント設定しなおすのは面倒くさいし間違えの元です。以下の方法でリポジトリ毎に設定しておくのがよいです。

cd [ローカルリポジトリのディレクトリ]
git config user.name "サブアカウントのユーザ名"
git config user.email "サブアカウントのメールアドレス"

 対象のリポジトリ直下の.git/configに設定が反映されていればOK。もちろん.git/configを直接書き換えても可。以降この設定をしたリポジトリでの作業内容はgit config --globalで設定したアカウントより上記で設定したアカウント設定が優先されます。

複数アカウントで同リポジトリーで作業していると “error: insufficient permission for adding an object to repository database .git/objects” が発生する

 以下コマンド実行すると解決しました

$ sudo chmod -R 0777 .git/objects/

git pushすると "fatal: The remote end hung up unexpectedly" 発生

 以下実行してから再度pushすればOKでした

$ git config http.postBuffer 524288000

リモートリポジトリを変更したくなったとき

 例えば以下

$ git remote set-url origin git@git.example.com:foo/bar.git

 .git/configを直接書き換えてもよいかもしれません。もしくはgit remote -hして思い出すか。

複数のリモートリポジトリを使い分ける

 例えば https://github.com/karaage0703/test というリモートリポジトリをkaraage0703という名前で追加したくなったとき、以下コマンドでリモートリポジトリ追加できます

$ git remote add karaage0703 https://github.com/karaage0703/test

 削除したいときは以下コマンド

$ git remote remove karaage0703

 こちらもgit remote -hして思い出すのがよいかもしれませんね。

 それで、例えばdevelopというセンスのない名前のブランチをkaraage0703というリモートリポジトリにpushしたい場合は下記。

$ git push karaage0703 develop

GitHubでforkしたリポジトリの管理の仕方

GitHubでforkした場合、自分で変更した作業はmasterブランチには直接pushせず、新たにbrachを切って作業するのがよいらしいです。masterブランチはオリジナルのリポジトリに追従するために残しておいて、定期的にfetch mergeするのがよいみたいです。

 例えば、https://github.com/original/test というリポジトリが本家、forkしたリポジトリが https://github.com/fork/test だとしたら以下のような流れです。

 まずはforkしたリポジトリをcloneして、リポジトリのディレクトリに移動

$ git clone https://github.com/fork/test
$ cd test

 upstreamという追従用のブランチを作成。追従用のブランチはupstreamという名前にするのが一般的らしいです。これは一度やればOK。

$ git remote add upstream https://github.com/original/test

 あとは、定期的に以下コマンドでローカルのリポジトリで本家に追従できます。

$ git fetch upstream
$ git merge upstream/master

 ローカルのリポジトリだけでなく、forkしたリポジトリhttps://github.com/fork/testに本家https://github.com/original/testの変更を反映したい場合は、fetch mergeしたあとgit pushすればOKです。

 fork先から本家にpull requestまでしたいときは下記サイトを参照下さい Github で Fork してから Pull Request をするまでの流れ | けーこ in サンフランシスコ

Gitの補完(git-completion)とプロンプトへのブランチ表示

 Macの場合は、.bashrcに以下追記すると補完が効くようになり、プロンプトに色付きで今いるリポジトリのブランチが表示されるようになります。

source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '

 Linux(Ubuntu 14.04.3)の場合は、最初からgitは補完がきくようになっているので.bashrcに以下追記すればOKです。

export PS1='\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '

 もし補完が効かなければ$ sudo apt-get install bash-completion gitとかすれば補完効くようになると思います。

pushする前にコミット(commit)をrebaseでsquashして綺麗にする

 git rebaseとか初心者的に凄い怖くて使ったことなかったのですが、ついに使いました。そんなに怖くなかったです。

 どういうときに使うかというと、適当にcommitしていってpushする前に綺麗にしたいときです。今までは、いちいち別ファイルにコピーして最初からcommitし直すというアホなことをしていましたが、これを使えばある程度過去をいじくることができます。最高!

 まず以下コマンドで過去の変更履歴を確認

$ git log --oneline

 push前の最後のcommit番号を確認。例えばxxxxxxxだったら以下のように実行します。

$ git rebase -i xxxxxxx

 するとエディタが開くので、まとめたいcommitのpicksquashに変更していくだけです。といってもよくわかりませんね。以下の記事が非常にわかりやすいので、以下あたりの記事を読むのがよいです。

Gitの複数コミットをrebaseとsquashでまとめる方法 | iwb.jp

初心者でもわかる!リベースの使い方を解説します | 株式会社LIG(リグ)|コンサルティング・システム開発・Web制作

変更内容を一旦退避してブランチ切り替えて変更内容を適用

 git stashでできます。<branch>という名前のブランチに切り替える場合は、以下のような感じです。

$ git stash
$ git checkout -b <branch> origin/<branch>
$ git stash apply

コミット前の内容を一時的に避けておく「git stash」の使い方 | 株式会社グランフェアズ

その他参考になる記事

 以下のまとめも役に立ちました。

困った時の逆引きGitメモ(コマンドライン編) - MyEnigma

https://blog.labot.jp/entry/2019/07/01/183204

まとめ

 一通り今まで困ったこととか忘れがちなことをまとめました。gitって色々できるのですが、記憶力が無くうっかりミスしやすい自分にはちょっと難しいです。ここらへんは、SourceTreeとかのGUIツールもうまく活用した方が、うっかりミスを防げて効率も上がるのかなとか思ったりしています。

 今のところ、大規模なプロジェクト開発とかはしていないので、masterブランチを常に最新を保って、そこからブランチきって、pull requestしてマージを繰り返すというスタイルを基本として開発して、それで困ったときは色々調べながらなんとかしている状態です。うまい単語さえ選んで検索できれば、大体似たようなケースと解決方法が出てきてくれるのでありがたいですね。この記事もそういう初心者的な人の役に少しでもたてばよいかなと思っています。

参考サイト

git の add を取り消す - Qiita

Git の疑問。トピックブランチで作業中に、master ブランチで重要な変更が加えられた。どうすればよい? - 彼女からは、おいちゃんと呼ばれています

git repositoryに登録されているファイルの総行数をカウントする - adragoonaの日記

同じマシンで複数のgithubアカウントを使い分ける - Qiita

gitでリモートのブランチにローカルを強制一致させたい時 - Qiita

GitHubでFork/cloneしたリポジトリを本家リポジトリに追従する - Qiita

Git: 複数アカウントで同リポジトリーで作業していると "error: insufficient... « をぶろぐ

gitでの fatal: The remote end hung up unexpectedly - 万年素人からHackerへの道

git remote リポジトリを複数登録する

git-credential-osxkeychain - Macのgitでhttp接続のパスワードを安全に管理する - ソフトアンテナ

大きなGitリポジトリをクローンするときの工夫を図解します - DeNA Testing Blog

T2-Wonderland: Git for Windowsで使っていた認証情報をWSL上のGitでも使いたい時の設定方法!

https で git push するときのパスワードをGNOMEのキーリングに保存する - Qiita

Gitのおすすめエイリアス5選 - 詩と創作・思索のひろば

関連記事

変更履歴

  • 2022/01/29 .netrcに関して追記
  • 2020/09/10 認証情報の保存に関して追記
  • 2020/04/15 git stashに関して追記
  • 2017/03/17 文章微修正・git rebaseに関して追記