クリーンなプルリクエストを実行できるように、Githubフォークをクリーンアップするにはどうすればよいですか?


83

Githubでリポジトリをフォークしました。いくつかの小さな変更を加えてアップストリームにプルリクエストを送信しましたが、途中でフォークが非常に壊れてしまい、クリーンなプルリクエストを生成できなくなりました。6つの変更を加えてブランチからプルリクエストを開始すると、Githubは13を送信したいと考えており、そのうちの7つはすでにアップストリーム(ナッチ)に存在しています。

私の問題は、最新のコミットのみをプルすることに関連しているようですが、新しいブランチを作成して、チェリーピックコミットを作成しても、まだ余分なものがあります。私はとfutzedましリベースだけでなく、今でも、のように見える私の主人はそう台無しにされて、私はのクリーンコピーを生成することができない上流を。これは明らかに、マージする代わりリベースする必要があることを理解していなかったためです。そのため、明らかに間違いを犯しました。私がやろうとしているのは、その結び目を解き放ち、便利に前進できるきれいな状態に戻る方法を見つけることです。

フォークを吹き飛ばして上流のフォークを作りたいのですが、それも難しいと思います。

Gitの罪を告白した後、githubの赦免を取得するにはどうすればよいですか?


1
あなたの告白と免除の要求が大好きです:
Jon Kern

何、gitが宗教ではない人がいますか?;-)
pjmorse 2015

回答:


102

ステップ1:アップストリームの変更をプル
するFork a Repoページで説明されているように、アップストリームリポジトリを「アップストリーム」として追加することをお勧めします。

git pull --rebase upstream master

この--rebaseオプションは、マージせずに最新のコミットの上に変更を配置します。

ステップ2 :(オプション)コミットを1つのコミットにマージします

git reset --soft upstream/master

このコマンドはすべてのコミットを「元に戻します」が、ファイルは変更しません。したがって、1回のコミットですべての変更をコミットできます。

git commit -a

ステップ3:変更を確認してテストする

変更を表示するにはgitk組み込みSourcetreeTortoiseGitTower (有料)などのGUIを使用します。

ステップ4:プッシュ

git pushプッシュするとターゲットリポジトリの履歴が変更されるため、エラーがスローされます。
手順3に示した変更が正しいと確信できる場合は、「-f」を押してください。

git push -f origin master


追加情報
リモートを追加するコマンドは次のとおりです。

git remote add upstream git://github.com/[username]/[project].git

直接URLから取得することもできます。

git pull --rebase  git://github.com/[username]/[project].git

ただし、他の手順では、「アップストリーム/マスター」ではなく、最新のアップストリームコミットのハッシュが必要になります。


3
どうもありがとうございました。GitHubはフォークAリポジトリを更新する必要があります。
buschtoens 2012

ありがとう!私はこの問題を解決するために多くの方法を試しましたが、何もうまくいきませんでした。この答えを見つける前に私のフォークを吹き飛ばす準備ができていました...そしてそれはうまくいきました。ありがとう!
ユダガブリエルヒマンゴ2014年

こんにちは、@ JudahHimango。「ステップ2」も実行しましたか。私はあなたと同じ状況にいるからです。手伝って頂けますか。
arunit21 2014

これは素晴らしいリソースです。ありがとう!
Dr. Jan-Philip Gehrcke 2015

フォークされたリポジトリはアップストリームと同期していないと言い続けたので、プルダウンしてマージしました。これにより、フォークでのコミットは不要になりました。このアプローチを使用してプッシュを強制すると、これが分類されます。また、リベースを使用して、以前のコミットのいくつかを組み合わせました。gitrebase -i HEAD〜n [ここで、nはコミットの数です]
コーダー2017年

4

私が理解しているように、GitとMercurialの両方で(私は後者しか使用していないので、間違っているかもしれません)、フォークを吹き飛ばして再フォークすることはまったく大したことではありません。私は自分のプロジェクトでいつもそうしています。それで問題がない場合(変更をバックアップできる場合、またはフォークに大きな変更がない場合)、おそらくそれが最善の方法だと思います。

DVCSでは、リポジトリをフォークすると、そのリポジトリ全体の完全なクローンが作成されることを忘れないでください。現在のフォークを削除してから元のリポジトリを再度フォークすると、完全にクリーンな状態で作業できるようになります。


この場合のフォークは、コアgit機能を使用しますが、コアgitではなくgithubの特別な機能です。github-forksで実行できる特別なgithub管理機能があります。
セスロバートソン

1
ああ、分かった。私は主にBitBucketを使用していますが、個人の作業用コピーを操作する場合、「フォーク」は「クローン」と同義です。念のため、とにかくここに答えを残しておきます。
ショーンエドワーズ

ええ、ローカルクローンを削除して、すでに数回再クローンしました。別のリポジトリで実験を行いましたが、フォークを削除して同じソースから新しいフォークを作成しても問題はないようです。
pjmorse 2011年

注意:git format-patch最初に保存したいコミットを保持するために使用しています。
pjmorse 2011年

1
フォークされたリポジトリを削除して再フォークする必要はありませgit format-patchん。作業を保存するために使用することは、gitがブランチを管理するために持っているすべての便利なツールを回避するようなものです。将来的にgit rebase -iは、新しいアップストリームmasterブランチの上部でコミットを選択的に書き換えるために使用することは正しいことです。
マークロングエア

0

プライベートリポジトリで、フォークのリポジトリをリモートとして追加します。リモートのブランチからブランチをリベース/リセットします。githubリポジトリに強制的にプッシュします。

正確なコマンドが必要な場合は、お知らせください。また、ローカルコミットを保持するかどうか、または「吹き飛ばす」ことが問題ないかどうかもお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.