2017-02-06 4 views
1

私はこれらのコミットをしてい同僚のコミット:Gitは:1つのコマンドで、関係する一切の枝、コミットしないいくつかの他にコミットの連鎖をコピー

U <- V <- W <- A <- B <- C 

は今、同僚は、PRを更新しているgithubのレポにプッシュ、新しいmasterに彼のブランチをリベースはgithubのレポにプッシュ、コミットを追加し、私はgithubの上の紛争を解決し、ブランチにコミットgithubの上で、同僚はtを押しつぶしたコミットのWOと別のものを追加して、私たちのチームリーダーはに相づちを打ったとgithubのエディタで編集を開始します。だから、それはこのように終わる:言い換えれば[1]

X' <- A'' <- U -> C <- W -> B ---> L --> O --> O 
<--- master' / |     / <------ master 
G ---------> M --/  \- abyssmal' <-- P --/ 

、元支店はかなり無関係だと物事の新しい状態が元の状態とはほとんど関係がありません。私は枝を操作なしのgitコマンドが実際に使用して、これをターゲットにしないことができると思います。私は(いくつかの連続したコミットの形で)私の仕事の残りを取り、今日のコードベースに適合するように試してみたいです。

通常、人々は素晴らしいですが、私の根本的な問題へのソリューションを提供しようとするので、私は物語を書いていますが、私はgithubのは、それを行うための手段を持っている場合、この特定の操作を知っていることを好むだろう。また、私は少数の人々が一方のブランチで作業するたびに、物事はすぐに厄介と枝がどんな意味を失うので、何の枝が存在しないことを示すのです。規律の欠如やGitの使い方が間違っている知っている。それを解決しないと、私はこれに対する解決策に満足しています。

私には重要なのです:


TL; DR:

コミットのいずれかの鎖をコピーする方法(それらが連鎖されて)いくつかの他には、1つのコマンドで、コミット?私。私が持っている:

...hicSuntLeones <- myCommitA <- myCommitB <- myCommitC <- whatever... 

私は超簡単なコマンドたい:もちろん解決中間競合して

...terraIncognita <- myCommitA' <- myCommitB' <- myCommitC' 

:私はそれがこのように終わるしたい

git copyCommits --since myCommitA --until myCommitC --putThemTo terraInrecognita 

を。


私はgit rebase --ontoを見ていたが、それは私が必要異なるロジックで動作するようです - それは「離婚」別のブランチとさせて頂いておりますが、私はその枝を持っていません。もし私がそれを正しく理解すれば。

私はスタックオーバーフローとウェブを見ていますが、まだ見つけることができません。 gitの答えはgitの動作を説明する傾向があり、how git rebase worksは何ですか、contrast of the design philosophy of git with the philosophy of a more traditional source control tool like svnはどのようにSCMが一般的に動作するか、どのようにrelationships with parents are importantなどです。私は傲慢に聞こえたくはありませんが、私は上記のことを実行するコマンドを探しています。何かありますか?ありがとう:)

[1] それは本当に悪くない、普通の毎日の混乱ではありません。しかし、まだこのアプローチは支店で考えているよりも簡単です。

編集:回答を提供していません:Difference between 'rebase master' and 'rebase --onto master' from a branch derived from a branch of master この参考資料は、質問でも参照されていますが、私の質問には答えません。 gitがどのように動作し、どのようにブランチが動作するのか、実際に私の質問への答えは与えられていないのです。おそらくそこに暗示されているかもしれないが、与えられていないかもしれない。

+0

を 'gitのterraIncognita myCommitA^myCommitC' --onto?それだけでは十分ではありませんか?もちろん、ブランチの名前である 'myCommitC'である。 – rodrigo

+0

ブランチはなく、コミットのみです。私はおそらく一時的な支店を作ることができます。それとも、ハッシュを取ることができますか? –

+0

はい、これもハッシュを取ります。 – amenthes

答えて

2

私の最初のアイデアはgit rebaseです。同様の効果は、以下のコマンドを使用してリポジトリに達成されるであろう

       H---I---J topicB 
          /
        E---F---G topicA 
        /
     A---B---C---D master 

$ git rebase --onto master topicA topicB 

        H'--I'--J' topicB 
       /
        | E---F---G topicA 
        |/ 
     A---B---C---D master 

:(他の多くの間)は、この良い例があり、このrebaseman git-rebaseページでは3つの引数を指定してあります。

$ git checkout -b newC myCommitC 

その後、我々は、所望の場所にこのブランチをリベース:

まず、我々は最後にブランチを作成するには、我々が興味を持っている、そしてそれをチェックアウトコミット。リベースに含まれていない最後のコミットを伝える必要があるため、最初のコミットの親を指定することを忘れないでください。

$ git rebase --onto terraIncognita myCommitA^ newC 

完了!今、あなたはnewCは新しい枝の先端を指している:何について

terraIncognita <- myCommitA' <- myCommitB' <- myCommitC' 
1

単純にgit cherry-pickです。これはコミットの連鎖を選ぶことができます。

コピーする場所にコピーする場所が2つ必要です(独自のスクリプトを作成しない限り)。そして、第1コピーするコミットた場合は、S(スタート用)で、最後は(エンド用)Eです:

git cherry-pick S^..E 

あなたは範囲を作るために帽子、接尾辞を必要とするS自体をコミットしています。

+0

私は 'cherry-pick'を試しましたが、1)コミットを1つに押しつぶしました.2)最後のコミットを残しました。最後に、最初ではありません。 –

+1

'git cherry-pick'は、' -n'を使わない限り、コピーされたコミットから個々のコミットを作るべきです。(競合が発生した場合、Gitは競合を修正し、必要に応じてコミットするように指示します。残っているコミットを実行するには、 'git cherry-pick --continue'を使用してください。 Git-1.7.2の非常に古いバージョンでは複数のコミットが新しくなっています.Gitがさらに古くなっていれば、それはないかもしれません。 – torek

+0

もう一度やり直してください。私は移動する4つのコミットを持っています:d5c22cb、7c01600d、ce0d010、088eaa67 'git co terraIncognita; git cherry-pick d5c22cb^.. 088eaa67'です。解決済みの競合が追加されました。 '--continue'd。最後の2つのコミットで終了し、最初の2つの変更が失われました。 (私の1sはこれについて間違ってコメントしています。)何か間違っているのかどうか分かりませんか? –

関連する問題