gitでorigin / masterの場所を見つけるにはどうすればよいですか、またどのように変更しますか?


227

私はGitの初心者です。最近、RailsプロジェクトをSubversionからGitに移動しました。私はここでチュートリアルに従いました:http : //www.simplisticcomplexity.com/2008/03/05/cleanly-migrate-your-subversion-repository-to-a-git-repository/

また、コードを格納するためにunfuddle.comを使用しています。次のコマンドを使用してネットワークに接続しているときに、電車の中で仕事中のMacラップトップに変更を加え、それを手放しにプッシュします。

git push unfuddle master

私はデプロイメントにCapistranoを使用し、masterブランチを使用してunfuddleリポジトリーからコードをプルします。

最近、ラップトップで「git status」を実行すると、次のメッセージに気づきました。

# On branch master
# Your branch is ahead of 'origin/master' by 11 commits.
#
nothing to commit (working directory clean)

そして、私はその理由について混乱しています。私のラップトップが起源であると思いました...しかし、私が最初にSubversionからプルしたか、Unfuddleにプッシュしたという事実がメッセージを表示しているのかどうかはわかりません。どうやって:

  1. Gitが「origin / master」がどこにあると考えているか調べてください。
  2. 別の場所にある場合、どのようにして私のラップトップを「元の/マスター」に変えることができますか?
  3. このメッセージを取得して、先に進みます。Gitが何かに不満を持っていると思います。

私のMacはGitバージョン1.6.0.1を実行しています。


git remote show origindbrの提案どおりに実行すると、次のようになります。

~/Projects/GeekFor/geekfor 10:47 AM $ git remote show origin
fatal: '/Users/brian/Projects/GeekFor/gf/.git': unable to chdir or not a git archive
fatal: The remote end hung up unexpectedly

git remote -vアリストテレス・パガルツィスの提案どおりに走ると、次のようになります。

~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
origin  /Users/brian/Projects/GeekFor/gf/.git
unfuddle    git@spilth.unfuddle.com:spilth/geekfor.git

興味深いことに、私はgeekforディレクトリでプロジェクトに取り組んでいますが、私の原点はgfディレクトリ内のローカルマシンであると表示されています。私はgf、プロジェクトをSubversionからGitに変換するときに使用した一時ディレクトリであり、おそらくそこから解読するようにプッシュしました。次に、unfuddleからgeekforディレクトリに新しいコピーをチェックアウトしたと思います。

だから私はdbrのアドバイスに従い、実行する必要があるようです:

git remote rm origin
git remote add origin git@spilth.unfuddle.com:spilth/geekfor.git

回答:


202

1. Gitが「origin / master」が使用していると考えている場所を見つける git-remote

git remote show origin

..これは次のようなものを返します。

* remote origin
  URL: me@remote.example.com:~/something.git
  Remote branch merged with 'git pull' while on branch master
    master
  Tracked remote branch
    master

リモートは、基本的にはリモートリポジトリへのリンクです。あなたがするとき..

git remote add unfuddle me@unfuddle.com/myrepo.git
git push unfuddle

..gitは、追加したアドレスに変更をプッシュします。これは、リモートリポジトリのブックマークのようなものです。

を実行するgit statusと、リモートにコミットが欠落していないか(ローカルリポジトリと比較して)、欠落している場合はコミット数でチェックされます。すべての変更を「origin」にプッシュすると、両方が同期するため、そのメッセージは表示されません。

2. 別の場所にある場合、どのようにして私のラップトップを「元の/マスター」に変えることができますか?

これを行う意味はありません。「origin」の名前が「laptop」に変更されたとしましょう- git push laptopラップトップからやりたくないです。

元のリモートを削除する場合は、実行します。

git remote rm origin

これは何も削除しません(file-content / revisions-historyに関して)。これにより、リポジトリがリモートと比較されなくなるため、「ブランチが先に進んでいます。」というメッセージが表示されなくなります(削除されたためです)。

覚えておくべきことの1つは、特別なことは何もないoriginことです。これはgitが使用するデフォルトの名前にすぎません。

またはのoriginようなことをするとき、Gitはデフォルトで使用します。だから、もしあなたがよく使うリモコン(あなたの場合はUnfuddle)があるなら、私はunfuddleを "origin"として追加することを勧めます:git pushgit pull

git remote rm origin
git remote add origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

または、set-urlを使用して1つのコマンドで上記を実行します。

git remote set-url origin git@subdomain.unfuddle.com:subdomain/abbreviation.git

次に、単純に、git pushまたはgit pull更新する代わりに、git push unfuddle master


1
彼はoriginリポジトリにプッシュすることを書いています(たとえそれがgit用語でどのように機能するかを認識していませんが)–リモートを削除することは彼にとって何の役にも立たないでしょう。
アリストテレスPagaltzis 2008年

10
人々が質問を言い換える理由がわかりません。質問の意味が変わり、既存の回答が意味をなさなくなります。また、質問が少し「正しくない」かもしれないという事実に基づいて、質問者がより多くの情報を必要としていることを他の人に知らせません。
STU

9
リモートの起点を削除することは、私が必要とするものとまったく同じでした。なぜなら、それは、もはや存在しないローカルなリポジトリを指しているからです。
ブライアンケリー

3
stu:言い換えはいいことです!最初からはっきり言っていない場合は、実際の問題を解決しない回答を得ても意味がありません。
dbr 2008

4
しかし、怒って苦い方がずっと簡単です。:-)しかし、私はあなたの要点を理解しています。
stu

286

私はこの質問に来て、gitの一般的なスキームで、「ブランチが先にあります...」というメッセージの意味についての説明を探しました。ここではそれに対する答えはありませんでしたが、「あなたのブランチは 'origin / master'の前にあります」というフレーズを検索すると、この質問は現在Googleの上部に表示されるため、メッセージの意味を理解しました。 、ここに情報を投稿すると思いました。

ですから、gitの初心者なので、私が必要とした答えはまったくの初心者の答えであることがわかります。具体的には、「ブランチが先に進んでいます...」というフレーズは、ローカルリポジトリに追加してコミットしたが、オリジンにプッシュしたことがないファイルがあることを意味します。このメッセージの意図は、少なくとも「私にとっては「git diff」が違いを示さなかったという事実によってさらに難読化されています。ローカルリポジトリとリモートマスターの間に違いがあると言われたのは、「git diff origin / master」を実行するまででした。

だから、明確にするために:


"ブランチが先に進んでいます..." =>リモートマスターにプッシュする必要があります。「git diff origin / master」を実行して、ローカルリポジトリとリモートマスターリポジトリの違いを確認します。


これが他の初心者に役立つことを願っています。

(また、マスターが実際には「リモート」ではない可能性があること、「起源」が慣例で使用されている再構成可能な名前などであるなど、このソリューションを部分的に無効にする可能性のある構成の微妙な点があることも認識しています。そんなことは気にしないでください。シンプルでわかりやすい答えを求めています。差し迫った問題を解決したら、後で微妙な点について読むことができます。)

伯爵


2
@Earl git diff --cached origin/master次のプッシュの結果がどうなるかが記載されているので、ここでの説明は適切ではないでしょうか?上記の強調表示されたコマンドは、コミットされていない
ステージ

48
git fetch後にこのエラーが発生した場合は、実行する必要がある可能性もありますgit pull remote branch。参照が古くなっている可能性があります。git fetchそれを修正します。
ブライアンケネディ

そのorigin/master部分masteroriginリポジトリのブランチを意味しますか?
Rakib、2011年

1
この説明は不完全であることに注意してください。私は現在経験していますが # On branch master # Your branch is ahead of 'origin/master' by 3 commits. 、git diff origin / masterは何も表示しません(そして--cachedオプションはこれを変更しません)。そして、git fetchはこれを変更せず、git pullはこれを変更せず、git reset --hardはこれを変更しません。これを変更するには、次のものが必要です:git reset --hard origin / masterそして、他の人がこのリポジトリで私と一緒に作業していて、彼らのテストを無効にしたくなかったため、そしてこれらのコミットを見つけることができなかったため、私はそのルートを選択しましたあります。
rdm '17

1
origin / masterにプッシュするのではなく、プルする必要があるときにもこのメッセージが表示されます。たとえばgit checkout master、メッセージを受け取った場合、別のブランチからgit pull origin master。つまり、作業する前に私はすべきです。しかし、メッセージの言い回しが反対を示唆しているので、私はそれが非常に混乱していることに
気づき

38

私と同じような問題がありましたが、作業ディレクトリがありましたahead of origin by X commitsが、git pull結果はEverything up-to-dateでした。私はこのアドバイスに従ってそれをなんとか修正しました。同様の問題を抱えている他の誰かを助けるために、私はこれをここに投稿しています。

基本的な修正は次のとおりです。

$ git push {remote} {localbranch}:{remotebranch}

角かっこ内の単語をリモート名、ローカルブランチ名、リモートブランチ名に置き換える必要があります。例えば

$ git push origin master:master

1
ありがとう、それは私のためにそれをしました。git diff何も表示されませんでした。そして、あなたが説明したことを実行した後、私はもはやこの混乱する煩わしいメッセージを受け取りません。
LaundroMat

1
より多くの賛成票が必要です:)。投票数の多い回答はすべて「影響なし」でした(つまり、「git fetch」-何もしませんでした...「git remote show origin」を確認してください-何も不正確ではなく、何も変更する必要はありません)
Adam

24

ローカルキャッシュバージョンのオリジンマスター(origin / master)と実際のオリジンマスターには違いがある場合があります。

これを実行git remote updateすると、起点マスターがorigin / masterと再同期されます

この質問に対する承認済みの回答を見る

git pull origin masterとgit pull origin / masterの違い


10

私のラップトップが起源だと思いました…

これは無意味なものoriginです。デフォルトのリモートリポジトリを指します。これは、通常、他の人の変更をフェッチ/プルするものです。

どうやって:

  1. git remote -voriginが表示されます。origin/mastermasteroriginリポジトリのブランチの最後の既知の状態の「ブックマーク」であり、自分のmasterはの追跡ブランチですorigin/masterこれですべてです。

  2. あなたはしません。少なくとも、リポジトリがそれ自体のデフォルトのリモートリポジトリであることは意味がありません。

  3. そうではありません。これは、リモートリポジトリにないローカルでのコミットを行ったことを通知しているだけです(そのリポジトリの最後の既知の状態によると)。


1
私が最初にリポジトリを作成した場所(それが作成された場所)から、ラップトップが起源であると思いました。
ブライアンケリー

1
対照origin的に、オフラインであったり、ネットワークを切り替えたりすることは、ラップトップのようなポータブルデバイスでは非常に一般的なケースであるため、ローカルでラップトップをポイントすることは完全に理にかなっています。この方法git pushgit pullいつでも使用でき、現在適切なネットワークに接続しているかどうかを考える必要はありません。このローカルoriginは、現在のローミングステータスに応じて、ネットワークリンクが使用可能な場合に実際のリモートと自動的に同期できます。問題の部分は、どの同期をいつ実行するかであり、GITの部分は非常に簡単です。
ティノ

2
ポインティングorigin別のあなたのラップトップ上のリポジトリは必ず、完璧な理にかなっています。ポインティングoriginリポジトリのを自分自身ですることがない:それはあなたが実行するかどうかを全く違いはありませんでしょうgit pushか、git pullリポジトリが、とにかく自分自身と同期して、常に正確であることから、。それは間違いで、一種のトートロジーです。
アリストテレスPagaltzis

3

[ 解決 ]

$ git push origin

^これで解決しました。それは何をしたか、それは私のマスター(ラップトップ上で)をリモートサーバーにある「起源」と同期させました。


1

私はこの問題に取り組んでおり、以前のどの回答も私が見ているようにこの問題に取り組んでいません。私は問題をその基本に戻して、問題を明確にできるかどうかを確認しました。

新しいリポジトリ(rep1)を作成し、1つのファイルを入れてコミットします。

mkdir rep1
cd rep1
git init
echo "Line1" > README
git add README
git commit -m "Commit 1"

rep1のクローンを作成し、それをrep2と呼びます。私はrep2の中を見て、ファイルが正しいことを確認します。

cd ~
git clone ~/rep1 rep2
cat ~/rep2/README

rep1では、ファイルに1つの変更を加えてコミットします。次に、rep1で、rep2を指すリモートを作成し、変更をプッシュします。

cd ~/rep1
<change file and commit>
git remote add rep2 ~/rep2
git push rep2 master

ここで、rep2に移動して「git status」を実行すると、私はオリジンより先にいると言われます。

# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   README
#

rep2のREA​​DMEは、2番目のコミットの前の元の状態と同じです。私が行った唯一の変更はrep1に対するもので、私がやりたかったのはそれらをrep2にプッシュすることだけでした。把握していないのは何ですか?


1
2つのこと:rep2の「origin / master」チェックは、実際にはrep1を調べません。rep2で「git pull」を実行すると、それらが同じ状態にあり、文句を言うのをやめます。実際に作業コピーのプッシュからの変更を確認するには、「git checkout」を実行する必要があります。プッシュは、destリポジトリの作業コピーに触れないでください。
Walter Mundt、2010

私はそれがそのケースかもしれないと思ったが、「git checkout M READMEあなたのブランチは1回のコミットで 'origin / master'の前にある」と表示されます。しかし、私の作業コピーは実際には1コミット遅れており、先ではありません。
スティーブHindmarch 2010

1

あなたが「押す」のを待っています。試してください:

$ git push


1

最近この問題が発生しましたが、不要になったファイルをいくつか削除したためだと思いました。問題は、gitがファイルが削除されたことを認識せず、サーバーにまだ残っていることを確認することです。(サーバー=起点)

だから私は走った

git rm $(git ls-files --deleted)

そして、コミットとプッシュを実行しました。

それで問題は解決しました。


1
これは、コミットメッセージに「削除-<ファイル名>
looneydoodle」が

1

私もgit初心者です。「ブランチがオリジン/マスターよりNコミット先になっています」というメッセージで同じ問題が発生しました。提案された「git diff origin / master」を実行しても、私が保持する必要のないいくつかのdiffが表示されました。そう ...

私のgitクローンはホスティング用であり、マスターリポジトリの正確なコピーが必要で、ローカルの変更を保持する必要がないため、リポジトリ全体を保存して新しいリポジトリを作成することにしました。

(ホスティングマシン上)

mv myrepo myrepo
git clone USER@MASTER_HOST:/REPO_DIR myrepo

便宜上、私は自分のホスティングマシンのクローンに変更を加えていました。もういや。これらの変更をマスターに加え、そこでgit commitして、git pullを実行します。うまくいけば、これにより、ホストマシン上のgitクローンが完全に同期し続けるはずです。

/奈良


0

私は私のリポジトリについて同じことを考えていました。私の場合、私はもうプッシュしていなかった古いリモコンを持っていたので、それを取り除く必要がありました。

リモコンのリストを取得します。

git remote

不要なものは削除してください

git remote rm {insert remote to remove}

0

独自のコミットが行われる前に、特定のコミットにリセットすることができます。

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)

git logローカルの変更が行われる前のコミットを見つけるために使用します。

$ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...
commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

ローカルコミットを書き留め、直前のコミットに直接リセットします。

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

-1

「あなたのブランチはnnコミットで 'origin / master'よりも先になっています。」という問題がありました。私がリモートリポジトリにプッシュしたとき:

git push ssh://git@xxx.repositryhosting.com/yyy/zzz.git

私のリモートアドレスが.git / FETCH_HEADファイルにあり、使用されていることを見つけたとき:

git push

問題は消えた。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.