取消関連のgitコマンド

やり直し プログラミング

プログラムのコードを修正した後に、

あ、しまった。考慮漏れのパターンがある。この修正ダメじゃん。

ということは、多々あること。

だから、git addやgit commitの取消等はしっかり覚えておかないといけないですね。

git addする前のファイルの変更の取消、ファイルの削除

エディター(VSCode等)のソース管理からも対処できるし、エディターから間違いを修正しちゃえばいいじゃんとも思うけど、とりあえずgitコマンドからの対処を記載します。

git addする前のファイルを削除する

cancel/before-add1.html、before-add2.htmlというファイルを作成。

git cleanコマンドを投入してファイルを削除する。

そこに、作成したファイルを削除するための

git clean -f 「ファイル名」

を投入。

ファイル名が削除されました。

しかし、git add前の削除ならエディターからファイルを削除してもできますからね。

わざわざコマンド使う人も少ないでしょう。

git add する前の変更を取り消す

git restoreを投入する前

ファイルの変更を取り消すときには

git restore 「ファイル名」

を投入します。

git restoreを投入後、変更が取り消された。

変更が取り消されています。

この変更作業の取消は、エディターを使うよりもgitの機能を使った方がいいかなと思うところはあります。

git addしたものをすべて取り消すなら、

git restore .

で、全取消です。

git addした後のファイルの変更の取消

git addは比較的軽い気持ちで実行してしまうコマンドじゃないかと思います。

だから、git addからの取消というのが、一番使うんじゃないでしょうか。

git addで、stagingしたコードを、

「ちょっと待てよ。」

と思って、working Treeに戻すというのが一番多いんじゃないでしょう。

その時使うのが、

git restore --staged 「ファイル名」(すべてファイルの時は”.”)
ファイルをgie addでstagingした

ファイルをgit addでstagingした状態。

stagingされたコードをget restoreで取り消してworking Treeに戻す。

git restoreを投入すると、ファイルがworking Treeに戻っています。

get reset 

コマンドを使っても同様のことができます。

git commit後のファイルの変更の取消

git commit後の取消は3種類あります。

では、ファイルをcommitした状態でスタート

commit状態

stagingに戻す:git reset –soft HEAD^

git commitしたファイルをstagingまで戻すコマンドは、

git reset --soft HEAD^
git reset --soft Head^を入力した結果

コマンドを入力すると、ファイルはcommit状態からstaging状態に移行します。

working Treeに戻す:git reset –mixed HEAD^

git commitしたファイルをworking Treeまで戻すコマンドは、

git reset --mixed HEAD^
git reset --mixed HEAD^を投入して、ファイルはworking Treeにある状態に移行

コマンドを入力すると、ファイルはcommit状態から、working Treeでの変更状態に移行しています。

無かったことにする:git reset –hard HEAD^

その変更自体いらない。ファイルも削除していい。

というときは、

git reset -- hard HEAD^
git reset --hard HEAD^を投入してファイルの変更はなかったことに

コマンドを投入すると、新規で追加したファイルも無くなる状態に。

ファイルの追加・変更自体がリセットされます。

commitのコメントを修正したい。

取消ではないですが、commitのコメントを修正したいということは多々あるでしょう。

それには、

commit --amend -m "修正後のコメント"

です。

commitのコメントって後々まで残りますから、間違ったらしっかり修正したいですね。

ただ、pushしたものを変更するとコンフリクトが発生するので、pushした後のコメントを修正するときは、根性入れて対処しましょう。

git pushを取り消す

githubへのpushを取り消したい…当然ありますね。

その取り消しには

  • commitの履歴を残す方法
  • commitの履歴を残さない方法

の2種類があります。

commitの履歴を残す方法:git revert

準備

git reverteをテストするためにファイルを作成した。

まずは、push-cancel.htmlというファイルを作ります。

ファイルをpushした。
githubにファイルをpushして成功。

作成したファイルをcommit & push。

git revert

pushの取消のためのrevert投入
git revert 「commit ID」

を投入すると、revertに関するコメント入力を求められる。

VSCodeターミナルで実行すれば、VSCodeのエディターが使えるので便利。

git revertを投入して、コメントを追加した結果

get revertを投入して、コメントを入力すると、working Treeから新規追加したファイルが削除され、その削除のcommitが作成される(「revertした」というcommit)。

revertしたcommitをpushすることによって、githubにアップロードしたpushがキャンセルされる。

キャンセルされたcommitもrevertしたcommitも残るので、「commitの履歴を残す」ということになる。

commitの履歴を残さない方法:git reset –soft 「commit ID」

準備

ファイルをgithubにpush

最初にファイルとgithubに「push.html」をpush。

git reset

push済みのcommtをreset

push済みのcommitを

git reset --soft 「commit ID」

で、取消。

githubに強制push

githubからpushしたcommitが消えました。

git mergeを取り消す。

mergeの取消も、pushの取消のように

  • commitの履歴を残す方法
  • commitの履歴を残さない方法

があります。

mergeを取り消す前のmergeの状態

mergeの取消前の状態

以下のコマンドでもチェックできます。

git show

でチェックしておくと便利。

merge先とmerge元のcommit IDなんかもチェックできます。

履歴を残す:git revert -m 「残す方の番号」 「commit ID」

revertを使うとちょっと複雑になりますね。

git revert -m 「残す方の番号」 「commit ID」
履歴を残さないmergeの取消

git revertをする前に、git showでmergeの情報をチェック。

今回は、mainの方に倒すということで「残す番号」は1としてget revert投入。

そうすると、practice branchのmergeがrevertされました。

mainとpracticeで差分があるから、またmergeどうなるんだろう。

と思うところですが、

merge revertしたあとに、またmergeしたら。

すでに、mergeはされています!

そうか、履歴を残す取消だから、mainのコード上に存在しなくても、それはすでにmergeしたものとして扱うんだな。

では、もう一回practiceでadd commit してmergeすればいいじゃん。

そうすると、なんとコンフリクトが発生します。

え~、main branchのソースとpractice branchのソースではファイルも修正もかぶっていないのに。

なんで~!

ここでよく考えてみると、すでにmergeを実行しているので、practice branchのコードはmainに反映されています。

それを履歴つきのrevertで取り消したのですから、取り消したmergeの時のcommitとはコンフリクトを起こすのですね。

ちょっと、違和感はありますが、よく考えてみれば「履歴を残してある」ので、納得です。

こんな時は、冷静にコンフリクトを解消しましょう。

履歴を残さない:git reset –hard ORIG_HEAD

git reset --hard ORIG_HEAD
履歴を残すmergeの取消

コマンドを投入すると、main branchにはpractice branchで追加したファイルが無くなっています。

さらに、Git Graphでみると、mainとpracticeは分かれて、maerge前の状態に戻りました。

※この記事は「git/github」に関する備忘録です。

タイトルとURLをコピーしました