[解決済み] リベースの後、ブランチにプッシュできない
質問
gitを使用しており、masterブランチとdeveloperブランチがあります。新しい機能を追加して、コミットをmasterにリベースし、masterをCIサーバーにプッシュする必要があります。
問題は、リベース中に競合が発生した場合、リベースが完了した後、リモートブランチをプルするまで、(Github 上の)リモート開発者ブランチにプッシュできないことです。そのため、コミットが重複してしまいます。コンフリクトがない場合は、期待通りに動作します。
質問: リベースと競合の解決後、重複コミットを作成せずにローカルとリモートの開発者ブランチを同期させるにはどうすればよいでしょうか。
セットアップです。
// master branch is the main branch
git checkout master
git checkout -b myNewFeature
// I will work on this at work and at home
git push origin myNewFeature
// work work work on myNewFeature
// master branch has been updated and will conflict with myNewFeature
git pull --rebase origin master
// we have conflicts
// solve conflict
git rebase --continue
//repeat until rebase is complete
git push origin myNewFeature
//ERROR
error: failed to push some refs to '[email protected]:ariklevy/dropLocker.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
// do what git says and pull
git pull origin myNewFeature
git push origin myNewFeature
// Now I have duplicate commits on the remote branch myNewFeature
編集
ということは、ワークフローが壊れるような気がするのですが。
開発者1がmyNewFeatureで作業中 開発者2が hisNewFeature を開発中 どちらも master をメインブランチとして使用
開発者2は myNewFeature を hisNewFeature にマージしています。
開発者1がリベースし、衝突を解決した後、myNewFeatureをリモートブランチに強制プッシュします。
数日後、developer2 が myNewFeature を hisNewFeature に再びマージしました。
これによって他の開発者は開発者1を憎むようになるのでしょうか?
どのように解決するのですか?
まず、あなたと一緒に作業している人たちは、トピック/develブランチを共有開発用とするか、自分だけのものとするかを合意する必要があります。他の開発者は、いつでもリベースされるから私の開発ブランチでマージしないように知っています。通常、ワークフローは次のようになります。
o-----o-----o-----o-----o-----o master
\
o-----o-----o devel0
\
o-----o-----o devel1
それから、リモートの最新情報を得るために、次のようにします。
git fetch origin
git checkout master
git merge --ff origin/master
私がこれを行う理由は2つあります。まず、develブランチから切り替えることなく、リモートでの変更を確認することができるからです。もうひとつは、まだ保存されていない、あるいはコミットされていない変更を上書きしてしまわないようにするための安全機構です。また、master ブランチに fast-forward でマージできない場合、誰かがリモート master をリベースしたか (これには厳しい非難が必要です)、私が誤って master にコミットしてしまい、自分側をクリーンアップする必要があることを意味します。
そして、リモートに変更があり、私が最新に早送りしたときにリベースします。
git checkout devel0
git rebase master
git push -f origin devel0
他の開発者は、彼らのdevelブランチを私の最新版からリベースする必要があることを知ることができます。
git fetch <remote>
git checkout devel1
git rebase <remote>/devel0
この結果、履歴がよりきれいになります。
o-----o master
\
o-----o-----o devel0
\
o-----o-----o devel1
ドンマイ は気まぐれにコミットを前後にマージします。重複したコミットを作成し、履歴を追うことができなくなるだけでなく、特定の変更からの回帰を見つけることはほぼ不可能になります (そもそもバージョン管理を使用しているのはそのためですよね?)。あなたが抱えている問題は、まさにこれを行った結果なのです。
また、他の開発者があなたのdevelブランチにコミットしている可能性があるようです。これを確認できますか?
マージするのは、あなたのトピックブランチが
master
.
余談ですが 複数の開発者が同じリポジトリにコミットしている場合、開発者のdevelブランチを区別するために名前付きブランチを持つことを全員で検討すべきです。たとえば
git branch 'my-name/devel-branch'
つまり、すべての開発者のトピックブランチは、自分自身のネストされたセットの中に存在するのです。
関連
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] 新しいローカルブランチをリモートの Git リポジトリにプッシュし、それを追跡するにはどうすればよいのでしょうか?
-
[解決済み] Git でブランチからコミットを削除する
-
[解決済み] git rebase の取り消し
-
[解決済み] Git のリモートブランチを作成する方法を教えてください。
-
[解決済み] Gitブランチをmasterにマージする最も良い(そして最も安全な)方法は何ですか?
-
[解決済み] リモートにないトラッキングブランチを削除
-
[解決済み】Featureブランチのリベースの後、Gitプッシュが拒否される。
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git, fatal: リモートエンドが予期せずハングアップしました。
-
[解決済み】マージ後のコミットでGitエラー - fatal: マージ中に部分コミットができない
-
[解決済み】fatal: 有効なオブジェクト名ではない: 'master'
-
[解決済み】マージの競合が発生した git stash pop の取り消し
-
[解決済み] [email protected] へのいくつかの参考文献のプッシュに失敗しました。
-
[解決済み】Githubエンタープライズ - リモート。Git の操作でパスワード認証が利用できない
-
[解決済み] [Solved] originにプッシュしようとすると、Gitが「No such remote 'origin'」と言うのはなぜですか?
-
[解決済み] TortoiseGitで「git did not exit cleanly (exit code 128)」というエラーを解決するには?[クローズド]
-
[解決済み] git commit signing failed: secret key not available.
-
[解決済み】Featureブランチのリベースの後、Gitプッシュが拒否される。