2012-02-25 13 views
2

GIT支店作業の流れ

// create branch 
git checkout -b mybranch 
(do work) 
// commit to branch locally 
git commit -a 
// push to remote 
git push origin mybranch 
(repeat) 

私たちのブランチで作業を完了したら、我々はマスターにブランチをマージ:

// go to master 
git checkout master  
// update 
git pull master 
// merge our branch into master 
git merge mybranch 
(solve conflicts) 
git push 

今、私たちはただ上記の手順を繰り返して、作業の流れは数日間はうまくいった。今や誰もが突然、他のグループメンバーのブランチとマスターで非フォワードアップデートを取得しています。例えば、誰かがマスターの中で引っ張られてからマージされても、押し込めません。それは非早送りプッシュと言います。これはマスターが完全に最新であると言うと非常に奇妙です。

次はgitのプル直後で、Gitのマージmybranch、Gitのプッシュ:

! [rejected]  master -> master (non-fast-forward) 
    error: failed to push some refs to '[email protected]:foo/project.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のプルは、私たちが最新であると言います。

GIT内の大きなグループで期待されるワークフローは何ですか?どのように分岐機構を扱うべきですか?

ありがとうございます!

答えて

3

以前のワークフローに問題はありませんでした。

新しい変更を引き込み、ブランチをマージして、マージした結果をプッシュアウトします。あなたの選択により、公開されなかった変更については、mergeの代わりにrebaseを使用することができます。

ここでの問題は、誰かが自分のローカルコピーで履歴を書き換えた可能性が高いことです。そのようなことが起きると、作業コピーがリモートエンドと同じように "最新の状態"になりますが、プッシュすることはできません。

新しいリポジトリのクローンを作成し、そこからmergepushを実行すると、おそらく成功するでしょう。

+0

git checkout masterを使用できるときに再クローン化する理由git reset --hard origin/master? – chazomaticus

+0

@chazomaticus自分のローカルリポジトリに何が行われたのか分かりません。私たちが知っている限り、「起源」は2つの異なることを意味しています。新鮮なスタートは清潔で曖昧ではありません。 – Borealid

+1

Borealidはおそらく、例えばrebaseのために歴史が書き直されているのは正しいでしょう。 myブランチを他の人と共有しなければならないかぎり、起源が多くの不必要な「mybranch」でスパムされるため、地元のローカルブランチを維持して起点にしないことを追加するだけです。 – ralphtheninja