は、我々はSubversionのからのgitのために来て、私の会社ではgitために新しいしている、と週末に我々はコミットは、我々がしませんでした枝の公開バージョンに行われた私たちのリポジトリにブランチに状況に走りましたそこに欲しい。は、どのように私はより良いハンドルはgitの中で「閉」の分岐を汚染コミットすることができますか?
A -> B
をそしてで支店を置くために悪いコミットを得た:私たちが持っていた
A -> B -> C -> D
C及びDは、そのブランチにされたことがないはずです。このブランチは "閉鎖されました"という問題があります。これは私たちのソフトウェアのリリース版であり、このブランチには新たなコミットがあってはいけません。
バックBに私を取得しますが、タイムライン上で前進私を続けA -> B -> C -> D -> !D -> !C
:!!のあなたがで終わるよう
はSubversionではこの種の状況のうち唯一の方法は、DとCをコミットしました枝のマスターリポジトリと同期するブランチのリモコンで誰もがCとDを取得し、論理的に類似したBのバージョン(ただしB - B 'それを呼び出す)で終わるためにそれらを元に戻す必要がありますので。
私はthis solution for reverting commits in gitに遭遇しました。私たちの公開リポジトリはA -> B
に戻っていました。しかし、それは、誰かの作業マシン上のこのブランチのクローンが間違っていて、誰もが再クローンする必要があることを意味しました。私の修正はに達した:
git checkout thebranch
git reset --hard <<commit # associated with commit B>>
git push --force
私は上記のリンクのルートを行くことになった
と、それは非常に物議をかもしている。
A)あなたは捨てて、このようにgitを公開リポジトリにコミット履歴ことができます文字通りコミットの現実を書き直す。
b)ブランチ(または作成したいブランチの新しいブランチ)にC -> D
を再注入する危険がないように、誰もが再クローンしなければなりませんでした。
私はがやるべきだと思う:
git revert HEAD~2
git commit
git push
をしかし、クローズされることになっているため、これは
A -> B -> C -> D -> E
として枝を残しているだろうし、それは本当にそれで
C -> D -> E
を持つべきではありません。
私は3つの質問持っている:私はより良いクリーンアップを処理している可能性がどのように
- を?
reset
の代わりにrevert
を使用しますか?ブランチ汚染のためのベストプラクティスは何ですか? - 本当に戻っ枝の
push --force
は公開リポジトリで歴史を破壊しましたか?またはバックBにgitのロールをしましたが、C -> D
の記録を保持し、元に戻すが、私がいくつかの点でバックBに行われていた?それコミットログに復帰が表示されないのは間違いありませんが、私のアクションの記録は別の場所に保存されている可能性があります。 - どのようにこれらの変更は、最初の場所でそこに得ていることができなかったようにgitに「閉」の枝を扱うのですか?コミットBでタグをリポジトリに適用しましたが、ブランチ+タグを使ってリリースのソースを取得することになっていましたが、ブランチラインに変更を表示するのは恐ろしいことですコミットBの後で変更されます。パッチリリースのためにブランチからブランチしている人は、タグを見逃してしまい、
C -> D
を新しいブランチに引き込むことができませんでした。
ラベルを言うとき、gitタグについて話していますよね? – idbrii
@pydave:申し訳ありません、はい、私はタグを意味しました。私の言葉の中でテクノロジーの交差汚染。 :) –