2016-06-29 1 views
0

変更を行った後にプル(衝突なし)を行った後、コミット/プッシュ(人工的なブランチとマージを作成する)後に線形履歴を復元する方法を教えてください。プル/プッシュと分岐なしでgitヒストリをクリーンアップした後での清掃

複数の人が同じブランチで作業していますが、別々のファイル/フォルダで作業しています。コミットする前に、コミットを行う前にリポジトリからいくつかの変更を取り除かなければならないことをgitは時折指示します。競合のない正常なプル後、新しいコードがコミットされ、プッシュされます。しかし、gitの履歴は、今では次のようになります。

git tree with branches

マージ中に競合が存在しないとして、私は歴史が線形ことを期待します。いくつかの読書をした後、私は矛盾がなければ、私は線形の歴史を得るためにフェッチし、次にリベースを行うべきであることを理解する。しかし、その行為は完了です。線形履歴を復元するにはどうすればよいですか?

git tree linear

答えて

2

git rebaseが機能します。現在のブランチがmasterで、最初のグラフのコミットが下から上にラベル付けされているとします。第4グリーンB C D、次の5パープルE F G H I、左2緑色であり、J、K、右2紫L Mであり、トップグリーンN.

git rebase --onto J D master 

であり、我々は線形履歴A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'を得る。れますE'Eは、異なるsha1を持つ同等のコミットです。

あり

git rebase --onto I D master 

別の方法があり、我々は線形の歴史A-B-C-D-E-F-G-H-I-J'-L'-M'を取得します。

git rebaseがあまり明確でない場合は、git resetgit cherry-pickで切断し、後者を移植することもできます。

KとNはマージコミットなので、線形履歴には存在しません。私たちは無視することができます。

git reset J --hard 
git cherry-pick E F G H I L M 
#or one by one: git cherry-pick E;git cherry-pick F;... 

最後に、線形履歴A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'を取得します。

それとも別の方法

git reset I --hard 
git cherry-pick J L M 

でそして、我々は線形の歴史A-B-C-D-E-F-G-H-I-J'-L'-M'を取得します。競合がなければ、2つのツリーは同じ内容を持っています。

1

merge(応じて設定やパラメータなしpullfetch + mergeに等しいしたいか、手動でこれらのコマンドを実行した場合、あなたはfetch + rebaseかかわらにpullを等しくすることができます)のみ維持しますマージが早送りの場合はリニア履歴になります。つまり、マージしているブランチに固有のコミットはありません。 mergeは、早送りマージの場合にのみマージを行うように指示することも、線形履歴を保持しないように指示する場合でも、常にマージコミットを作成するように指示することもできます。

rebase常には線形履歴を維持する。

競合があるかどうかは、歴史的な直線性には何ら影響しません。

できるだけ線形履歴をしたい場合は、mergeまたはrebaseのどちらを使用するかは比較的簡単です。

操作のターゲットブランチがローカルブランチである場合、ローカルブランチであることを意味します。つまり、ユニークなコミットがまだプッシュされていないことを意味します。rebaseはローカルヒストリにのみ影響します。

操作のターゲットブランチが既にプッシュされている場合は、i。 e。すでにプッシュされていて最終的に他の人にフェッチされたユニークなコミットを持っている場合は、mergeを使用して、非線形履歴を使用して生きる必要があります。彼らがすでにリベースしているコミットを引っ張った場合は、リベースしてください。

マージされた変更を既にプッシュしていることがわかっているので、同じことが当てはまります。これは、リニア履歴に変更すると、公開された履歴を変更し、すべての同僚が後で仕事をリベースする必要があることを意味します変更された履歴を強制的にプッシュしました。

あなたがまだ襲っていない、またはあなたを襲う憎しみの波を気にしないならば、あなたは簡単にリベースすることができます。あなたがe。 g。すべてのベルベットコミットの上から下から5番目の緑のコミットを持っていてもOKです。緑のブランチをチェックアウトしてgit rebase pinkを実行すると、線形の履歴になります。

関連する問題