鶏口牛後な日々

心の赴くまま、やりたいことを仕事に。

いろいろ便利な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 <コミットハッシュ値>

cherrypick の間にハイフンがあるのをいつも忘れる! 注意です。
基本的に、「あーこっちのブランチじゃなかった!間違った!」というときに、今いるブランチで仮でコミットを作ってそのコミットのハッシュ値をコピーしておき、 帰属させたかった方のブランチに移動(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