GitHubでクローンしてRepository not foundになった

Macbookを買ったばかりで、gitからリポジトリをクローンしようと、いつものようにgit clone URLでクローンしたら、以下のようなメッセージが出たので、usernameとpasswordを入れました。

Username for 'https://github.com': 
Password for 'https://username@github.com'

目的のURLからリポジトリをクローンできたのですが。。。

個人のgithubのリポジトリをgit clone URLでクローンしようとしたら、以下のようなエラーが出ました。

remote: Repository not found.
fatal: repository 'https://github.com/xxxxxxx/xxx_proj.git/' not found

macのkeychainで記録していたのが原因で、gitで検索したら、github.com(インターネットパスワード)というのが出てきので、これを削除したら初期に戻り、git cloneする時に以下が聞かれるようになった。

Username for 'https://github.com': 
Password for 'https://username@github.com'

githubの別々のユーザーでもターミナルで使えるようにもう少し調べたい。

gitのリポジトリを移行する方法

今まで利用していたプロジェクトの直下に移動し、originのURLを確認します。

$ git remote -v
origin  git@github.com:nekoxxxx/test.git (fetch)
origin  git@github.com:nekoxxxx/test.git (push)

このoriginのURLを変更します。

リモートリポジトリを変更する

$ git remote set-url origin git@github.com:nekoxxxx-new/test.git

変更出来ているか確認

$ git remote -v
origin  git@github.com:nekoxxxx-new/test.git(fetch)
origin  git@github.com:nekoxxxx-new/test.git (push)

gitのふわっとした知識を調査してみた

gitで出てくる用語について、コマンドも含めて何となくわかっている気になっているけど、ちゃんと理解できていなかったので、調べてみました。

##ローカルとリモートのリポジトリの違い

これは大丈夫かと思いますが、念のためおさらい。

ローカルリポジトリ
->ユーザーの作業領域である「ワーキングツリー」を伴い、git addやgit commitコマンドの
 対象となるリポジトリ。


リモートリポジトリ
->外部にあるリポジトリ。複数人で作業する場合、インターネットに公開する場合などに利用する。
 名前にリモートとついているが、ローカルリポジトリに対してN/W越しである
 必要はなく、ファイルシステム経由や同一マシン上にあってもよい。
 また、リモートリポジトリはデフォルトでoriginという名前で登録される。

masterとorigin/masterの違い

まず、混同してはいけないのは両方ブランチである。
Gitには、ローカルブランチ、リモートブランチ、リモートトラッキングブランチの
3種類のブランチがあり、masterやorigin/masterは双方ともローカルリポジトリにありますが、
用途が違います。

master
->作業ディレクトリと結び付いているのがmasterブランチ。(ローカルリポジトリのブランチ)
 作業ディレクトリでファイルを更新してコミットする場合はmasterに入る。
 git cloneでリポジトリをコピーした場合、リモートブランチmasterがコピーされる。

origin/master
->リモートリポジトリにあるリポートブランチmasterと結びついているブランチ。
 なお、origin/masterは、リポートブランチmasterをローカルリポジトリで
 トラッキングするためのブランチ(リモートトラッキングブランチ)です。
 リモートブランチを参照するために利用しています。
 このブランチは変更できません。「origin/master」というのは、originという名前の
 リモートリポジトリにあるmasterブランチをトラッキングしていることを意味する。

リモートトラッキングブランチを含めたブランチは以下のコマンドで確認できます。

git branch -a

リモートトラッキングブランチって、いつ作成されるの?

リポジトリをクローンしたら、自動的に master ブランチを作成し、origin/master を追跡するようになる。

リモートブランチからローカルブランチにチェックアウトすると、追跡ブランチ (tracking branch)というブランチが自動的に作成されます。追跡ブランチとは、リモートブランチと直接のつながりを持つローカルブランチのことです。追跡ブランチ上で git push を実行すると、Git は自動的にプッシュ先のサーバーとブランチを判断します。また、追跡ブランチ上で git pull を実行すると、リモートの参照先からすべてのデータを取得し、対応するリモートブランチの内容を自動的にマージします。

あるリポジトリをクローンしたら、自動的に master ブランチを作成し、origin/master を追跡するようになります。これが、git push や git pull が引数なしでもうまく動作する理由です。

http://open-groove.net/git/git-summary/

そもそもoriginとかmasterって何?

master
->デフォルトのブランチ名 (svnでのtrunkと同じ)

origin
->リモートのサーバ名(デフォルト)

git push origin master の意味

変更、追加したコードをoriginというリモートリポジトリのmasterブランチにpush(アップロード)するという意味。

git push <サーバー名> <ブランチ名>

となります。

fetchって何してるんだっけ?

fetch
->fetchとはリモートリポジトリから最新情報をローカルリポジトリに持ってくるコマンド

fetchを実行すると、リモートリポジトリに新しい更新があればorigin/masterがリモートリポジトリの内容で更新され、masterブランチは更新されません。
これがfechを実行した状態です。fetchはマージしないで変更を取得して、確認したい場合や確認後に取り込みたい場合に良いのではないでしょうか。

fech後はorigin/master→masterへのマージが必要になります。
以下のコマンドを実行することで、origin/masterをmasterブランチにマージすることができます。(現在チェックアウトしているのがmasterブランチ)

git merge origin/master

git pullはfechとmergeをやっていた

pullは、fetchとmergeを一気に行うコマンドです。
あんまりちゃんと理解していませんでしたw

forkってなにをするの?

forkはgitの機能ではなく、githubの機能。
他の開発者のリポジトリをgithub上でcloneする。
このfork による clone は、通常の git clone と異なり、cloneしたという通知がオリジナル開発者に送られます。

以下のサイトが非常にわかりやすく、参考になります。
http://myscript.zouri.jp/github/fork.html

以下引用

なぜこのような機能があるのかというと、オリジナルのソフトウェアの開発に、あなたが貢献できるようにするためだ。一般的に fork するという行為には次のようなワークフローが期待されている。

あなたがオリジナル・リポジトリを fork する。
オリジナル開発者は外部の貢献者がいることを fork の通知で知る。
あなたが fork したリポジトリで作業をし作業履歴を伸ばす。
あなたがオリジナル開発者に pull request を送る。
オリジナル開発者は、オリジナル・リポジトリに、あなたの commit を取り込むか検討し、取り込むと決めたならば pull request を受け付ける。通常ここで何度かあなたとオリジナル開発者の間でメッセージのやり取りが発生する。
オリジナル開発者の手で、オリジナル・リポジトリにあなたの変更が反映される。もしくは反映されない。
以上見てきたようにforkするという行為はオリジナルへの貢献を前提とする。もしあなたがオリジナルに貢献する意図がないならば、オリジナル・リポジトリを fork する必要はない。貢献の意図がない場合は読み込み専用の URI を用いて git clone するだけでよい。

貢献を意図していないにもかかわらず、オリジナル・リポジトリを fork した場合、オリジナルの開発者に貢献の意思があると誤解されることがある。注意が必要だ。

rebaseってなんで使うの

以下が参考になりました。

http://liginc.co.jp/web/tool/79390
http://powerful-code.com/blog/2012/11/merge-or-rebase/

以下引用

不要なコミットが入り込むことがないので、直感的かつシンプルに履歴を保つ。

使用頻度が多くないため、まだイマイチわかっていません。
今後は利用していきたいです。

ちなみにcherry-pickというrebaseの簡易版のようなコマンドがあって、
それが便利そうです。ピンポイントのコミットをmasterに取り込むことができます。

git cherry-pick 99daed2

git コマンド

基本

クローン

git clone <リポジトリURL> <任意の名前 ※省略可>

// ブランチを指定してクローン
git clone -b <ブランチ名> <リポジトリURL>

// タグを指定してクローン
git clone --depth=1 -b <タグ名> <リポジトリURL>

masterだけでなく他のブランチももってくる

git clone <リポジトリURL> <プロジェクト名>
cd <プロジェクト名>
git branch -a

remotes/origin/fix_1234
remotes/origin/fix_5678
remotes/origin/fix_9012

git fetch
git checkout fix_1234

git branch

プル

git pull
// Already up-to-date.がでると最新

resetの参考図

<作業ツリー> <ステージ> <リポジトリ(HEAD)>

-----------------> ----------------->
git add .        git commit -m 'comment'

git reset        git reset --soft HEAD^

<------------------------------------
git reset --hard HEAD^

ステージ(インデックス)に追加

git add <追加するファイル名> // ファイルの追加

git add .  // 全てを追加
git add -u // すでにステージング済みのファイルを追加

ステージ(インデックス)から削除

git rm <削除するファイル名> // ステージから削除

git rm test*.text // ワイルドカードを利用して指定

ステージのやり直し

git revert

ステージが、現在のリポジトリのHEADの状態に戻ります。

git reset

ステージも含め作業ツリーも、現在のリポジトリのHEADの状態に戻ります。

git reset --hard

commit

git commit -m 'comment'

commitのコメント修正

git commit --amend -m "comment edit"

commitのやり直し

HEAD
↓
×
[A]<--------[B]<--------[C]
git reset HEAD^
※Cのコミットが取り消され、HEADがBになる。

–softを指定して、作業ツリーとステージはそのままにして、リポジトリのみ1つ前のコミットに戻す

git reset --soft HEAD^

git status
git add .
git commit -m 'edit file'

–hardを指定すると、作業ツリー、ステージ、リポジトリの全てが1つ前のコミットに戻ります

git reset --hard HEAD^

プッシュ

git push origin master

状態確認

git status
//On branch master
//Your branch is up-to-date with 'origin/master'.

リモートリポジトリにpush

git push origin master

ログ確認

git log
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700

changed the version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700

removed unnecessary test code

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700

first commit

SHA-1 チェックサム・作者の名前とメールアドレス・コミット日時・コミットメッセージが一覧表示されます。

直近1つのプッシュを確認

git log -1

差分

<作業ツリー> <ステージ> <リポジトリ(HEAD)>
git dif git diff --staged
git diff HEAD

インデックスとワーキングツリーの差分

git diff

インデックスとHEADとの差分

git diff --staged

ワーキングツリーとHEADとの差分

git diff HEAD

コミット間の差分を表示

HEADの1つ前とHEADの差分

git diff HEAD^ HEAD

または、

git diff HEAD~1 HEAD

~nでn個まえのコミットと比較できる。

なお、HEADの代わりにコミット(ハッシュ値)やブランチ、タグを指定できる。

直近のコミット内容を確認

git show

コミットを指定して表示

git show コミット

ちなみに、ハッシュ値を指定する場合、86802a5a96495015cacb234313952de8d965f6c7と
全てを入力する必要はなく、重複していなければ、先頭の何文字かだけでよい。

例)
$ git show 86802a

Author: neko <xxxxxxx@gmail.com>
Date: Mon Dec 22 21:22:35 2014 +0900

add test.text

diff --git a/test.text b/test.text
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/test.text
@@ -0,0 +1 @@
+Hello World

ブランチ

ローカルブランチの作成

git branch mybranch

phase_1ブランチからfeature_21を作成

git checkout -b feature_21 phase_1

ブランチ確認

$ git branch
mybranch
* master

*がついているものが今のブランチ

remoteのブランチもみる

$ git branch -a
* mybranch
master
remotes/origin/master

mybranchに作業場所をスイッチ

git checkout mybranch

$ git branch
* mybranch
master

ブランチ間の差分

git diff master mybranch

ブランチの作成+作業場所のスイッチ

git checkout -b mybranch

ブランチのpush

git push origin mybranch

作業ワーク内ブランチ削除

別のブランチへ移動

git checkout otherbranch

作業ワーク内ブランチ削除

git branch -d mybranch

タグ

タグ付け

コミットしてからタグを付ける

git commit -m 'v1.0をリリース'
git tag -a v1.0

//iでINSERTし、初回リリースと書いて:wq

git push --tags origin master

間違ったブランチを編集した場合

git stash
git stash list
git checkout <正しいブランチ>
git stash apply
もしくは
git stash apply stash@{2} //stash listで複数ある場合のみ

複数のコミットをまとめる(スカッシュ)

ログでコミットを確認

$ git log --oneline

6b78b9d last commit
d12871a test3
db92104 test2
e4ae077 test1
fe87ecf first commit

まとめたいコミットの1つ前ののコミット番号を指定してrebase
(今回はtest1〜test3までまとめたいので、その前のコミット番号を指定)

$ git rebase -i fe87ecf

テキストエディタが起動するので、その他コミットをsにする。(squash)

pick e4ae077 test1
s db92104 test2
s d12871a test3
pick 6b78b9d last commit

:wqで保存するとまたテキストエディタが開き、コミットのメッセージが表示されます。
“test1″、”test2″、”test3″のコメントがありますが、そのまま閉じればtest1のコメントで
まとまります。別のコメントにしたい場合は”test1″のコメントを別のコメントにします。

:wqで保存します。

.gitignore(git管理しないファイルを指定)

.gitignoreファイルの作成

# OS X
.DS_Store

# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
profile
*.moved-aside
DerivedData
*.hmap
*.ipa

# CocoaPods
Pods

!を先頭につけると、該当のファイルは無視の例外ファイル(無視しないファイル)になります。

 

初回のGit設定

Gitのセットアップ

以下のコマンドを実行する。

git config --global user.name "名前"
git config --global user.email "メールアドレス"

プロジェクトのセットアップ

プロジェクトがない場合

以下のコマンドを実行する。

mkdir sample
cd sample
git init
touch README
git add README
git commit -m 'first commit'
git remote add git@xxxxxxx.sample.git
git push -u origin master

プロジェクトが既にある場合

Xcodeで途中からgitを導入する場合は、以下を参考にローカルリポジトリを作成しておく。

<参考>
・Xcodeで途中からgitを導入する
https://nekosoftware.wordpress.com/2014/11/27/xcode%E3%81%A7%E9%80%94%E4%B8%AD%E3%81%8B%E3%82%89git%E3%82%92%E5%B0%8E%E5%85%A5%E3%81%99%E3%82%8B/

以下のコマンドを実行する。

cd myProject
git remote add git@xxxxxxx.sample.git
git push -u origin master

Xcodeで途中からgitを導入する

手順

1.「.gitignore」ファイルをプロジェクトの直下に作成する。
<参照>

2.プロジェクトファイル「●●.xcodeproj」がある場所にターミナルからcdコマンドで移動

3.ここに、gitの環境を構築する。以下のコマンドでGitを初期化して、.gitディレクトリを作成する。

git init

4.カレントディレクトリの内容を全てGitに追加。追加された内容を確認する。

git add .
git status

5.問題ないようであれば、最初のコミットを行う。

git commit -m "first commit."

参考サイト
http://yoppa.org/blog/3110.html