14

サーバー上にGitリポジトリがあり、同僚と私は両方ともプッシュおよびプルします。コミットする前にプルする限り、正常に動作します。

ただし、彼がマスターブランチにプッシュし、その間にローカルコミットを行った場合、プルしようとすると次のようになります。

! [rejected]        master    -> master  (non-fast-forward)

しかし、私は衝突があってはならないことを知っています。

私がそれを回避する方法は、新しい一時的なブランチにプルし、それを次のようにマスターにマージすることです。

% git pull origin master:temp
From ssh://example.com/home/my/remote/repo
 * [new branch]      master    -> temp
Already up-to-date.
% git merge temp
Already up-to-date.
% git push origin master:master

Gitは私が何もしていないように動作しますが、実際にはGitを振って提出していることに注意してください。

最近、Gitを「納得」させるのではなく、引っ張っても大丈夫だと気づきました。まだコミットしていないふりをしてgit reset --soft HEAD^git stashその上でプルアンドコミットを実行できます。

この奇妙な厄介な行動の原因は何でしょうか?

この問題をすべてローカルマシンで再現することができました。これが私がしたことです:

まず、最初の「ローカル」リポジトリを作成し、ファイルを追加しました。

% cd
% mkdir local-1
% cd local-1/
% mkdir website
% cd website/
% git init
Initialized empty Git repository in /Users/jason/local-1/website/.git/
% touch file
% git add .
% git commit -m 'added file'
[master (root-commit) 6d4b322] added file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file

次に、「リモート」リポジトリを作成しました。

% cd
% mkdir remote
% cd remote
% mkdir website.git
% cd website.git/
% git init --bare
Initialized empty Git repository in /Users/jason/remote/website.git/

次に、ローカルに戻り、参照を作成してリモートにプッシュしました。

% cd ~/local-1/website/
% git remote add web ~/remote/website.git
% git push web +master:refs/heads/master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
To /Users/jason/remote/website.git
 * [new branch]      master -> master

その後、リモートを2番目のローカルに複製しました。

% cd
% mkdir local-2
% cd local-2
% git clone ~/remote/website.git
Cloning into website...
done.

次に、2番目のローカルからリモートへの参照を作成してプッシュしました(これが私が考える問題を作成している場所です)。

% cd website/
% git remote add web ~/remote/website.git
% git push web +master:refs/heads/master
Everything up-to-date

次に、local-2に変更を加え、コミットしてプッシュしました。

% touch another
% git add .
% git commit -m 'added another'
[master be91180] added another
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 another
% git push web
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 238 bytes, done.
Total 2 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (2/2), done.
To /Users/jason/remote/website.git
   6d4b322..be91180  master -> master

最後に、local-1に別の変更を加え、コミットして、プッシュしようとしました。

% cd ~/local-1/website/
% touch something
% git add .
% git commit -m 'added something'
[master 3984529] added something
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 something
% git push web
To /Users/jason/remote/website.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '/Users/jason/remote/website.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

ブラスト!プルはどうですか?

% git pull web master:master
From /Users/jason/remote/website
 ! [rejected]        master     -> master  (non-fast-forward)

OK、問題があります。どうすれば修正できますか?

4

1 に答える 1

23

あなたはおそらくするつもりでした:

git pull web master

を使用すると、プルのフェッチステージでmaster:masterローカルブランチを直接更新しようとしmasterます。これにより、非早送りエラーが発生します。

追跡するように設定されているブランチを使用している場合は、web/master必要なだけでgit pull web、リモート追跡ブランチも更新されます。

于 2012-04-18T06:05:49.907 に答える