私は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)
そして、その理由について私は混乱しています。私のラップトップはOriginだと思っていました...しかし、私が最初にSubversionからプッシュしたか、Push to Unfuddleにプッシュしたかが、メッセージが表示される原因かどうかわかりません。どうやって:
私のMacはGitバージョン1.6.0.1を実行しています。
Dbrで提案されているようにgit remote show Origin
を実行すると、次の結果が得られます。
~/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
Aristotle Pagaltzisの提案に従ってgit remote -v
を実行すると、次のメッセージが表示されます。
~/Projects/GeekFor/geekfor 10:33 AM $ git remote -v
Origin /Users/brian/Projects/GeekFor/gf/.git
unfuddle [email protected]:spilth/geekfor.git
興味深いことに、私はgeekfor
ディレクトリでプロジェクトに取り組んでいますが、私のOriginはgf
ディレクトリにあるローカルマシンであると言っています。 gf
は、プロジェクトをSubversionからGitに変換するときに使用した一時ディレクトリであり、おそらく混乱を避けるためにプッシュした場所だと思います。それから、unfuddleからgeekfor
ディレクトリに新しいコピーをチェックアウトしたと思います。
だから、私はdbrのアドバイスに従って、行う必要があるように見えます:
git remote rm Origin
git remote add Origin [email protected]:spilth/geekfor.git
1.
Gitが「Origin/master」が使用していると考える場所を見つけるgit-remote
git remote show Origin
..これは次のようなものを返します。
* remote Origin
URL: [email protected]:~/something.git
Remote branch merged with 'git pull' while on branch master
master
Tracked remote branch
master
リモートは基本的にリモートリポジトリへのリンクです。すると….
git remote add unfuddle [email protected]/myrepo.git
git Push unfuddle
..gitは、追加したアドレスに変更をプッシュします。リモートリポジトリ用のブックマークのようなものです。
git status
を実行すると、リモートに(ローカルリポジトリと比較して)コミットが欠落しているかどうか、もしそうであれば、コミットの数だけチェックされます。すべての変更を「Origin」にプッシュすると、両方が同期されるため、そのメッセージは表示されません。
2.
それが他の場所にある場合、ラップトップを「Origin/master」にするにはどうすればよいですか?
これを行う意味はありません。 「Origin」の名前が「laptop」に変更されたとします。ラップトップからgit Push laptop
を実行することは決してありません。
Originのリモートを削除したい場合は、削除してください。
git remote rm Origin
これは何も削除しません(file-content/revisions-historyに関して)。これにより、リポジトリがリモートと比較されなくなるため(「なくなったために!」というメッセージが表示されます)。
覚えておくべきことの1つは、Origin
について特別なものは何もないということです。これは、gitが使用するデフォルトの名前です。
Gitは、git Push
やgit pull
のようなことをするとき、デフォルトでOrigin
を使用します。したがって、よく使用するリモート(あなたの場合はUnfuddle)がある場合は、「Origin」としてunfuddleを追加することをお勧めします。
git remote rm Origin
git remote add Origin [email protected]:subdomain/abbreviation.git
または、set-urlを使用して1つのコマンドで上記を実行します。
git remote set-url Origin [email protected]:subdomain/abbreviation.git
その後、git Push
の代わりに、単にgit pull
またはgit Push unfuddle master
を実行して更新できます
Gitの一般的なスキームで、「あなたのブランチは先に進んでいます...」というメッセージが何を意味するかについての説明を探してこの質問に来ました。ここには答えはありませんでしたが、「あなたのブランチは「Origin/master」よりも先です」というフレーズを検索すると、この質問が現在Googleの上部に表示されているため、メッセージの意味を理解しました、ここに情報を投稿すると思いました。
ですから、Gitの初心者であるため、私が必要とする答えは明らかに初心者の答えだったことがわかります。具体的には、「あなたのブランチは先に進んでいます...」というフレーズは、ローカルリポジトリに追加してコミットしたが、Originにプッシュしたことがないファイルがあることを意味します。このメッセージの意図は、少なくとも私にとっては「git diff」が違いを示さなかったという事実によってさらに難読化されています。 「git diff Origin/master」を実行するまで、ローカルリポジトリとリモートマスターの間に違いがあると言われました。
したがって、明確にするために:
"あなたのブランチは先に..." =>リモートマスターにプッシュする必要があります。 "git diff Origin/master"を実行して、ローカルリポジトリとリモートマスターリポジトリの違いを確認します。
これが他の初心者にも役立つことを願っています。
(また、マスターが実際には「リモート」ではない、「Origin」は慣習で使用される再構成可能な名前であるなど、このソリューションを部分的に無効にする可能性のある設定の微妙な点があることを認識しています。その種のことは気にしないでください。私たちは単純でわかりやすい答えが欲しいです。差し迫った問題を解決したら、後で微妙な点について読むことができます。)
伯爵
私の作業ディレクトリがahead of Origin by X commits
であったのに似た問題がありましたが、git pull
がEverything up-to-date
になりました。 このアドバイス に従って修正することができました。同様の問題を抱えている他の人に役立つ場合に備えて、ここに投稿しています。
基本的な修正は次のとおりです。
$ git Push {remote} {localbranch}:{remotebranch}
括弧内の単語は、リモート名、ローカルブランチ名、リモートブランチ名に置き換える必要があります。例えば.
$ git Push Origin master:master
originマスターのローカルキャッシュバージョン(Origin/master)と真のOriginマスターとの間に違いがある場合があります。
git remote update
を実行すると、OriginマスターとOrigin/masterが再同期されます
この質問に対する受け入れられた答えを参照してください
私のラップトップが起源だと思った…
それは一種の無意味です:Origin
は、デフォルトのリモートリポジトリを指します。これは通常、他の人の変更を取得/プルするリポジトリです。
どうやって:
git remote -v
はOrigin
が何であるかを示します。 Origin/master
は、master
リポジトリのOrigin
ブランチの最後の既知の状態の「ブックマーク」であり、独自のmaster
は、Origin/master
の トラッキングブランチ です。 これがすべてあるべきです 。
しません少なくとも、リポジトリがそれ自体のデフォルトのリモートリポジトリであることは意味がありません。
そうではありません。リモートリポジトリにない(そのリポジトリの最後の既知の状態に応じて)ローカルでかなりの数のコミットを行ったことを伝えるだけです。
[ソリューション]
$ git Push Origin
^これで解決しました。それがしたことは、(ラップトップ上の)マスターをリモートサーバー上の「Origin」と同期させたことです。
私はこの問題に苦労しており、これまでの回答のどれも私が見ているように質問に取り組んでいない。問題を明確にして問題を解決できるかどうかを確認するために、問題を基本に戻しました。
新しいリポジトリ(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」を実行すると、Originよりも先にいるというメッセージが表示されます。
# 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のREADMEは、2回目のコミット前の元の状態です。私が行った唯一の変更はrep1に対するもので、私がしたかったのはrep2にプッシュすることだけでした。私が把握していないものは何ですか?
あなたが「プッシュ」するのを待っています。試してください:
$ git Push
私もgit初心者です。 「あなたのブランチはOrigin/master by N commitsより先です」というメッセージで同じ問題がありました。提案された「git diff Origin/master」を実行すると、いくつかの差分が表示されましたが、私はそれを維持することを気にしませんでした。そう ...
私のgitクローンはホスティング用であり、マスターリポジトリの正確なコピーが必要であり、ローカルの変更を保持する必要がないため、リポジトリ全体を保存して新しいリポジトリを作成することにしました。
(ホスティングマシン上)
mv myrepo myrepo
git clone USER@MASTER_Host:/REPO_DIR myrepo
便宜上、ホスティングマシンのクローンに変更を加えていました。もういや。マスターにこれらの変更を加え、そこにgit commitして、git pullを実行します。うまくいけば、これによりホスティングマシン上のgitクローンが完全に同期されたままになります。
/奈良
最近この問題が発生しましたが、不要になったファイルをいくつか削除したためだと考えました。問題は、gitがファイルが削除されたことを認識せず、サーバーがまだ持っていることを認識していることです。 (サーバー=オリジン)
だから私は走った
git rm $(git ls-files --deleted)
そして、コミットとプッシュを実行しました。
これで問題は解決しました。
独自のコミットが実行される前に、特定のコミットにリセットすることが可能です。
$ 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
リポジトリについても同じことを考えていました。私の場合、私はもうプッシュしていない古いリモコンを持っていたので、それを削除する必要がありました。
リモートのリストを取得します。
git remote
不要なものを削除する
git remote rm {insert remote to remove}