メニュー 閉じる

Gitがよくわからない私のための技術メモ

この記事はGitを使っている中で、
たまに起こるエラーと思われる問題をなる早で解決するためのメモです。

対象者

  • Gitコマンドが使える
  • Giuhubアカウントが使える

意外と引っかかるポイント

  • コードの「$」は自分が打つコマンドを示しており、実際に入力する際は不要

 

Gitをforkしてcloneするとか、もはや呪文だが流儀に従う

 

まず、Gitというのはソースコードを管理するフリーのプロジェクトである。

GithubとかBitbucketというアプリはGitで管理するコードをみんなでシェアしたり、
自分用に保存しておいたりするためのアプリである。
こちらはサービスとして商用化されているのでお金を払うと、
社内のよりたくさんの人と一緒に使えたりする。

最初はGitを使う意味がわからないし、Commitの適当な頻度もわからなければ、
どこにPushされているのかもよくわからない。

それでも、とりあえずは下の記事を参考にしてやってみて欲しい。

 

新人ではないがGit初心者であるエンジニアが
「このリポジトリをフォークしてローカルで開発できるようにしておいて!」と言われた時にやること

https://qiita.com/sky0621/items/8b6e88f4327b42ade5d7

 

うまく行けば問題なくcloneできるかも知れないが、
SSHの設定などで躓いてしまうこともきっとあるに違いない。それを乗り越えるのも楽しいよ。

Gitを使えるとチーム開発では本当に役立つことに少しずつ気づくかもしれない。
1人でやっていてもうまく使えれば役立つことがあるかもしれない。

フォーク(Fork)というのはGithubやその他のソースコード管理ソフト上で、
「そのプロジェクトに貢献します!」と手を上げること。

結局、ソースコードをダウンロードすることは必要。
つまり、作業はローカルに保存する。

それをGitの操作ではクローン(clone)するのだけれど、
クローンが単なるローカルへのコピーであるのに対して、
フォークは他人の作ったプロジェクトにフィードバックして貢献するときに使う。

実際のところはforkしてできた修正にPull Requestをするよりは、
権限があるプロジェクトであるならば直接ブランチを切っておいてPull Requestをして、
そのまま、本プロジェクトにリーダーレビューが終わったらマージしてくれることが多いらしい。

そのあたりはおいおい、分かるようになれば良いんだと思う。

 

$ git pull origin masterとはどういう意味なのか?

 

さてさて、例えばローカルで開発するときはとりあえずおまじないのように、

$ git pull origin master

をする場合が多いと思う。しかし実は自分もよく理解していないことがある。
pullはわかるとしても「masterとかoriginとかmainってなんだ?」という話である。

 

Git – originとmasterとは何か(初心者向け)
https://qiita.com/seri1234/items/e651b3e108a695a92809

 

上記記事を見ると、masterというのはGitの初期設定でつけられるメインのブランチである。
originというのはもともとのコードが置いてあるGithubの場所(リモート)を指している。

だから、以下のようになる。

$ git push origin 'ブランチC'

は、ローカルリポジトリの今いるブランチの変更を、リモートリポジトリ(origin)のブランチCにpushするよ! という意味になり

$ git pull origin master

リモートリポジトリ(origin)のmasterブランチの内容を、ローカルリポジトリの今いるブランチにpullするよ!という意味になります。

 

最初にこれが理解できていれば、変なところにPushするようなことはなくなる。
しかし、実際のところ上の説明でもなんだかよくわからない。(自分だけ?)

まず、今あなたが操作しているgitがどこのリモートリポジトリにつながっているかというと、
以下の「git remote -v」で見ることができる。

$ git remote -v
linda_chat github:SHayashida/ideaTools.git (fetch)
linda_chat github:SHayashida/ideaTools.git (push)
origin github:cocolofun-inc/ideaTools.git (fetch)
origin github:cocolofun-inc/ideaTools.git (push)

上の表示はあくまで私もリポジトリが表示されているので同じじゃなくても問題ない。
とにかく、ここで重要なのは例えば上のような表示がされているならば、

「origin」というリモートリポジトリは「github:cocolofun-inc/ideaTools.git」のことであり、
「linda_chat」というリモートリポジトリは「github:SHayashida/ideaTools.git」を指している。

このようにgitはリモートリポジトリをわざわざURLで入力しないようにするために、
originという名前が自動的にあてられるということである。

このあたりが最初はgitの理解に苦しむところである。

最初はみんな何も疑問に思わないで「git pull origin master」することが多いが、
実際はローカルに新しくGitを作ったときに初期設定でつくられるmasterというブランチに、
リモート(origin)のmasterブランチの内容をコピーするということをしていたのだ。

それじゃあ、応用編。

たとえば、自分が新しいツール機能(new_tool)を実装して、
プロジェクトのGithub(origin)のfeature(機能追加・改修)ブランチに、
Pushするときはどういうコマンドを打つだろうか。

ただし、リモートリポジトリはoriginで既に設定済み。
ブランチの命名についてもちょっと考えてみること。

 

答えの例

$ cd そのツール機能を実装した場所に移動
$ git push origin feature/new_tool

 

ローカルで作ったブランチをリモートにPushしたいとき

 

さて、ここまでやってきたらローカルでブランチを切っておいて、
「自分が開発した分」をリモートにプッシュしたいと思う。

さて、PychramからGit Pushしようとしたらどうもうまく行かない。

$ git push

ssh: Could not resolve hostname github: nodename nor servname provided, or not known
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

公開鍵の作成とSSH接続

 

SSH接続できていないものだと思ったので、
ローカルからSSH接続できるよう公開鍵を作成するというSSHの設定をした。

公開鍵の作成は以下のページを参考にした。

 

GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~
https://qiita.com/shizuma/items/2b2f873a0034839e47ce

 

Githubに接続ができているかどうかは以下のコマンドでわかる。

$ ssh -T git@github.com
Hi XXX(ID名)! You've successfully authenticated, but GitHub does not provide shell access.

これで一件落着かと思いきや、

$ git push
fatal: The current branch linda_chat has no upstream branch.
To push the current branch and set the remote as upstream, use

git push --set-upstream origin linda_chat

これは上位ブランチが無いということなので、
別に自分がローカルで名付けたブランチと同じ名前の上位ブランチをリモートに作成する。

(名前の付け方は現場で決まっている形式があるだろうからそれに従う)

$ git push --set-upstream origin linda_chat

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for '/Users/linda/.ssh/id_rsa.pub' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/Users/linda/.ssh/id_rsa.pub": bad permissions
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.

キーファイルのパーミッション変更

 

どうやらキーファイルの変更が必要だという。
他のユーザーからアクセスできるようなパーミッションでは使えないということ。

もはやおまじないと化しているであろうコマンドで、
ファイルのパーミッションについて変更する必要がある。

一先ずパーミッションを多くの方と同じように変更する。

$ sudo chmod 0600 ~/.ssh/id_rsa
Password:(使っているPCのパスワード)

 

SSHで接続しようとしたら秘密鍵のパーミッションでエラーが出た 
http://yachibit.hatenablog.jp/entry/2013/04/25/001912

 

そしてようやくリモート上にPushができる

もう一回同じコマンドを入力してみよう。

$ git push --set-upstream origin feature/linda_chat

(django) linda@lindaMBP ideaTools % git push --set-upstream origin feature/linda_chat
Enumerating objects: 44, done.
Counting objects: 100% (44/44), done.
Delta compression using up to 4 threads
Compressing objects: 100% (37/37), done.
Writing objects: 100% (40/40), 8.62 KiB | 1.23 MiB/s, done.
Total 40 (delta 11), reused 0 (delta 0)
remote: Resolving deltas: 100% (11/11), completed with 2 local objects.
remote:
remote: Create a pull request for 'feature/linda_chat' on GitHub by visiting:
remote: https://github.com/SHayashida/ideaTools/pull/new/feature/linda_chat
remote:
To github:SHayashida/ideaTools.git
* [new branch] feature/linda_chat -> feature/linda_chat
Branch 'feature/linda_chat' set up to track remote branch 'feature/linda_chat' from 'origin'.
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

ついにPushすることができたようだ。
この場合は今いるブランチの内容をfeature/linda_chatというリモート上のブランチにPushした。

このときリモート上にはfeature/linda_chatというブランチは存在しないため、
自動的にリモート上にfeature/linda_chatブランチが作成された。

remote: Create a pull request for 'feature/linda_chat' on GitHub by visiting: remote: https://github.com/SHayashida/ideaTools/pull/new/feature/linda_chat remote: To github:SHayashida/ideaTools.git * [new branch] feature/linda_chat -> feature/linda_chat

error: The following untracked working tree files would be overwritten by mergeというエラーが出た場合の解決

 

git pull や git push等で出やすいエラーの一つです。
作業ツリーにgitに登録されていないファイルがあるので追加するか削除して下さい。

別にリセットされても良いようなものであれば、
エラーに取り上げられているファイルを削除することで解消します。

git pullしたときにerror: The following untracked working tree files would be overwritten by merge とエラーがでる解決方法
https://qiita.com/pugiemonn/items/ef595c49eedd4f991a1e

 

いや、Gitって何度やっても難しい…