ご提示のエラーメッセージは、あなたがgitに変更 (commit) をpushする権限がないことを意味しています。
本来であれば、git cloneした人しかリポジトリをいじってはいけない
誤りです。たとえば「git clone
していない人がGitHub上でPull Requestを merge
する」というようなシチュエーションがありえます。
gitには (最低) 2つのリポジトリがあります。サーバー上 (GitHub上) のリポジトリと、あなたのPCにあるリポジトリです。サーバー上のリポジトリを リモートリポジトリ と呼びます。
あなたや、チーム内の他の開発者は、まず最初にリモートリポジトリを自分のPCにコピー (複製, clone
) します。そして、各々の開発作業を、自分のPC上で行います。
自分のPC上での開発作業 (コードの変更) が一区切りついたら、変更を一旦保存します。この「保存」は、たんにファイルを上書き保存するという意味ではなく、リポジトリ上に「こういう作業をした」という記録をつけるものです。これが commit
です。
これだけでは自分のPC上で変更が記録されただけで、リモートリポジトリには何の影響もありません。あなたの作業が実はとんでもないバグを生むものであったとしても、チームメイトや顧客はまったく困らないわけです。
とはいえ自分のPCでだけ作業していても空虚なだけですので、変更をリモートリポジトリに適用したいときがやってきます。commit した作業記録をリモートリポジトリに送信するのが push
です。
ところで、ここまでの説明であれば、gitなんか使わずに、ファイルサーバーにソースコードをおいて、直接編集すれば良いと思いませんか?
gitの優れているところは、「作業記録を積み重ねていくので、問題があったときに問題を生み出した記録をなかったことにできる」、「問題が発生する前の時代に戻ることができる」というのも大きいですが、**「複数人が同じファイルを同時に操作できる」**というところです。
クソ長い2000行くらいあるファイルがあったとします。あなたは先頭のほう、チームメイトは後半のあたりを操作したいとき、この変更が競合したとしても、gitを使っていれば「あなたのPC上の、先頭らへんに何行か追加した歴史」と、「チームメイトの、後半に何行か追加して、末尾の何行かを消した歴史」が積み重なるだけで、ファイルがぶっ壊れたりしません。(たまに、同じ箇所を作業していて、歴史を積み重ねようとしたときに衝突 (conflict) するという不幸な出来事も起こります)
さきほど、「gitには (最低) 2つのリポジトリがあります」と言いましたが、これが先述のシチュエーションです。あなたが今関わっているプロジェクトでは、3つ以上のリポジトリが存在しているようです。
つまり、「親のリモートリポジトリ」、「親からあなたのGitHubアカウントに分岐させたリポジトリ」、「親からチームメイトのGitHubアカウントに分岐させたリポジトリ」です。
いくら問題があったら過去に戻れるからといって、gitは「歴史の積み重なり」ですので、製品の肝を直接操作するのは危険です。新人が歴史をミスってなかったことにしたり、ライバル会社から金を握らされたスパイがわざと歴史をなかったことにしたり、とても疲れている人がもうむちゃくちゃなpushをして歴史の修正に凄い工数をかけないといけなかったり、リスクがあります。
そこで、限られた人 (チームリーダーとかレビュワーとか) しか親のリポジトリは操作できないようにして、プログラマーは親にpushさせないという運用を取る場合があります。
やることは、リポジトリが2つの場合とあんまり変わりません。最初と最後にちょっと作業が追加されます。
まず、あなたは親のリモートリポジトリを、あなたのアカウント上に分岐させます。これを fork
と言います。食器のフォークと同じです。
あなたは、「あなたのアカウント上のリモートリポジトリ」をPCに clone
します。開発が進むに連れて、 commit
したり push
したりします。このとき、 push
によって書き換わるのは「あなたのアカウント上のリモートリポジトリ」であって、親ではありません。
ところで、分岐した「あなたのアカウント上のリモートリポジトリ」を、親に適用させないと、またも空虚なだけですね。
作業が一段落ついたら、「俺のリポジトリの作業を親に混ぜてくれよ」というお願いをします。分岐した支流がもとの川に戻るような感じです。
なぜお願いをするのかというと、あなたは親のリモートリポジトリを操作する権限がないからです。 いまあなたが直面しているエラーメッセージは、おそらく権限がないのに親にpushしようとしているから表示されています。 支流がふたたび合流するかどうかは親が決めることで、つまり親を操作できる人が決めることです。このお願いを Pull Request
と言います。
あなたがすべきことは、まずあなたの変更が失われないように、操作したファイルをどこか(デスクトップとか)にコピーしておくことです。が、これはもうコメントを見る限り手遅れかもしれませんね。
次に、プロジェクト(親のリモートリポジトリ)を fork
します。で、 fork
の結果である「あなたのアカウント上のリモートリポジトリ」を clone
します。
clone
してできたフォルダ上で、あなたの変更を再度適用します。どこかにコピーできていれば、ファイルを上書きするだけでよいでしょう。そうしたら変更を commit
して、 push
して、 Pull Request
しましょう。
と、長々と書きましたが、gitの操作はかなり責任重大 (本人たちがやるのはそうでもないですが、私のような部外者がよそさまの製品の歴史の操作に口をだすべきではない) なので、まずはチームメイトと相談してください。