web-dev-qa-db-ja.com

Git-プッシュされたコミットを別のブランチに移動する

私の上司は、既存のアプリケーションを変更して新しい機能を追加する際に、「容量を増やすために」アウトソーシンググループを試すことを最近決定しました。彼が選んだグループはうまくコミュニケーションが取れていないようで、真に理解して効果的になるために十分な質問をしていなかったという私の懸念にもかかわらず、私たちはとにかく彼らと一緒に行きました。

私たちは、Gitリポジトリ(GitHubでホスト)で共同作業するように設定しました。私たちは彼らのためにブランチを作成し(TheOutsourcedBranch、これを呼び出します)、このブランチ内ですべての作業を行うように依頼しました。

さらに、1日の終わりにコミットをプッシュして、作業速度と(さらに重要なことに)コードがどれほど優れているかを適切に把握できるように依頼しました。

今日、彼らは初めて押しました。 5つのコミット、すべてマスターで。私は、コミットをマスターからTheOutsourcedBranchに移動する方法を理解しようとしていますが、実行した作業を失うことはありません(見た目からは、とにかくそれを捨てる必要があります)。

Visual Reference -- Orange dots are their commits, gray are mine.

オレンジ色のドットはコミット、灰色のドットは私のコミットです。

私はリベースについて無数の質問があることを知っています(そしてそれが私がここで行う必要があるかもしれないことです)が、私の特定のケースに当てはまるものを見つけるのに苦労しています。そして、問題が発生した場合、アウトソーシンググループと私だけが、現在リポジトリを実際に使用している唯一の人々です。

前もって感謝します!


編集:探しているものが見つかった可能性があります: 最新のコミットをGitを使用して新しいブランチに移動します

私の理解を確認したいのですが。ローカルでは、マスター(TheOutsourcedBranch)からブランチを作成します。ブランチには、A〜Hのすべてが含まれます。次に、マスターをCにリセットします。マスターにはA-Cが含まれます。

それが正しいと仮定すると、それは私にとって(ローカルで)問題ありません。しかし、リモートリポジトリ(GitHub)を「強制」して、物事がどのように実行され、そのバージョンの履歴が破棄されるかについてのローカルビューを受け入れるには、何をする必要がありますか?

これがうまくいったら、私はこの質問を再加工してより一般的で有益なものにし、いくつかの綿毛を切り取ることができると思います-そうでなければ、それはおそらく削除の良い候補だと思います。

41
Anthony Compton

ブランチを取得するのは簡単です:

git branch their-branch master
git reset --hard master $SHA1_OF_C
git Push --force $SHARED_REPO_REMOTE

これは履歴を書き換えます。 their-branchという名前の現在のマスターブランチと同等の新しいブランチを作成し、ローカルマスターをリセットしてランダムなSHA1(...またはブランチ、タグなど)を指すようにし、最後に強制的に更新しますローカルブランチに一致するリモートリポジトリブランチ。

正確に必要な状況を提供します。

注意:これは履歴を書き換え、古いマスターを構築した人をだまします。以下のマージの問題に注意してください。

リベースは不要または必要ありません。

(余談ですが、ステージングリポジトリを提供するか、git send-emailを使用するか、GitHubのプルリクエストを使用するか、適切な方法でマスターにプッシュされるのを防ぐことをお勧めします。これは、要約、少し時間がかかるかもしれません。)

51
Daniel Pittman