- 投稿日:2021-01-14T23:38:10+09:00
gitのコミットを取り消したい時に使う3つの方法
間違ってコミットしてしまった、コミットしたらデグレしてしまった。。
こういう時にコミットを取り消すコマンドがあります。
3つほど紹介したいと思います。gitのリポジトリ
working treeが手元のコード。一番新しいです。
git add ファイル名
するとindexというコミット準備段階になります。
index上のファイルにgit commit -m "comment"
するとメッセージとともにlocal repositoryに保存されます。最新のlocal repositoryのことをHEADと呼びます。
最後にgit push
すると、GitHubなどチームで管理するrepositoryに移ります。reset
remoteにpushする前ならこの方法で楽に任意のコミット履歴まで巻き戻せます。
pushしたあとresetするとリモートとの履歴に不整合が起き、git push -f
する必要が出てきますので注意。
もし自分のpushの前に誰かがpushした状態で、フォースプッシュするとその人のコミットを消し飛ばすので極力避けましょう。// 1つ前のコミットに戻りworking treeもリセット git reset --hard HEAD^ // 4つ前のコミットに戻りworking treeもリセット git reset --hard HEAD~4 // add を取り消す git reset --mixed // 4つ前のコミットに戻りworking treeはそのまま // つまりコミットのHEAD任意の履歴まで戻り、コード自体は残ったままになる。 git reset --soft HEAD~4 // 誤ってgit resetをした際に元に戻す git reset --hard ORIG_HEADrevert
git rest --hard
した際に他の人がpushした履歴(コミットログ)が消し飛ぶ危険性を避けるには、新たに打ち消し用コミットを作成する方法があります。
これなら履歴も消えないのでフォースコミットする必要はありません!git revert <対象のコミットID>rebase
無駄にコミットをしてしまい、醜くなってしまった時にまとめることができます。
あとで履歴を見たときに見やすく、レビューしてもらうときに余計な手間をかけさせないために使いましょう。git rebase -i HEAD~3 // こんな画面がviで表示されます。 // pickで残す履歴、sでまとめてしまう履歴を選びます。 // この場合はe331898だけ残し、あとはまとめてしまいます。 pick e331898 wip s c45e0bf test 6 s 042074b wip # Rebase 8ac1025..042074b onto 8ac1025 (3 commands) # # Commands: # p, pick <commit> = use commit # r, reword <commit> = use commit, but edit the commit message # e, edit <commit> = use commit, but stop for amending # s, squash <commit> = use commit, but meld into previous commit # f, fixup <commit> = like "squash", but discard this commit's log message # x, exec <command> = run command (the rest of the line) using shell # b, break = stop here (continue rebase later with 'git rebase --continue') # d, drop <commit> = remove commit # l, label <label> = label current HEAD with a name # t, reset <label> = reset HEAD to a label # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]JetBrainのEditorを使っている方
ちなみにIdeaやPhpStormなどJetBrainのEditorを使っている方はここからもrevert, resetできて便利ですよ!
Gitのタブを開く>Log>特定のコミットをクリック> revert commit
- 投稿日:2021-01-14T14:54:45+09:00
gitでThe requested URL returned error: 500 (Internal Server Error)
gitは、macでsourcetreeを使っています。
仕事で使う時は、会社のgitサーバーにリモートアクセスしてますが、一度、ユーザーID/パスワードで認証してあれば、2回目以降は通常入力する必要はありません。
が、たぶんmacOSをバージョンアップしたため、データは移行したんですが、プルしようとしたら、パスワードの入力を催促され、下記エラーがウィンドウに表示されました。
(サーバー名、gitリポジトリ名は書き換えてます)git --no-optional-locks -c color.branch=false -c color.diff=false -c color.status=false -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree fetch origin fatal: unable to access 'https://example.com/gitrepos/xxxxx.git/': The requested URL returned error: 500 Completed with errors, see above自分は更新してないブランチのプルなので通常エラーにならないはずの操作です。他の操作でもローカルでのコミットはできますが、サーバーにアクセスする操作だと同じエラーになります。
ググってもいまいちそれらしきのが見つからず。
知り合いに聞いたのを参考に試した結果、原因がわかりました。原因
パスワードを間違えていました。
自分でメモしてたパスワードが間違っていて、いくつか試して、正しいパスワードを入力したらうまくいきました。
何かしらキーチェーンがおかしくなっている場合もあるようです。
その場合の修正方法は次の通り。パスワード修正方法
一度間違ったパスワードを入力してしまうと、デフォルトでキーチェーンにパスワードを登録するチェックがついているので、そのまま間違ったパスワードで実行され、パスワード入力欄が出てきません。
(キーチェーンに登録してなければ、再度パスワード入力欄がでてきます)その場合は、ユーティリティ→キーチェーンを起動して、gitリポジトリ名(サーバー名)で検索し、キーチェーンデータを削除します。
そして再度、sourcetreeでプルするとパスワード入力欄が出てきますので、正しいパスワードを入力します。
正しいパスワードを忘れてしまって、何度か試したい時は、キーチェーンに登録するチェックをはずして入力、実行します。
- 投稿日:2021-01-14T14:18:30+09:00
特定のcommit箇所まで強制復元する【git reset --hard】
まず、戻したいcommitのハッシュ値を調べる。
(調べ方についてはコマンド操作よりVSCodeの拡張機能のGit Graphを使用する方がお手軽)例えば1ae86e0c3320c2e375d5d505f80813a6f7ba8a55と言うcommitまで戻したい場合は、下記のようにする。
git reset --hard 1ae86e0c3320c2e375d5d505f80813a6f7ba8a55
--hard
をつけると強制的にコマンドを実行する。
- 投稿日:2021-01-14T12:26:33+09:00
【Git】コミット履歴から特定のファイルのコミット情報を全て削除
- 投稿日:2021-01-14T12:18:34+09:00
git grep -l 'hoge' して取得した対象ファイルをvscodeで一気に開くワンライナー
コマンドを叩く前に必要なこと
- vscodeのダウンロード
code
のインストール1. vscodeのダウンロード
vscode持ってない人はダウンロード(そもそもvscodeユーザー向けの内容だけど一応)
https://azure.microsoft.com/ja-jp/products/visual-studio-code/
2.
code
のインストールこの記事が参考になりそう。
便利なので入れましょう。https://qiita.com/1natsu172/items/b951aa33451dad36bd7c
コマンド
以下をCLIで叩く
git grep -l 'hoge' | xargs -I % code %自分はgrep結果をさらにgrepしたりしたかったので
git grep -l 'hoge' | grep 'hoge' | xargs -I % code %のようにして開いた。超便利。
- 投稿日:2021-01-14T10:39:53+09:00
タグを付けてプッシュする
- 投稿日:2021-01-14T10:33:22+09:00
Sourcetreeで認証エラー(認証ダイアログが出ない)の対処法
backlogのgitからSourcetreeでCloneしたい
発生した問題
Cloneできない。認証エラーになる
- Clone元のURLを入力しても、「リポジトリタイプ:ソースパス/ソースURLとして正しくありません」となる。
- その横の[詳細]を押すと「エラー: remote: Authorization required fatal: Authentication failed for ...」となっている。
パスワードを間違えたら、認証ダイアログが出なくなってしまった
- もう一度正しいIDとパスワードを入力したいけど、認証画面が出ない
- どっかに間違えたユーザIDとパスワードが保存されてしまったのだろう
解決策
保存されてしまってる誤った認証情報を消す
- Sourcetreeのメニュー「ツール」> オプション > 認証
- 「git保存されたパスワード」の当該URLをクリック > 削除
- 投稿日:2021-01-14T02:41:59+09:00
git pushするとrejectしてしまった時の対処
目的
ローカルリポジトリ、リモートリポジトリで一度削除したファイルA、ファイルBのうち、
やっぱりファイルAだけ復活させて残したい時のgit対処について記載。基本こちらの記事を教材に、
私の場合は実経験に基づき会話形式で記事を掲載しています。リポジトリの状態遷移図
①~⑤は、リポジトリのコミット状態遷移を表す。
ブランチ:master
● ⑤ファイルBを再削除
| \
| ● ③ファイルA, ファイルBを削除
| |
● | ④ファイルAの削除を取り消し、復活
\ |
● ②コミット2
|
● ①コミット1問題事象と解決策
ここでは主人公Q子と心情とともに、問題事象と解決策を記載。
1.Q子「ファイルA、ファイルBとも要らんらしいな。下記コマンドで削除っと」
<ローカルリポジトリ>の③をリモートリポジトリに送信
git push
2.そのあと、Q子のもとへi先輩からファイルAを残してほしいと電話が。
Q子「えっなんやて、やっぱりファイルAだけ必要やと…!さっき消してもうたやん、i先輩もうちょっとはよ言うてなあ。まあええわ、下記コマンドでさっきのコミットを取り消しっと」
<ローカルリポジトリ>の③を取り消し
git reset --hard HEAD~
3.Q子「それからファイルAだけ再保存(※1)して、コミット、pushっと」
git add ファイルA
git commit -m "ファイルAの削除を取り消し、復活"
git push
※1: ファイル内容変更なくても、なぜか再保存しないとgit add
できない。
ベストプラクティスではないが、、一度ファイル内にカーソルを置き改行等することで再保存、git add
できるようになる。↓
PC画面さんの反応$git push To gitlab.com:XXXXX/tutorial.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'gitlab.com:XXXXX/tutorial.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e.g. hint: 'git pull ...') before pushing again. hint: See the 'Note about fast-forwards' in 'git push --help' for details. puts 'The best way to log and share programmers knowledge.'Q子「ぐおおお…git pushしたらrejectされてもた・・。なになに、non-fast-forwardやて?」
Q子、いったん調査に入る
Q子「ふむふむ…このリンクによると、上記3.のコミットによって、ブランチが完全に枝分かれした状態になったらしいな。つまり、<ローカルリポジトリ>の②から、関連の無い③の枝と④の枝が生えたってイメージか」
4.Q子「そいでそいで…関連の無い③と④のコミットをつなぎあわせるには、このリンクの方法に書いてある、下記コマンド試したらいいんか」
git merge --allow-unrelated-histories
↓
PC画面さんの反応$git merge --allow-unrelated-histories Removing ファイルB5.Q子「おおおお、ファイルB削除されたな。この調子でローカルリポジトリからリモートリポジトリにgit add、コミット、pushすれば」
git add ファイルB
git commit -m "ファイルBを再削除"
git push
↓
PC画面さんの反応$git push Enumerating objects: 8, done. Counting objects: 100% (8/8), done. Delta compression using up to 8 threads Total 5 (delta 2), reused 0 (delta 0), pack-reused 0 To gitlab.com:XXXXX/tutorial.git caac238..239dc47 master -> masterQ子「うおおおお、やったーーー!これで再度ファイルAだけ作り直さずに済んだわ、早速i先輩に報告や!」
めでたしめでたし
今回の問題事象は、偶々Gitの基本操作を学んでいた筆者がGit操作をしていてもしこんなことが起きたらどう対応すればいいんだろ~勉強と実践では違うとはこのことか~という危機感をもとに問題を生み出しました。(やはりGitをもっと習得するためには、基本操作だけでなく、現場で起きた問題・事例をもとに解いていくことも重要だとつくづく実感)
Q子さんの心情とともに問題と解決策をお送りする中で、実際にファイルを削除してしまったけどやっぱり必要だったという事象は仕事上で十分起こりえる事柄だと思いました。記事を書いてみて、Gitを知っていることで普段の仕事のロスタイムを減らせるメリット(今回の場合ならファイルを作り直すロスタイムを生み出さずに済んだこと)があると、さらにひしひしと実感。。。
もっといい方法があるよ、ここ解釈まちがってるよ等ありましたら、コメントくださいm(_ _)m
もっと技術磨き、頑張るぞーーー!