いろいろ便利なgit倉庫(個人的備忘録) [WIP]
gitで特定のファイルだけ前のバージョンに戻す
git checkout {hash} {filepath}
コミットしてない状態(unstagedな状態)で、編集内容を無かったことにしたい場合に使います。
コミットを削除する
git reset
最新の一つのものを消す場合は、 git reset HEAD^
HEAD^
とは、一個前のコミットのこと。
git reset <コミットのハッシュ値>
は、指定されたハッシュのコミットよりも新しいコミットを全て消すという意味になります。
同じコマンドを複数回打つと、どんどん直近の新しいコミットをunstagedに戻していくので、実行した場合は一度ずつ git log
で状況を確認することのをお勧めします。
git reset
に関しては、オプションの使い分けも重要です。以下の3つ。基本はオプションをつけないのが安全でいいですね。(つけないと、 --mixed
オプションが付いているこになります)
git reset --hard
新しいコミットで編集していたファイルを全て、元の状態にまで戻す。(つまり変更を無かったことにする)
git reset --soft
新しいコミットで編集していたファイルを全て、 addされた状態 (ステーンジング環境にある状態)まで戻す。
git reset --mixed
何もオプションをつけない場合と同じですが、新しいコミットで編集していたファイルを、addしない状態(unstagedな状態)にまで戻す。
人によると思いますが、私の場合は、ブランチを移動したい場合などに、「仮コミット」をすることが多く、
戻ってきてまたその続きを編集したいので、 git reset (--mixed)
を一番よく使います。
git checkout
と違うのは、一度コミットしてしまった状態のものを戻したい場合に使うというところですね。
ブランチ切り忘れについて
ブランチを切り忘れて、作業してしまっていたとき、新しいブランチを切って、元のブランチで追加したコミットを削除するという流れをとる。
- git branch で現在位置に 新しいブランチを作成
- git reset --hard <戻りたいコミットID>で 位置に移動
- git checkout で 新しいブランチ に移動
これで安全にブランチの切り忘れに対応ができる。
戻りたいコミットIDは、 git log
で確認すること。
git graph
でHEADの位置なども、確認しながら操作を行うこと。
git resetを取り消す方法
git reflog
すると、リセットしたログが表示されるので、そのリセットログのHEAD{}で git reset
過去のコミットをピンポイントで消したい場合
git rebase -i ハッシュ値
この時のハッシュ値は、消したいものの一個前を指定する。
消したいものが編集画面に出てくるので、そのコミットの書かれている行を削除!(vimならば dd
)
新しいブランチを作る
git branch
これは、どの場所にいながらこのコマンドを打つかによって、枝を生やす親が決まるので、注意必要。
ベースとなる幹があるならば、毎回必ずその枝に戻って、 git branch
をすること。
小枝にて編集中に他の人の編集差分を取り込む
git pull --rebase <リモートレポジトリ名> <リモートレポジトリの中にあるpullしたブランチ名>
(この --rebase
オプションの後ろに何を書くか、毎回悩んでましたが、最近やっと腹落ちするレベルに記憶できました・・・)
これをした時、ベースとなる幹に戻った後に、再度その幹を最新バージョンへ戻すべく、git pull origin <pullしたいブランチ名>をしないといけない。
枝がたくさんあるならば、その枝ごとに git pull
しなければならないことに注意!
<pullしたいブランチ名>
のところについては、リモートレポジトリの中で、引っ張ってきたいブランチの名前を入れるので、
自分が作るソースのmerge先が、いつも master
なら、 master
と入れるべきだし、
develop
というブランチを切っている場合は、 develop
となるわけである。
git --rebaseして、コンフリクトを直してからコンティニューしたい
git rebase --continue
git pull --rebase
は、一度コンフリクトが起きると、その時点で止まってしまうので、コンフリクトが起きたファイルを開いて、修正してあげる必要がある。
コンフリクトが起きたファイルは、どこの部分がコンフリクトしているかを自動で書き込んでくれるので、中身を見て、正しい形にして保存する。
保存した後は、 git add
でそのファイルを files staged for commit
の状態にしてあげる。
そうしたら、このコマンドを打って、 rebaseの止まった作業を進めて〜
と指令を出すのである。
git pull --rebaseして、コンフリクト発生したけど、一旦別の作業したいからpull --rebaseを中断したい
git rebase --abort
って打つとキャンセルできます。
gitの設定
gitの設定は、 ~/.gitconfig
に入っている。
ここに git graph
とかの設定を入れておくと、いちいちブラウザで見なくて良いので便利。(好き好き)
直近のコミットメッセージを変更したい
git commit --amend
だけでOK。これでコミットログが書き記されたファイルがvim で開くので、vimで編集して保存すればOK.
作業後、git log
と打つと、logが出て、コミットログが変わったことが確認できるはず。
Changing a commit message - GitHub Docs
各コミットの差分(変更点)を表示
git log -p <ハッシュ値>
「あのコミットでこの作業したかなぁ」というようなことを確認した時は、これで確認できます。
git diff HEAD
でも、今のHEADとの差分を表示してくれる
とあるブランチのコミットを別のブランチに移したい
git cherry-pick <コミットハッシュ値>
cherry
と pick
の間にハイフンがあるのをいつも忘れる! 注意です。
基本的に、「あーこっちのブランチじゃなかった!間違った!」というときに、今いるブランチで仮でコミットを作ってそのコミットのハッシュ値をコピーしておき、
帰属させたかった方のブランチに移動(checkout)して、 cherry-pick
のコマンドを打つ、という流れです。
gitの管理して欲しくないファイルの登録
scssで npm
などを使って生成後のpublicフォルダ配下のものなどはすべてgitでは管理して欲しくないものですよね。
その場合、 .gitignore
(基本、 .git
フォルダがある同じ階層に作る)に、フォルダ名やファイル名を書き込んでおくと、gitのunstagedなどにリストされなくなります。
私は .gitignore
をunstagedの検出対象から外したいと思って、調べました。
が、これはあまりやっちゃいけないことみたい。
詳しくは、
gitで.gitignoreそれ自体をgitの対象範囲から外したい(ignoreしたい!)と思った人、考え直しましょう - 鶏口牛後な日々
branch名を変えたい(ローカル&リモート)
まず、ローカルのブランチ名を hoge
から fuga
に変更
git branch -m hoge fuga
今いるブランチだったら、hoge
は不要
git branch -m fuga
次にリモートの hoge
ブランチを削除
git push origin :hoge
※もしこのブランチでマージリクエスト送っているようだったら、自動でリクエストクローズされます
最後にローカルの名前を変更したブランチをプッシュすれば完了
git push origin fuga
最初に、細かい実装範囲で作ったけど、細かくマージリクエスト送って、マージしてもらうのを待つの面倒だな、と思い、同じブランチでもう少し広い範囲開発しちゃってからマージリクエストしようw と思い立った時にはこのブランチのリネームで対処w
リモートレポジトリを確認したい
git remote -v
これで、どこに設定されているかがわかります。
リモートレポジトリを変更したい
git remote remove origin git remote add origin git@github.com:<アカウント名>/<gitレポジトリ名>.git
一つ目で、今登録しているリモートレポジトリを削除しています。そのあとで、新しいレポジトリを登録しています。
gitへの接続でパスワードを求められる場合の対処法
そもそも、秘密鍵を覚えさせておかないと、鍵を使った接続のたびにパスワードを求められる。
ssh-add ~/.ssh/<秘密鍵の名前>
で登録しておく。
また、この状態にしておいても、gitに接続しようとしたときに、パスワードを要求されるのは、httpsで接続しようとしているかららしい。
sshプロトコルでの接続に切り替える必要がある。
git remote -v
で出てくるリモートレポジトリが、 https
で始まっていないかを確認する。
始まっていたら、 git remote set-url <sshプロトコルのgitリポジトリのURL>
として、設定し直す必要がある。
確認する場合は、
ssh -T git@github.com
で、Hi xxxxx! You've successfully authenticated, but GitHub does not provide shell
と出てくるかで確認できる。
リモートレポジトリにあるブランチを消去したい
localのブランチを消すときは、 git branch -d <ブランチ名>
だが、すでにリモートに push
しちゃった場合は?
git push origin --delete <ブランチ名>
または、
git push origin :<リモートブランチ名>
これは、localのブランチを消してからでしか機能しないので注意が必要です。
〜メモ〜
ログには残したいとき-> git revert
ログも消したい&&コミット前-> git checkout
ログも消したい&&コミット後-> git reset