github.com でフォークしたプロジェクトに加えて、ローカル Git リポジトリのコミットを再再生するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1457248

  •  12-09-2019
  •  | 
  •  

質問

はい、最初からプロジェクトをフォークすべきだったのはわかっていますが、これが私が今いる状況です。:)

私のローカル コンピューター上には、ブログを含むローカル Git リポジトリがあり、数か月分のコミット履歴があります。もともと、リポジトリからファイルをダウンロードしただけですhttp://github.com/mojombo/mojombo.github.com, で、ローカル Git リポジトリを続けました。最初のコミットは、mojombo のリポジトリからの最新ファイルのように見えました。

ここでプロジェクトをフォークして、ローカル Git リポジトリのコミットをその上で再生したいと考えています。そのため、最初からプロジェクトをフォークしてから、GitHub 上のフォークされたバージョンの mojombo のリポジトリにプッシュバックしたように見えます。アカウント:

http://github.com/program247365/mojombo.github.com

したがって、おそらく履歴は次のようになります。

mobjombo repository:         1---2---3----23
                                  \
my blog repository commits:       24---25---

これを行うために具体的にどの Git コマンドを使用できますか?

見てきました この質問. 。Mojombo のリポジトリをリモートとしてプロジェクトに追加し、それをプルしてマージし、競合を解決してから、GitHub 上のフォークされたプロジェクトにプッシュする必要がありますか?

役に立ちましたか?

解決 2

私はgit pullを試してみました

と、それは私に次のエラーを与えます:

$ git pull grid master:master
! [rejected]        master     -> master  (non fast forward)

私の特定のケースでは、ここの手順で示したように、私のために進むべき道git rebaseだったようです

#Clone my forked project from github
git clone git@github.com:program247365/mojombo.github.com.git 

#Add my repo as a remote repo, with the alias 'grid'
git remote add grid "path/to/remote/gitrep/with/all/history/unrelated/to/mojombo/" 

#Rebase my commits on top of mojombo's
git rebase master grid/master

#Switch to the local master branch 
git checkout master

#Call up my mergetool via git, to start rectifying the conflicts that emerge between my repo, and mojombo's
git mergetool

#Push my rebased/combined repo back to Github.com
git push github

他のヒント

要するに:

1 つの解決策は、 移植片 履歴を接続するには、次を使用します git filter-branch それらのグラフトに従って履歴を書き換えてから、オプションで マージ.

元のリポジトリ ( リベース ソリューション) も別の実行可能なソリューションです。


長いバージョン:

スナップショットをダウンロードしてローカル開発を開始したリポジトリのリビジョンを覚えているか、ソースを調べたり git コマンドを使用して見つけたりできると仮定します。このリビジョンを START または A と呼びます。

ローカルの切断された履歴が元のリポジトリのクローンにあると仮定します。これは、ローカルの非接続開発がプロジェクトの完全な履歴と同じリポジトリにあることを意味します。ローカル ブランチがブランチ「マスター」にあると仮定します (簡単にするために、ブランチは 1 つだけであるとします)。

ローカルの切断された作業でプロジェクトをリポジトリにフェッチしなかった場合は、次のようにしてこれを行うことができます。

$ git remote add origin git://github.com/mojombo/mojombo.github.com.git
$ git fetch origin

履歴は次のようになります。

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)

                                     x---y---*---*---*      <--- master (your local disconnected history)

上の図の A という名前のコミットは、スナップショットとしてダウンロードしてローカル開発を開始した START コミットです。

次の 2 つの可能性があります。「A」のスナップショットを初期コミット「x」としてコミットしたか、最初に行ったコミットにローカルの変更が加えられています。

最初のケース (元の開始状態をコミットした場合、例:「初期コミット」または「インポート」として)、接続された履歴は次のようになります。

*---*---*---*---*---A---*---*---*---*      <--- origin/master (remote-tracking branch)
                                      \
                                        \-y---*---*---*       <--- master (your local disconnected history)

つまり最初の元のコミット「y」は「A」を親とします。

2 番目のケース (変更をコミットした場合) では、接続された履歴を次のように表示する必要があります。

*---*---*---*---*---A---*---*---*---*           <--- origin/master (remote-tracking branch)
                                      \
                                        \-x---y---*---*---*      <--- master (your local disconnected history)

つまり最初のコミット「x」に「A」を親として持たせたいとします。

どちらの場合も、コミット 'A' の完全な SHA-1 識別子と、コミット 'x' および 'y' の完全な SHA-1 識別子を検索する必要があります。

コミット 'A' の SHA-1 は次のようにして見つけることができます (まだ知らないと仮定します)。 git rev-parse:

$ git rev-parse A     # or A^{commit}
437b1b20df4b356c9342dac8d38849f24ef44f27

(見つかったことを確認するには、「^{commit}」サフィックスが必要になる場合があります) 専念 SHA-1。これは、たとえば「A」をタグで知っている場合に重要です。'v0.99';あなたの場合、問題のリポジトリはタグを使用していないため、これは必要ありません)。

次を使用して、コミット「x」と「y」の SHA-1 を見つけることができます。 git rev-list (開発がブランチ「マスター」で行われたと仮定します):

$ git rev-list --topo-order master | tail -2
8bc9a0c769ac1df7820f2dbf8f7b7d64835e3c68
e83c5163316f89bfbde7d9ab23ca2e25604af290

(「」| tail -2" は、生成されたリストで最後の 2 つのコミットを検索するためにここにあります。お持ちでない場合は使用する必要はありません)。

注記: 上記のすべての例では、完全な SHA-1 は次のとおりです。 , 、そのままでは使用しないでください。

'A' (または 'START') を親として持つコミットに FIRST という名前を付けましょう (上で述べたように、ケースに応じて 'x' または 'y' になります)。今私たちが使っているのは グラフトのメカニズム 歴史を結び付けるには:

$ echo "<SHA-1 of FIRST> <SHA-1 of START>" > .git/info/grafts

次に、gitk、QGit、MacOS X 上では GitX などのグラフィカル履歴ブラウザを使用して、履歴が正しく接続 (結合) されているかどうかを確認する必要があります。git log --graph"、 または "git show-branch"、例:

$ gitk master origin/master    # or --all

(ここでの gitk は単なる例です。「」を使用する場合git show branch「いつでも使えるわけではない」--all' オプション)。

最後に、これらの変更を永続的にしたいと思うでしょう。そのため、リポジトリから取得する人は誰でも履歴を接続することになります。これを行うには、次のようにします。 git フィルターブランチ:

$ git filter-branch master

元の (切断された) 履歴は「refs/original/master」にあります。

これで、グラフト ファイルを削除できます。

$ rm .git/info/grafts

これで、元のリポジトリの新しい開発にマージできるようになります。

$ git merge origin/master

ブランチ「マスター」でorigin(al)リポジトリの変更をプル(マージ)するときに単純に「git pull」を実行するだけで十分になるようにブランチごとの構成を設定することは、読者のための演習として残されています...:-)


注記:リベースソリューション 結果は次のような履歴になります (最初のコミットが単純なインポートであったと仮定します)。

*---*---*---*---*---A---*---*---*---*                                      <--- origin/master (remote-tracking branch)
                                                                     \
                                                                       \-y'---*'---*'---*'      <--- master (your local disconnected history)

(どこ y' コミットすることを意味します y 変更されました:ほぼ同じ変更セットであるはずですが、コミットとしては異なります)。

ここで何ができるかを考えてみましょう。それはあなたの質問の一番下にまとめたアイデアとは少し逆です。

  1. GitHub の mojombo のリポジトリをフォークします。
  2. フォークされたコピーのクローンを作成します。
  3. 既存の (元の) リポジトリからの変更をマージします。
  4. 元のリポジトリを削除します (必要に応じて、実際にはもう必要ありません)。

したがって、基本的には、GitHub でフォークした後、次の一連のコマンドを使用できます。

$ git clone git://github.com/$YOUR_USERNAME/$YOUR_PROJECT.git  # Clone your GitHub fork (#2 from above)
$ git pull /path/to/your/original/repo master:master           # Clone your original repo's master branch into your new repo (cloned from GitHub)
$ rm -rf /path/to/your/original/repo                           # Might as well delete the original -- you don't need it anymore, since all your history is in your new repo

要約すると、このメソッドは古いリポジトリで行ったすべての変更をマージし (したがって開発履歴を保存します)、同時に mojombo の履歴も取得します。 そして これにより、mojombo の変更を常に把握したり、必要に応じて変更を彼のリポジトリに簡単にコントリビュートしたりすることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top