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
というファイルに以下のように記載すればパスワード(アクセストークン)の入力は不要になります。username
とaccesstoken
には、自分の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のpick
をsquash
に変更していくだけです。といってもよくわかりませんね。以下の記事が非常にわかりやすいので、以下あたりの記事を読むのがよいです。
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 の疑問。トピックブランチで作業中に、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-credential-osxkeychain - Macのgitでhttp接続のパスワードを安全に管理する - ソフトアンテナ
大きなGitリポジトリをクローンするときの工夫を図解します - DeNA Testing Blog
T2-Wonderland: Git for Windowsで使っていた認証情報をWSL上のGitでも使いたい時の設定方法!
https で git push するときのパスワードをGNOMEのキーリングに保存する - Qiita
関連記事
変更履歴
- 2022/01/29
.netrc
に関して追記 - 2020/09/10 認証情報の保存に関して追記
- 2020/04/15 git stashに関して追記
- 2017/03/17 文章微修正・git rebaseに関して追記