ソースを切り戻す時、resetなのか?revertなのか?gitに慣れていないメンバーが多いこともあり、しっかり理解することで安心して切り戻しなどの作業をみんなができるようになると良いなと感じたことから記事にさせていただきました。
はじめに
コードの中にこちらのaliesが使われていますので記載します。alias glog='git log --graph --all --format="%x09%C(cyan bold)%an%Creset%x09%C(yellow)%h%Creset %C(magenta)%d%Creset %s"'
resetとrevert
利用シーン過去に戻る。
コミットした差分を修正したい
resetの基本
「指定したコミット位置までHEADの位置を戻す」revertの基本
「指定したコミットの逆差分を作成する」よくある切り戻しのシーン
バグが有るコードをリリースしてしまった。orzリリース前のコードに戻したい!!
どちらが正しいでしょう?
git resetを使って、前回リリースした位置まで戻す!
git revertを使って逆差分で上書きする!
正解はもちろん「git revertする」です。
revertによる切り戻し手順
revert -m 1 <commit hash>でマージコミットの逆差分を作ります(-m と 1 については下方で解説します。)※切り戻し自体はgithubのwebUIによる操作もできるようになりました(下方に記載)
[uenoryouichi@ueno-MacBook-Air:git_study](base)$ git revert -m 1 25605e9 [uenoryouichi@ueno-MacBook-Air:git_study](base)$ glog * Ryoichi Ueno fe81bcd (HEAD, base) Revert "Merge branch 'merged' into base" * Ryoichi Ueno 25605e9 Merge branch 'merged' into base |\ | * Ryoichi Ueno 5e19ce5 (merged) このブランチをマージする * | Ryoichi Ueno 4e1dfd0 このブランチでマージコマンドを打つ |/ * Ryoichi Ueno f410859 (master) second * Ryoichi Ueno 70e35e5 initial commit
reset使っちゃいけない理由
gitの概念として歴史を改変してはいけない。誰かが誤ったコミットの歴史を間違って保有している可能性がある。→デグレのリスクが生じる。
存在しないコミットから分岐したブランチが作られる可能性がある。→PRを送れないorデグレのリスク
例)
master_resetで7d71e00 をリリースしました。前回リリースは cdf4505
修正するためにresetで戻した場合(ダメなパターンです)
[uenoryouichi@ueno-MacBook-Air:git_study](recover_reset)$ git reset --hard cdf4505 HEAD is now at cdf4505 hogehogehogehoge [uenoryouichi@ueno-MacBook-Air:git_study](recover_reset)$ glog * Ryoichi Ueno 7d71e00 (master_reset) miss!!!!! * Ryoichi Ueno cdf4505 (HEAD, recover_reset) hogehogehogehoge * Ryoichi Ueno b3bd9c4 hogehogehoge * Ryoichi Ueno 44515ea hogehoge * Ryoichi Ueno 1b4f700 hoge [uenoryouichi@ueno-MacBook-Air:git_study](recover_reset)$ git push -f origin master
おさらい
resetの基本「指定したコミット位置までHEADの位置を戻す」
revertの基本
「指定したコミットの逆差分を作成する」
0 件のコメント:
コメントを投稿