0

だから私はgithubにマスターとリファクタリングの2つのブランチを持っていました。ローカルでリファクタリングをチェックして、町に行きました。ある時点で、git push origin master元のリファクタリングにプッシュする代わりに失敗して実行し、さらに、さらに有効な変更を master にコミットしてから 2 週間後まで問題に気づきませんでした。

/me フェイスパームス

ボークを解除しようとするために、マスターをローカルでチェックアウトし、git revert <some tag>追加したさまざまなファイルを削除してマスターを修正するなどの作業を行いました。ハッピーエンド!元のマスターにプッシュされ、すべてが順調でした。ローカルのリファクタリング ブランチで作業を続け、ときどきオリジン リファクタリングにプッシュしました。

今日、リファクタリングの最初のパスが完了し、変更をマスターにプッシュしたいと考えています。私git add、、。git commit_ git push origin refactorすべては順調です。次に、オリジンマスターにプッシュしようとします。失敗!驚くべきことではありませんが、悪ふざけのために手動でマージする必要がありますよね? それでgit pull origin master、私はローカルのリファクタリングブランチにいます...そして、すべてが壊れてしまいます。私の新しいファイルはすべて削除され、どこでも競合します。

何が起こっているのかいうと、元に戻すプッシュが適用されようとしていて、マスターの上にきれいに適用されるはずの完全に幸せな変更と競合していると思います。

それで、私はまだgit newbなので、私の跛行を救う方法について何か提案はありますか? 私の将来のワークフローでこのクラスのエラーを回避する方法について、一般的なガイダンス/教育を提供できればボーナスポイント. ありがとう!

4

2 に答える 2

0

git revert以前のコミットで行われたことの逆の変更を適用する新しいコミットを追加することにより、変更を元に戻します。パブリックにプッシュしたブランチや、他のブランチがすでに自分のリポジトリにプルしている可能性のあるブランチの履歴を書き直すことなく、変更を元に戻したい場合に便利です。

そうでない場合は、 などのより直感的な手法を使用して変更を元に戻すことをお勧めしますgit reset。master ブランチにコミット A、B、C があり、誤ってその上に D と E をコミットしたとします。

                       master
 A <-- B <-- C <-- D <-- E

D と E が不要で余分なコミットである場合、次のように簡単に実行できます。

ローカルの master ブランチに移動します。

git checkout master

を使用して特定のコミットを指すようにし--hardます。これは非常に汎用的なコマンドです。コミットは、オブジェクト ベース内の任意のものにすることができます。必ずしもマスターの履歴内のコミットである必要はありません。あなたの場合:

git reset --hard <sha1 of C>

           master           
 A <-- B <-- C

次に、履歴を書き換えたため、強制的にレポにプッシュします。したがって、早送りではありません。

git push origin master -f

次に、リファクタリングをチェックアウトして、作業を続けます。マスター ブランチが指していた場所から取得したい場合 (つまり、余分な余分なコミットがある場合)、git resetそこに設定するために使用できます。

git checkout refactor
git reset --hard <sha1 of E>

           master      refactor
 A <-- B <-- C <-- D <-- E

もちろん、これはオプションです。新しいマスターからリファクタリングを分岐し、以前の変更を手動で追加する、またはチェリーピッキングなどの別の方法を使用することもできます。

次に、コミットをrefactorに追加し続け、マスターにマージしてマスターをプッシュします。

git checkout master
git merge refactor
git push origin master

                            master  
                            refactor
 A <-- B <-- C <-- D <-- E <-- F

そこでは、まだ非常に基本的なワークフローです。私の提案は、次のようなツールを使用することですgitk

gitk --all

できるだけ頻繁に、さまざまなブランチで何が起こっているかを確認してください。

于 2013-07-16T21:47:39.767 に答える