本記事について
Git/GitHubを使用した課題提出時に起こったヒヤリ事例を思い出し記録するものです。
ターミナル誤操作でGitHubにDesktopを大公開しようとしていた失敗を、P2Pで深夜まで一緒に対応してくれた同期への感謝を込めて認めます。
伝えたいこと
- ターミナル操作時の現在地確認 & cd によるディレクトリ移動は最重要!
- ホームディレクトリ直下で git initした際 .gitフォルダを消して解決した!
用語の確認
- ディレクトリ:おおまかにはフォルダと同義。
- ホームディレクトリ:ターミナル起動後、最初にいる場所。
私の場合は、MacBook > Macintosh HD > Users > 【自分の名前フォルダ】←ここ - カレントディレクトリ:現在地。今いるディレクトリのこと。
- cd:現在地から指定ディレクトリに移動するためのコマンド。
事の顛末
GitHubでリポジトリを作成しファーストコミットを終えた翌日、ファイルの修正を反映するため2度目のコミットを試みたところ、これが表示された。
error: failed to push some refs to ...
git push origin master
To github.com:[リポジトリのURL]
![rejected] master -> master (fetch first)
error: failed to push some refs to 'github.com:[リポジトリのURL]'
hint: Updates were rejected because remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in git push --help for details.
リモートとローカルそれぞれ別々に作業が進んでいるからpushできないよっていうエラー。
通常であれば、
① 一旦リモートの内容をローカルにpullして再度pushする方法
② fetchしてmergeする方法
などにより対応できそう。でも今回は何か様子がおかしい。
git status で現在の状態を見ると
warning: could not open directory '[ディレクトリ名]': Operation not permitted
On branch master
Untracked files:
(use “git add <file>...” to include in what will be committed)
〜〜 途中、赤文字でたくさんのファイル表示 〜〜
nothing added to commit but untracked files present (use “git add” to track)
Untrackedに救われることもある
赤文字のファイル名をよく見てみると、Library、Music、Pictures、Movies...??!
ここでやっとDesktopごと上げようとしていたことに気づく。
あぁ、untrackedであって正解だった。おかげであんなものやこんなものの大公開を防ぐことができた。
面倒だからって簡単に権限オールOKにしちゃだめだ。
原因はおそらく2つ
1. フォルダ管理方法のまずさ
当時私は作成用フォルダ(専用フォルダ)と提出用フォルダ(デスクトップ上)とを同名で分けていた。作成用フォルダ内のデータ修正後、提出用フォルダに丸ごと上書きしたところ、別フォルダと認識されリモートと繋がらなくなったのだと思う。それでいつもの操作パターンから外れてしまった。
2. ホームディレクトリ直下での git init
実は記憶は曖昧。でも状況から考えるに、焦って最初のコマンドからやり直そうとしたが、cdでのディレクトリ移動をせずに git init → git add . → git commit と進めてしまったのだろう。
検討した策
- .gitignore を使ってUntracked filesをGitの管理対象から外す → trackされたファイルはそのまま。。
- Untracked files を削除する → これも。。
- 根本から消して無かったことにする → これが最善
試したこと
git checkout . // 変更の取り消し
checkout . は特に何も起こらなかった。
git clean -n // 削除対象ファイルの確認
git clean -f // untracked fileの削除
効果なし。
なお、git clean -df (ディレクトリの削除)はDesktopごと消しそうで怖くてやめた。
git rm --cached [ファイル名] // ファイルをGitの管理対象から外す
fatal: pathspec [ファイル名] did not match any files というエラー。
解決の決定打
rm -rf .git // Gitの管理下にあるファイルを削除する
※ .gitはローカルリポジトリ用のGit管理ディレクトリ。隠しフォルダのため、Command-Shift-Periodで見つける。
※ 参考にしたサイト
・https://eng-entrance.com/git-rm
・https://stackoverflow.com/questions/62244042/how-to-remove-all-local-files-that-were-accidentally-added-to-the-git-system
I guess you git init in /User/ and that will generate a folder named .git in the current directory which tracks your files and folders. Simply delete the .git folder and you are good to go.
仲良くなったコマンドたち
cd [移動したいフォルダ] // ディレクトリの移動
ls // ディレクトリの中身を表示
git diff // 差分の確認
git status // 現在の状態を確認
git log // コミット履歴を表示
git lola // logの図解
最後に
- ターミナルでコマンドを実行する前に、現在地が作業したいフォルダであるか確認すること。これがとても重要。
- lsでディレクトリの中身を確認する癖をつけていると、間違った場所で作業しようとした際に気づきやすい。
- ターミナルに表示される文章をよく読むこと。焦って閉じたり消そうとしたり適当に同じコマンドを繰り返してみたりしない。Warningや赤文字の羅列が出たら、受け止める。そして心を落ち着けて次の手を調べる。
- 誤操作を防ぐため、ターミナルをカッコよくすること。ターミナルのプラグインマネージャを使うことで、視覚的にも(おそらく機能的にも)操作しやすいものになる。この話はまたいつか。
- 解決するまで長時間つきあってくれた、こいたん(@514daisuke)ありがとう。