異なるgitリポジトリを無理矢理マージする。別リポジトリをマージしようとするなんて、とんでもない!と怒られる
origin = デフォルト・リポジトリ
mamster = デフォルト・ブランチ
追跡ブランチ(tracking branch) = ローカルブランチ(master)が更新を追いかけるローカルブランチ(origin/master)の事
上流ブランチ(upstream branch) = ローカルブランチ(origin/master)が更新を追いかけるリモートブランチ(origin master)の事
普通は、gitリポジトリからgit cloneして、pushなりpullして開発を続けていくものだが
FTPとかSCPでダウンロードしてローカルで開発。pushしてと言われて慌ててgit initするも、リモートとローカルで別リポジトリになってしまう時がある。git cloneしててもある事もある。
この状態で、いざgitリポジトリにpushしようとしても別gitリポジトリのために、リモートgitリポジトリにはpush出来ません…。
適当なフォルダに、a.txtとか適当なファイル生成して
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# ローカルgitリポジトリ生成 git init git add -A git commit -m "first commit" # リモートリポジトリ一覧は、git cloneしてないので空の状態 git remote -v # 手動でリモートリポジトリを登録する。originはデフォルトのリポジトリ。 # git pushなど、コマンドでリポジトリを指定しない時は、originになる git remote add origin リモートリポジトリのURL # リモートリポジトリが登録されたか確認 git remote -v origin リモートリポジトリのURL (fetch) origin リモートリポジトリのURL (push) # この状態で生成しただけの空リポジトリにpushすると、上流ブランチが無い!と怒られる # 上流ブランチとは「ローカルブランチが更新を追いかけるリモートブランチ」の事。要するにpush先ブランチが指定されてない! git push fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master # ブランチの状態を確認 git branch -vv * master 9a77308 first commit # エラーメッセージに従い、上流ブランチを設定 git push --set-upstream origin master #長いので-uの省略形もよく使われる git push -u origin master # ブランチの状態を確認すると、origin/masterが追加され、上流ブランチを設定されている。 git branch -vv * master 9a77308 [origin/master] first commit # リモートリポジトリとローカルリポジトリが紐付けられて、無事push出来た。 git push Everything up-to-date |
git push と git push origin master は同じ意味になる。
ふだん、既存リポジトリからgit cloneしていると、ここいら辺は自動的に設定されるけど、イチから自分でやると結構面倒だ…。
ここからが本題で、ローカルに別リポジトリを生成する
同じリモートリポジトリを、上流ブランチを設定しようとするとエラー
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
git push -u origin mastert ! [rejected] master -> master (fetch first) error: failed to push some refs to 'リモートリポジトリのURL' 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. # リモートリポジトリと差分があるので、pushできないよ。 # まずgit pullで最新版を取得して、ローカルでmergeしてから、pushして! # 単純にpullしようとすると、別リポジトリをマージしようとするなんて、とんでもない!と怒られる git pull origin master From リモートリポジトリのURL * branch master -> FETCH_HEAD fatal: refusing to merge unrelated histories # リモートリポジトリは指定してあるので、オプションで無理矢理マージすると、ローカルでマージされる git merge --allow-unrelated-histories origin/master # この状態なら、上流ブランチが設定できる git push --set-upstream origin master # 別リポジトリをマージして、リモートリポジトリにpushできた。 git push Everything up-to-date # gitログも、無事にマージされている git log --oneline 7a73f8c (HEAD -> master, origin/master) Merge remote-tracking branch 'origin/master' eb96312 first commit 9a77308 first commit # リポジトリのマージで、コンフリクトが無ければ、これで良いのだけど、実際は確実にある。 git merge --allow-unrelated-histories origin/master CONFLICT (add/add): Merge conflict in a.txt Auto-merging a.txt Automatic merge failed; fix conflicts and then commit the result. |