5

これは私の別の質問(ワークスペースファイルを変更せずに別のブランチに切り替える)に似ていますが、そこで機能したソリューションは現在機能しません。

ずっと前にリモートマスターにプッシュされたいくつかの変更を削除する必要がありました。したがって、マスターからコミットを削除したくはありませんが、これらの変更が元に戻されたのと同じようにファイルを変更したいと思います。だから私はこれをしました:

  1. マスターにいる間、git branch limits
  2. git checkout limits
  3. git rebase --interactive <commit before the ones I wanted to remove>
  4. インタラクティブコンソールで、元に戻したい変更を加えてコミットを削除しました

だから今、limits私はマスターでそれを望むようなコードを持っています。どうすればマスターに「移動」できますか?のコードを使用してブランチlimitsに変更したいのmasterですが、ワークスペース内のファイルを変更せずに、変更を新しい変更としてコミットできますmaster

4

4 に答える 4

6

あなたが述べた質問に対する答えは次のとおりです。

$ git checkout master             # switch to master branch

$ git reset --hard limits         # hard-reset it to the limits commit
$ git reset --soft master@{1}     # move the reference back to where it was, but
                                  #  don't modify the working tree or index

limitsこれにより、チェックアウトした場合とまったく同じように作業ツリーとインデックスが残りますがmaster、元の場所のブランチに移動します。


ただし、このようなことを行う適切な方法は、git revert元に戻そうとしている変更ごとに行うことです。

于 2012-07-13T15:40:12.173 に答える
5

インタラクティブなリベースを使用するのではなく、不要な各コミットを元に戻すことができます。を使用するgit revert <object-name-of-commit>と、gitは、名前を付けたものによって導入された変更を取り消す新しいコミットを導入します。したがって、削除したいコミットがとであると仮定するabc123と、次のdef456ように実行できます。

git checkout master
git revert abc123
git revert def456

ただし、これらのコミットを見つけるのに多くの作業が必要であり、のヒントに満足している場合は、そこからツリーの状態を含むlimits新しいコミットを作成することができます。masterまず、を使用するので、それがクリーンであることを確認git statusしてください。これによりgit reset --hard、コミットされていない変更が消去されます。

git checkout master
git reset --hard limits
git reset --soft HEAD@{1}
git commit -m "Reverting unwanted commits"

そのレシピは、この質問の1つのバリエーションです。

于 2012-07-13T15:42:45.343 に答える
1

これは要求しますrevert:-)

マスターに戻り、git-revert適用を解除したい各コミットを行います。これにより、それぞれに「適用されていない」コミットが作成されます。したがって、履歴は変更されませんが、必要な効果が得られます。

于 2012-07-13T15:43:11.677 に答える
0

ブランチポインタを移動する

実際にやろうとしているのが、複雑なリベースの後にマスターのブランチポインターを移動したり、別のブランチにマージしたりすることである場合は、さまざまな方法でそれを行うことができます。たとえば、暫定ブランチを強制的に移動して新しいマスターブランチにする場合は、次のいずれかを実行できます。

# Use git porcelain to move the branch over top of one that already
# exists.
git branch -M limits master

# Explicitly move the branch pointer to wherever the head for limits
# is pointing.
git reset --hard refs/heads/limits

このさまざまな配管コマンドを実行する方法もありますが、これは網羅的な論文を意味するものではありません。正しい方向に向けるには十分なはずです。

コミットを元に戻す

他の投稿やコメントが正しく指摘しているように、マスターからターゲットのコミットを元に戻すだけの場合は、git-revert(1)を使用できます。これにより、元のコミットと復帰の両方が履歴に残ることに注意してください。これは通常あなたが望むものです。

また、git-revertは競合や望ましくない変更を引き起こす可能性があることに注意してください。特に、元に戻すコミットが小さくないアトミックな変更である場合は、手動で解決する必要があります。git-revertをリバースパッチ(基本的には内部で)と考えると、潜在的な競合が発生する可能性のある場所を確認できます。

あなたのマイレージは確かに異なります。

于 2012-07-13T15:33:59.840 に答える