Git GitHubでうまくいかなかったので記載しようと思います。
ちなみに、今回は、もりけん先生に教えていただいたgit cloneで作成してはいません…
次回に記事にします。
gitとgithubの違いについては、以下のリンクで調べました。
https://tech-blog.rakus.co.jp/entry/20200529/git#Git%E3%81%A8%E3%81%AF
※最初に注意することとして
ターミナルでgitを操作する場合、以後出てくるbranchの場所に注意すること!!
幹にあたるmasterなのか、branchを分けた枝で作業するのか…
移動は、git checkout “移動したいブランチの名”で移動可能
では、まず全体の流れです。
1,元々、作ってあったファイルをGitにあげるためにターミナルでGitにあげたいフォルダ(ここではaフォルダとする)へ行って”git init”と入力しました。
2、gitにaフォルダが登録され、
Initialized empty Git repository in /Users/sosukoipanda/a/.git/
という最後に.git/がついたコマンドが出ます。
3、ここから、GitHubに移って、新しいリモートリポジトリを作成します。
(下図のNEW Repositoryを選択してクリックして)
4、下図の画面になったら、上の四角の中に、フォルダ名(ここでは先ほどaとしました。)を入力します。
※これは、フォルダ名と、今回作成しようとしている四角の中のrepository nameはできれば同じ方がいいです。
何がなんだが分からなくなります。
5、2つ目の四角の”Initialize this repository with a README”はチェックを入れてください。
チェックすると何がいいのか…GitHubのリポジトリの初期化と、READMEファイルが作成でき、cloneがすぐにできるようになります。
cloneとは、羊のクローンのように同じデータを持った物をローカルリポジトリに作ります。
今回は別の方法ですが…
6、チェックができたら、下にある緑のcreate repository をクリックしてリポジトリを作成します。
それができたら、この今作ったリモートリポジトリとローカルリポジトリを連携させます。
7、下図を見て、まず、GitHub上で、作ったリポジトリの緑のcodeというボタンを押すと
git@github.com:xxxxx/xxxxxx.gitが表示されるので、それをコピーしてください。
8、先ほどコピーしたgit@github.com:xxxxx/xxxxxx.gitを
コマンドに貼り付けます。
git remote add origin git@github.com:xxxxx/xxxxxx.gitを入力してください。
9、git pull origin master をして、リモート上に作った情報をまず取得します。
このまま、git add → git commit → git push をすると、リモートとローカルとに差が出るので…
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to ‘git@github.com:yasu-pro/chef.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.
が出ます。
なので、
git remote add origin git@github.comxxxx/xxxxxx.git
をして、git上にリモートリポジトリを作ったら、
git pull origin master をすること。
これで、ローカルリポジトリとリモートリポジトリを連携することができました。
10、ここから、htmlファイル,cssファイル,Javacriptファイルなどを変更して、
git add .(既存のファイルをステージングする)
git add –all (新規ファイルとかも含めて、ステージングする)
11、その後、ローカルリポジトリへあげるために、
git commit -m “コメントをここに入力”
12、さらに、ローカルリポジトリからリモートリポジトリへあげるために
git push origin head をする。
origin headの意味は、
・originは、git@github.com:xxxxx/xxxxxx.git でリモートのサーバー名のことです。
・headは、今いるところの先頭→つまり、ローカルリポジトリで一番新しいところのことです。
一番新しいところとは、
git commitをしていくとbranchという枝が伸びていきます。
青色の文字のgit checkout -b “ブランチ名”をすることで、枝をきるという表現をするようですが、枝が別れます。もちろんここで、作業をしてcommitすれば枝が伸びます。
で、それを、master branchにくっつける作業をします。それが緑色の文字のmergeです。
それが、写真では、一番下の○がファイルとして、一番新しい状態です。それを、リモートリポジトリにpushするというのが、流れです。
13、その後、GitHubへ行くとpullRequestという緑色のボタンが出ます。
pullRequestは、変更したコードをリポジトリに取り込んでもらうように依頼する機能です。
次に…
さらにpullrequestの緑色のボタンを押した後、
GitHub上で、上図の写真の緑のボタンMerge pull request を押すことで、リモートリポジトリでmergeされます。
ちなみに、これをすることで、GitHubの草が生えます!!
例えば、下図のように…
ローカルリポジトリでmergeせずに、1回commitして、枝(branch)を伸ばした状態で、pushした場合。
リモートリポジトリには、赤い四角の内容がpushされます。
ここで、先ほど ”GitHubでpullRequestして、その後のmerge pull requestを押すとリモートリポジトリでmergeがおきます。” と書きました。
GitHub上で、merge pull requestを実行すると赤い丸の段階になります。つまり、黄色い丸のところができます。
ただ、merge pull requestしたら勝手にリモートリポジトリはmergeがおきますが、ローカルリポジトリは、mergeされていませんよね…(赤い四角の内容)
つまり、ローカルと、リモートの間で、ずれが生じます。これをなくすために
ローカルリポジトリをリモートリポジトリと同じにする必要があります。
それをするのが、git pullになります。
14、git pullすれば、ローカルの黄色い点線部分ができて、ローカルと、リモートの差がなくなります。
これは、もちろん、pullRequestや、merge pull requestをした後にローカルで作業をしていたら、また、リモートの内容と違うじゃないかと怒られますので、その場合は、git stashしてください。
git stashとは、一旦変更した物を横の机みたいなところに避けるイメージです。
その後、git stashの内容を追加すれば、問題はありません。
これが一連の流れになります。(1〜13を順にやればGitHubに草を生やすことができます。)
ちなみに、gitを操作する場合は、自分のいる位置の確認。つまり、ブランチの位置の確認(git branchで確認)をしてくださいね!!git statusも忘れずに!!
リファレンス https://qiita.com/samurai_runner/items/7442521bce2d6ac9330b
https://happy-making.com/study_log58/#toc11
2つ目のリンクは、同じ塾生のはるなさんのブログです。とてもわかりやすいです。
ここからは、僕がgit initを使って、エラーが出た内容で、どうやって解決したのかの備忘録です。
1〜10まで順調にできましたが…
11をした時、つまり、git push origin master をした時に
fatal: ‘origin’ does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
”orign”はgitリポジトリではないようです。
リモートリポジトリから読み取れませんでした。
正しいアクセス権があること、リポジトリが存在していることを確認してください。
(英訳…)
よくよく、調べてみると、8をやってませんでした。
git remote add origin git@xxxxx/xxxxxx.git
つまり、ローカルリポジトリとリモートリポジトリを連携できていませんでした。
これをした後に、
git push origin headをしたのですが…
Warning: Permanently added the RSA host key for IP address “xxxxxxxx” to the list of known hosts.
Enter passphrase for key ‘/Users/xxxxxxxxxx/.ssh/id_rsa’:
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
が出てきました。
/Users/xxxxxxxx/.ssh/id_rsa'のパスフレーズを入力:
のところが重要で、詳しく調べても分からなかったのですが、id_rsaの権限でつまずくことが多くあるみたいです。
解決策としては、一番最初にGitHubを登録した時にSSHのパスワードを設定したと思うのですが、それを入力しないと、いけないみたいです。
SSHのパスを入力したら、いけました。
その後、もう一度、git push origin headをすると今度は…
! [rejected] head -> master (fetch first)
error: failed to push some refs to ‘git@github.com:xxxxxx/xxxxx.git’
hint: Updates were rejected because the 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.
! [拒否]ヘッド->マスター(最初にフェッチ) エラー:一部の参照を 'git@github.com:xxxxxxxxx / xxxxx.git'にプッシュできませんでした ヒント:リモートが行う作業がリモートに含まれているため、更新は拒否されました ヒント:ローカルにはありません。これは通常、別のリポジトリのプッシュによって引き起こされます ヒント:同じ参照に。最初にリモートの変更を統合することができます ヒント:( 'git pull ...'など)再度プッシュする前。 ヒント:詳細については、「git push --help」の「早送りに関する注意」を参照してください。
とのことでした。(後半訳すのが面倒になったので、google先生にお願いしました。)
これの原因は、自分がリモートの変更をpullしてから、pushするまでの間に、他からのpushがあるなどしてリモートが変更されているためです。(そういえば一度、pushしてました。)
エラーメッセージが教えてくれているように、ブランチの先端がリモートのより後ろになっています。 ローカルの master ブランチを shared の master とマージしてあげる必要があります。 git pull でマージした後、改めてpushしましょう。
ここでの回答は、git pull origin masterと書いてありますし、この回答が多かったのですが…
自分は、git push -f origin masterでいけました。
意味は、リモートブランチがローカルブランチの派生元ではない場合も、ローカルブランチの内容で強制的に上書きする。
これには、リスクがありました。なぜなら、ローカルブランチの内容で強制的に上書きされてしまうので、本当に、上書きするローカルが正しいのかしっかりと確認する必要があります。
コマンドで行くと、実際に何が起こっているのか目で確認できないので、イメージしにくく、苦戦しますね…できるまで諦めないことですね…
以上です。
コメント