2012-11-29 19 views
5

私はgitを使い慣れていません。私がやったことは、私が関心を持っているいくつかのリポジトリをフォークし、それを自分のコンピュータ上でクローンしてそれらと一緒に作業することです。リモートgitリポジトリからの変更を引き出す

私のローカルコピーを混乱させるために、元のプロジェクトの一部が大幅に更新される場合があります。または、私は若干の変更を加えることがあります。

私が理解していることから、私は自分のクローンを元に戻して "元に戻す"ことができます。

これは私の変更にどうしますか?たとえば、元のファイルDoSomething.cppがあるとします。私はそれを修正し、小さなバグを修正したり、機能を追加することができます。今すぐ! 1年後、元のプロジェクトは多くの改訂を経て、はるかに優れています。私はそれらの変更を私のクローンに "プル"したいが、私の変更も維持する! (これは一種のプッシュの逆です)

これは簡単ですか?もしそうなら、基本的なアイデアは何ですか?

元のクローン(変更したもの)からのクローンの変更は上書きされませんが、私は実際に自分の変更と元の(フォーク上の)マージを行い、実際に変更を確認して受け入れることができます。 (例えば、DoSomething.cppがオリジナルで変更された場合、互換性があるかどうかを比較する必要があります)

私はフォークの所有者であるため、これは難しいことではありません。その後、私のフォークに私の地元の変更をプッシュ?(問題をバージョン管理のための巨大な可能性があるので、それはかかわらず動作するかどうかわからない)

+0

'git pull --rebase'は変更をヒューリスティックにマージしようとします。それができなければ、それは失敗し、合併をしなければならないとあなたに伝えます。 –

+0

@larsmans:だから、私は、rebase、警告、私に問題を見せてくれるかもしれないツールを必要としていると思います。つまり、すべてまたは何もプロセスをリベースしていますか? – jsmdnq

+1

Gitが既に行っていることはまったく同じです。あなたはスクラッチレポでそれを試してみませんか? –

答えて

0
  1. あなたがしているどの枝を見つける、これはgit statusで行われ、それ1行目または2行目のブランチの名前を表示します。

  2. テスト用、私は別のブランチに変更オフに最初の支店にお勧めしたい:

    git checkout -b my-patches 
    
  3. は今、すべての変更がコミットされていることを確認してください。このために、もう一度git statusを呼び出します。理想的にはワーキングディレクトリのクリーンが表示されますが、そうでない場合は、git addを使用して変更をインデックスに追加し、git commitを使用して最後にコミットします。変更を複数の異なるパッチセットに分割したい場合は(コンフリクトが発生したときに便利です)、git commit -pの使い方をお読みください。あなたはすべての変更がgit statusにもうリストされなくなるまでそれを行います。タッチしなかったファイルがgit statusに表示されます。おそらくビルド結果です。あなたがそこに留まることに興味がある変更がなければ、あなたは大丈夫です。

    ディレクトリ(たとえばmake clean)のクリーンアップをサポートするメイクファイルがある場合は、今すぐ実行してください。あなたは、すべてが働いていたことを確認実行したい場合は

    git checkout master 
    

  4. はその後(手順1で見つけたものは何でも支店名とmasterを置き換え)を使用して、戻ってあなたの元ブランチに切り替える

    git diff my-patches 
    

    フォークで変更した行をリストする必要があります。そうでない場合、何かが間違っていた。

  5. 今や恐ろしい部分が来ます。現在、このブランチに加えられた変更はすべて破棄されます。手順3で説明したように、別のブランチにすべての変更をコミットした場合は、正常に動作します。わからない場合は、リポジトリフォルダ全体をコピーしてバックアップを作成できます。そして、あなたは(再び、あなたが前に持っていたものは何でもしてmasterに置き換えて)実行します。

    git fetch 
    git reset --hard origin/master 
    
  6. 理想的には、あなたのブランチは今origin/master枝の正確な状態を持っている必要があります。すべてが大丈夫かどうかを確認してください。次に、使用して変更内容をバックマージ:

    git merge my-patches 
    

    Gitはそれは手間のかからない可能な限りそれを作るのがベストですが、おそらく競合が存在することになるでしょう。 Gitはそれぞれのファイルに>>>>`<<<<のマーカーを付けます。競合を解決するには、インターネット調査を行うか、the section about Basic Merge Conflicts in the open Git Bookをお読みください。後でマージをコミットしてください。

  7. 硬い部分が終了しました。私は一時的なブランチを使用

    git branch -d my-patches 
    

    理由は簡単にマージしようとする前に、1にリポジトリの状態を元に戻すことができるようにすることです:あなたは今、一時的なブランチを削除することができます。もちろん、別の支店でリモートステータスをチェックアウトしたこともありますが、私はこれを好きです。

1

正しいですが、リベースはコードを最新の状態に保つための1つの方法であり、これを行うためによく使用されています。

私の経験では、リベースはgitの履歴を管理する上でより便利です。あなたの歴史を素早くリニアに保ち、それは仕事が並行ではなく順番に起こったように見えます。一方、通常のマージには、発散/収束コミットが多数含まれます。この差異を視覚的に確認するには、git log --graphを使用します。

簡潔に言えば、rebaseがコミットしてパッチに変換し、再配置しているブランチに適用します。競合がある場合はgitが停止して解決を依頼し、続行することができます。だからあなたはまだ紛争を合併して解決していますが、歴史を線形にするようなやり方です。

0

フォークレポに上流のリモコンを追加しましたか?フォークをマスタと同期させる最も簡単な方法です。それはステップ3のhereです。

0

まずあなたがあなたの変更を失うことはありませんとGitはあなたの変更をコミットする機会を与える&(もしあれば)競合を解決してから変更をプッシュするかどうかは、「マージ」または「リベース」ことを知っている必要がありあなたが引っ張っている遠隔のレポに戻る。

ときにgit pullあなたがこれを行うにはgitを言っている:(プルデフォルトは「マージ」を使用することです)

場合&私のローカルな変更とそれらをマージし、リモートからのファイルの最新のコピーを引っ張りますあなたが自動的に解決できない紛争があり、私にそれを手動で解決できるように通知します。それは簡単です。

ときにgit pull --rebaseあなたがこれを行うにはgitを言っている:、

一時的に削除*私のローカルコピーからの変更(私の変更されたファイル)をリモートから最新のコピーを引っ張って、上の私の変更をマージその上に&あなたが自動的に解決することができなかった競合がある場合私はそれを手動で解決するように通知します。 (。技術的には何も削除されていない。それは、このそうでない漠然としたロジックをより明確にするだけである

違いは微妙であるあなただけのこれらの変更を行ったかのように、後者の場合には、変更内容は、ように見えますあなたが遠くから引っ張った最新のコピーの一番上ですが、あなたが見ることができるように、あなたの変更は確実に保持されます(そうでなければgitの使用は何ですか?)。

マージするかリベースする必要がありますか?それは長い議論です& 1つが他のよりよく、これのベストプラクティスがある場所があります;便利なコメントはすでにこのページに記載されています。オンラインで検索するには、 "git merge vs rebase"と入力してください。

これは役に立ちます。

関連する問題