🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

729閲覧

チーム開発でgit cloneした人と、デプロイ作業する人が違いコミット、プッシュ時にエラーが出てしまいます。

teruya_inomata

総合スコア14

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2019/12/03 13:44

チーム開発での作業をしているのですが、git cloneした人と デプロイ作業をしている人物が違い、エラーが起きてしまいました。本来であれば、git cloneした人しかリポジトリをいじってはいけないみたいですが、知らずに作業をしてしまっていました。
コミットプッシュする際にエラーが起き、解決できなくなってしまいました。

aws インスタンスの作成 エラスティックID 関連ずけなどは終了しています。現段階ではアプリが二つ存在しているらしく、一度、リポジトリを消して、サイド、git cloneをした後フォークをし、本来git cloneをした人のリポジトリでコミット、プッシュした方がいいと言われ、やり直したのですが、できません。

なお、awsの設定、エラスティックID エディタのコードはやり直す必要がないと聞きました。

あとは、初めにgit cloneをした人の環境で、コミットプッシュをし、役割を変更しようと思っています。(そもそもそれは自分のパソコンでできるのかも教えていただきたいです、)。

しかし、調べても調べても、解決しないので、今回質問させていただくことにしました。

どうかご教授お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thyda.eiqau

2019/12/03 13:46

エラーメッセージを開示できる範囲でご提示ください
teruya_inomata

2019/12/03 13:53

https://gyazo.com/ec9a535fc768b005fe81bc481e17fac1 ありがとうございます。こちらです。しかし、一度リポジトリを削除し、もう一度git cloneをし直しフォークもし直しました。これでアプリは二つ存在すると言ったことは解決したのではないかと思っていますが分かりません。あまり仕組みを把握しておらず、このような自体に落ちいってしまいました。 初めにgit cloneをした人の環境でコミット、プッシュすれば今までの作業の途中から続けられるとのことなのですが、そうなのでしょうか。 チーム開発においてリポジトリは一人の人物以外いじらないのが鉄則だと今回知りましたので、これが終わりましたら、役割を変更しようと思っております。 どうか助けていただきたいです。お願いいたします。
thyda.eiqau

2019/12/03 13:58

エラーメッセージは質問の本質に関わる部分ですので、あとから見に来た人が「追記・修正」の欄を開かなくても状況を理解できるように、質問本文を編集する形でご提示いただけますか。ちなみに画像は外部サイトを使わなくてもteratailに直接アップロードできますし、そのほうがインライン表示されるので良いです
Takumiboo

2019/12/03 14:15

Ruby on Rails関係ありますか?
thyda.eiqau

2019/12/03 14:41

「git」「GitHub」というタグがあるようですので、こちらに変更されたほうがよいでしょう。Gitに知見のある方が見に来てくれる可能性が高まります
guest

回答1

0

ベストアンサー

ご提示のエラーメッセージは、あなたが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の操作はかなり責任重大 (本人たちがやるのはそうでもないですが、私のような部外者がよそさまの製品の歴史の操作に口をだすべきではない) なので、まずはチームメイトと相談してください。

投稿2019/12/03 14:37

編集2019/12/03 14:40
thyda.eiqau

総合スコア2982

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問