2012-01-20 28 views
7

masterブランチを最新の状態に保ちながらfeatureAブランチを作成しようとしています。ここでgit rebase master then originブランチをプッシュフォワードしないとエラーになります

はシナリオ一方

git clone ssh://xxx/repo 

git checkout -b featureA 

$ git add file.txt 

$ git commit -m 'adding file' 

$ git push origin featureA 

git checkout master 

git pull origin master 

git checkout featureA 

git rebase master 

git push origin feature A 
To ssh://xxx/repo 
! [rejected]  featureA -> featureA (non-fast-forward) 
error: failed to push some refs to 'ssh://xxx/repo' 
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. 

がどのように私はそれを受け入れるようにサーバーを強制することなくリベースでき原点マスターにプッシュカップルの新しいコミットをしているのですか?

+0

rebaseできません... rebaseは履歴を変更し、強制的にプッシュする必要があります – knittl

答えて

9

リベース後にプッシュすることはできません。コミットの履歴が異なるため、コミットに異なるSHA1が追加されるようになりました。更新されたrefに祖先の古いrefが含まれていない場合、それは潜在的に危険な操作であり、gitは許可しません。

あなたが強制したくない場合は、あなたの唯一の代替手段はマージすることです。

単独で作業していて、他の人がこのブランチにコミットする必要はありません。

+0

Thx @Adam!私の場合、私はmasterとの合併を続けて、私のfeatureAをmasterと最新の状態に保ち、次にリモートのfeatureAブランチに変更をプッシュして、私たちのサーバ上で安全に保ちますか?将来、ある時点でfeatureAをマスターにマージする準備ができたら、masterに切り替えてgit merge featureAを実行しますか? – ben39

+0

はい。 'git checkout master && git merge feature'を使って、あなたの機能をmasterにマージするだけです。毎日、あなたの周りの好きなだけ頻繁にマージしてください。 –

+0

私の日々のデベロッパーのために、masterとfeatureAをマージするときに、 'git checkout featureA && git merge master && git push origin featureA'をマスターに追いつけて、私はそれをコピーしますマスターはすでに持っています。この重複した問題は、ある日私がmasterをfeatureAとマージしたときに 'git checkout master && git merge featureA'のように表示されます。 – ben39

5

あなたの質問に対する簡単な答え:masterをfeatureAにリベースすることで(まだプッシュしないで)、そのポイントにfeatureAをリセットできます。

これは実際には、masterからfeatureAへのコミットを選んでいるが、欠点は、2つのブランチに重複したコミットで終わることである。それはあなたの直面する問題を解決します(それがあなたの意図ならば)。しかし長期的には、すでにリモートブランチにプッシュされているコミットをリベースするべきではありません。シナリオで最も良い解決策は、実際にマージすることです。

関連する問題