2017-10-04 15 views
0

私は小さなコミットがたくさんある単純なプロジェクトを持っています。私はそれらのいくつかを取り除きたいと思います。私はこれを今いくつかのテストプロジェクトでテストしています。私はリモートのリポジトリをシミュレートするフォルダとそれに接続された2つの他のフォルダ、test1test2を持っています。私は何をした前に、これは、リモートとローカルのリポジトリの状態です:トップコミットを削除すると、他のローカルリポジトリに問題が発生します

* 0000002C (HEAD -> master, origin/master, origin/HEAD) Small commmit 12 
* 0000002B Small commmit 11 
* 0000002A Small commmit 10 
* 00000029 Small commmit 09 
* 00000028 Small commmit 08 
* 00000027 Small commmit 07 
* 00000026 Small commmit 06 
* 00000020 Big commmit 02 
* 00000015 Small commmit 05 
* 00000014 Small commmit 04 
* 00000013 Small commmit 03 
* 00000012 Small commmit 02 
* 00000011 Small commmit 01 
* 00000010 Big commit 01 

私は最初の大きなものまでコミット小型のカップルを取り除くためにgit reset --mixedを実行します。

git checkout master 
git reset --mixed 00000020 
git add . 
git commit -m "New starting" 
git push --force origin master 

すべてはokです。押圧力後、リモートリポジトリが更新されていないと私はもはやすべてのそれらの小さなコミットしていされています。他のフォルダで

* 0000002D (HEAD -> master, origin/master, origin/HEAD) New starting 
* 00000020 Big commmit 02 
* 00000015 Small commmit 05 
* 00000014 Small commmit 04 
* 00000013 Small commmit 03 
* 00000012 Small commmit 02 
* 00000011 Small commmit 01 
* 00000010 Big commit 01 

を、私は更新のために取り出され、これはログです:

* 0000002D (origin/master, origin/HEAD) New starting 
| * 0000002C (HEAD -> master) Small commmit 12 
| * 0000002B Small commmit 11 
| * 0000002A Small commmit 10 
| * 00000029 Small commmit 09 
| * 00000028 Small commmit 08 
| * 00000027 Small commmit 07 
| * 00000026 Small commmit 06 
|/ 
* 00000020 Big commmit 02 
* 00000015 Small commmit 05 
* 00000014 Small commmit 04 
* 00000013 Small commmit 03 
* 00000012 Small commmit 02 
* 00000011 Small commmit 01 
* 00000010 Big commit 01 

I進める方法がわからない。 0000002Dコミットorigin/masterは、私が最も更新したい他のフォルダと、2つの異なるブランチにあるローカルマスタからコミットしています。このローカルリポジトリを最初のフォルダと同じ状態にするために今何をする必要があると思いますか?私はgit rebaseを試して失敗しました。 git mergeは新しいコミットを作成し、ローカルmasterorigin/masterをマージしますが、これはもちろん解決策になります。

ありがとうございました。

git fetch 
git checkout -B master origin/master 

これはあなたのローカルバージョンを強制的にリセットされます:あなたはあなたの第二のリポジトリは、あなたの最初のリポジトリにまだ入っていないすべての変更を持っている2番目のリポジトリでこれを実行していないことを確信している場合

+1

これは、強制的に押してはいけない理由です。あなたの元の変更を既に引っ張ってしまった人々は、基本的に地獄のように混乱します –

+0

私はそれを実現しました。私は何が起こるかを見るためにこのテストを準備しました。私はライブプロジェクトでこれをやっていないことを嬉しく思っています:p – Celdor

+1

これは新しい開発のために別々のブランチを作成する必要があります。複数のチームメンバーが作業します。あなたが個人的に地元で働いている「小さな変化」を保ち、他の人の助けが必要な場合や完了した場合にのみプッシュすることもよいアイデアです。あなたの心のコンテンツのローカルな変更を書き換えることができるからです。コミットが必要なやりかたの後にプッシュします(または、共有ブランチにマージ/リベースするだけです)。 – LightCC

答えて

2

masterorigin/masterと同一である必要があります。

この場合、「the perils of rebasing」を理解するか、場合によってはリセットすることが重要です。

つまり、コードをリベースまたはリセットすると、コミット履歴が書き換えられます。古いコミットを編集していると思うのは直感的ですが、実際には古いコミットから変更を加え、新しいコミットを作成しています。

これは、2番目のリポジトリを更新する前に、元のコミットがすべて残っていることを意味します。あなたがそれを更新すると、あなたが作成した新しいコミット(あなたのケースでは、 "新しい開始")に追加され、すべてがマージされました。

+1

ありがとうございました。私はチェックアウトのオプション-Bについて知らなかった。 – Celdor

+0

@Celdorそれは私の個人的なお気に入りです。楽しい! :) –

関連する問題