2016-09-09 10 views
1

gitに動作しないコードをマージした後、いくつかのチェックインがありました。私は2つの選択肢があります。1つずつ変更を元に戻してから、良いコードに到達すると、そこで停止します。オプション2.チェックインシャーを使用してクリーンバージョンを分けて頭にします。私は質問posted hereと他のいくつかの質問を参照してください。私はオプション1をしようとした場合、私は、次のいずれかをリセットしようとすると、夫婦のリセット後に私が取得:gitコードの古いバージョンを取得して最新のものにする方法

On branch master 
Your branch is ahead of 'origin/master' by 3 commits. 
    (use "git push" to publish your local commits) 
nothing to commit, working directory clean 

それから私は私がHEADに移動するバージョンをチェックアウトし、それをコミットしてみてください。しかし、私はこれを得ます:

私はオプション2を試してみると、コードの正しいバージョンが得られますが、コミットしようとすると、コミットするものは何も表示されません。古いバージョンのコードをGITの最新かつ最高のものにする最良の方法は何ですか? (あなたが間違った時にプッシュするのであれば、我々はコードを破壊しない) enter image description here

答えて

4

チェックアウト最後の良好なマスターを新しいブランチに:これは私がやろうとしているものです

git checkout <last good master hash> -b local_master_branch 

さて、あなたはその枝に欲しいものを桜選ぶことができます。

git cherry-pick (HASH OF DESIRED COMMITS) 

これは本当によく動作しますが、枝が多い場合は時間がかかります。私が代わりに提案する何

====================================

new_branchに

git rebase local_master_branch 

git checkout good_branch 

がそれをリベース良い枝をチェックアウトして、ローカルマスタにそのをマージすることです

git checkout local_master_branch 
git merge good_branch 

そして、が良いコードですすぎとリピートします。

===================================

あなた良い枝ドンの場合これは、あなたが指定することができます「tは、実際に存在し、あなただけで動作するように壊れたマスターを持って、それをチェックアウト

git checkout origin/master -b broken_master 

と良いマスターの上に

git rebase -i local_master_branch 

をインタラクティブなリベースを行いますあなたが実際に保管したいもの、そして私は実際には3つの方法の中で最速です。

++++++++++++++++++++++++++++++++++++++++++++++ ++++

THEN! 危険!ここではドラゴンズ!

+++++++++++++++++++++++++++++++++++++++++++++ +++++

一度完成し、あなたは(壊れた)現在のバックアップが次にあなたのきれいな、完全に建物をチェックアウトし、一定のすべてに問題支店がありません

git checkout origin/master -b broken_master 

を習得させる必要があります。

git checkout local_master_branch 

ローカルブランチの名前を変更します。

git branch -m master 

は、強制的にプッシュ

git push origin master -f 

危険をマスターします!これはです。元のマスタをリセットしているため、実際に何を行っているのかわからない場合はとなります。

そして、「今、私が働いているマスターはもはや存在しません」のようなすべての人々にとって、彼らは新しいマスターに退屈させるようにしてください。

+0

私は最後の良いチェックインで新しいブランチを作成しました。このブランチをチェックアウトするとき、私はこのメッセージを受け取ります: 'git checkout origin/clean_branch 注: 'origin/clean_branch'をチェックアウトしてください。 あなたは 'HEAD'状態になっています..... checkoutコマンドで-bを使用して、今すぐまたはそれ以降に-doを実行します。例:私がしなければ Gitチェックアウト-b <新しいブランチ名> ========= は今 'gitのは致命的なlocal_master_branch をリベース:あなたが取得する場合、単一のリビジョン 無効上流local_master_branch」 –

+0

を必要そのメッセージは、 'git checkout -b new_branch_name'を実行します。ブランチで作業するには、ブランチの名前を付ける必要があります。 –

+0

私は必要なものに手を加えてマージしました。 -bを使ってブランチを作成すると、新しいブランチとしてプッシュされます。私が欲しかったのは、origin/masterにプッシュすることでした。つまり、私は、origin/masterの背後にあるブランチの起点/ clean_codeを持っていて、origin/masterに強制します。 –

0

それはあなたがClean Codeから始まる歴史を書き換える

    1. にしたいかによって異なりちょうど悪いコミット(優しい押す)の効果を無効化または
    2. 追記史(強制すでに押された場合のプッシュが必要です)。

    1)はすでに)
    2に記載されている

    チェックアウトを取り外し
    1 git checkout <CleanCode hash> 
    2 git symbolic-ref HEAD refs/heads/master 
    3 git commit -m <commit message> 
    4 git cherry-pick <good commit> 
    
    1. のようになり、インデックスがCleanCodeと同期されて再びトップを習得する
    2. HEAD点をコミット、指標は静止状態を保持しています CleanCode
      (1 2はget reset <CleanCode hash>git reset --soft <master top hash>で置換できます)
    3. はCleanCodeからの有効な指標と新しいコミットします - 元CleanCodeが無効にされた後、すべての効果は、コミット(悪いと良い)
    4. すべてその歴史はなります後の良好なデルタ(コミット良いの効果を復元)

    を適用しますこのように

    <cherry-picked delta> 
    | 
    <CleanCode state copy> 
    | 
    <delta to cherry-pick> 
    | 
    <bad commit> 
    .. 
    | 
    <CleanCode> 
    | 
    .. 
    
  • 関連する問題