2019/10/09追記
- 頂いたコメントから コミットそのものをミスった -> コミット取り消しに追記
- 同項に注意事項を追記
はじめに
今年の3月に大学を卒業し、4月からアプリを作る会社に入社した者です。
iOSアプリを作るエンジニアしてます。Androidアプリも勉強してます。
超心配性です。
仕事で当然Gitを使う訳ですが、、、これが新米エンジニアには難しい。
入社直後、.gitignoreの設定をミスってしまい、FilesChanged
が7000を超えるトンデモPRを生み出したことがあります。(その後.gitignoreの設定を直したら、今度はなぜか.xcodeprojファイルがぶっ壊れて...と修正に丸々1日潰しました )
それ以来、超超心配性な性格も相まって
「.gitignoreの設定反映されてないかな...」
「このままpushしても大丈夫かな...コミット履歴ミスってないかな...」
「mergeのブランチ間違えてないかな...」
と必要以上の心配をすることがあります。
その度に調べるのは大変なので、何かを確認/修正するgitコマンドを中心に紹介します。
随時更新したいです。
何かが心配な時に使うコマンド
コミットログがどうなっているか心配
$ git log
コミットIDがみたい場合 --oneline
HEADの位置をみたい場合 --decorate
ツリーを見たい場合 --graph
など、logのオプションはたくさんあります
参考: https://qiita.com/take4s5i/items/15d8648405f4e7ea3039
.gitignoreがちゃんと働いているか心配
ignoreされたファイルを表示、
$ git status --ignored
On branch develop
(中略)
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
.DS_Store
Carthage/
Pods/
#...
#ignoreされたファイル
どのファイルがステージングされてるか心配 -> 一覧を見る
$ git ls-files<img width="327" alt="スクリーンショット 2019-10-08 11.39.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/203273/59749482-6cf1-70fe-4a20-fe020b7b92c6.png">
.gitignore
Podfile
Podfile.lock
README.md
hogeProject/HogeViewController.swift
(略)
ステージングされたファイルの一覧
merge元のブランチとmerge先のブランチが合っているか心配
feature
ブランチで編集中に、develop
ブランチに変更が加わり、feature
ブランチにもその変更を反映したいとき
「あれ?featureブランチでmerge叩けばいいんだっけ? 」
ミスっても git revert
とかすればいいんですが。初心者心配性エンジニアはそれを知っててもmerge前に1回心配します。
$ git checkout feature
Switched to branch 'feature'
$ git merge develop --no-commit
Automatic merge went well; stopped before committing as requested
マージコミットが作られないけどdevelopブランチの変更が取り込まれた状態になります。
ワーキングツリーを確認してcommitすればちゃんとmergeされた状態になるし、間違えてたらgit merge --abort
すれば良さそうです。
addの前に変なファイルがaddされたりしないか心配
$ git add --dry-run <addする予定のファイル>
add 'addする予定のファイル'
# 実際にaddされるわけではない
pushの前に今いるブランチは間違えてないか、push先のブランチは間違えてないか心配
$ git push -n <リモート名> <プッシュ先ブランチ>
To https://github.com/hogehoge/fugafuga.git
123456..7890ab local_branch -> remote/branch
# 実際にpushされるわけではない
要は前述の--dry-run
と同じです
何かをミスった時に使うコマンド
たとえ 超超超心配性 でも、「ミスっても○○すれば直るから大丈夫だもんね!」というお気持ちになれれば心強いもの。
コミットコメントをミスった -> 直前のコミットを編集
viが開かれ、コミットメッセージを編集できる
$ git commit --amend
コミットそのものをミスった -> コミット取り消し
$ git reset (オプション) HEAD~
reset
コマンドはオプションとresetするコミットの指定方法によって色々できます
オプション
-
--soft
commitのみ取り消し -
--mixed
commit, add取り消し(オプションなしの場合もこれ) -
--hard
または--merge
そもそもの変更ごと取り消し
どこまで戻すか
-
HEAD
最新コミットまで戻る(最後のコミット後に変更した内容だけreset) -
HEAD~
またはHEAD^
またはHEAD@{1}
コミット1つだけreset -
HEAD~~~
またはHEAD^^^
(n個~や^をつける)またはHEAD@{n}
またはHEAD~n
コミットn個reset
※~
と^
にも一応違いがあるようですが、resetする分にはほとんど違いがないはずです。。。
https://qiita.com/chihiro/items/d551c14cb9764454e0b9
(2019/10/09追記、コメントありがとうございます )
HEAD
のエイリアスとして@
が使えるので、上記のHEAD
を@
として置き換えても可です
git reset
もミスった -> reset取り消し
$ git reset --hard ORIG_HEAD
作成するブランチ名をミスった -> ブランチ名変更
$ git branch -m <変更前のブランチ名> <変更後のブランチ名>
マージをミスった -> マージ取り消し
$ git merge --abort
コミットするブランチを間違えた -> cherry-pick
(移動先のブランチに移動してから)
$ git cherry-pick <移動元ブランチでのハッシュ値>
マージしたらコンフリクトした(マージをキャンセルする場合)
$ git merge --abort
さいごに
gitの知識と失敗の経験が身についてきたら心配性も緩和されていくと思うので、要勉強です
失敗するたびに更新して行きたいですね
自分の心配性が極端なのは自覚してますが、一息ついて確認するのも大事だと思いますよ。。。
お気持ち
sourcetreeとかgitkrakenとかのgitクライアントを使えばレポジトリの状況が見えやすくなるから心配性も緩和されることに最近気づきました。。。