725

私は間違ったブランチに完全に良いコミットをしました。マスターブランチの最後のコミットを元に戻し、同じ変更を加えてアップグレードブランチに取り込むにはどうすればよいですか?

4

11 に答える 11

1150

まだ変更をプッシュしていない場合は、ソフトリセットを実行することもできます。

git reset --soft HEAD^

これによりコミットは元に戻りますが、コミットされた変更はインデックスに戻されます。ブランチが相互に比較的最新であると仮定すると、gitを使用すると、他のブランチへのチェックアウトが可能になり、コミットするだけで済みます。

git checkout branch
git commit -c ORIG_HEAD

この-c ORIG_HEAD部分は、コミットメッセージを再度入力しないようにするのに役立ちます。

于 2010-05-31T05:53:20.067 に答える
188

このトピックについては4年遅れていますが、これは誰かに役立つかもしれません。

コミットする前に新しいブランチを作成するのを忘れて、すべてをマスターにコミットした場合は、コミットの数に関係なく、次のアプローチの方が簡単です。

git stash                       # skip if all changes are committed
git branch my_feature
git reset --hard origin/master
git checkout my_feature
git stash pop                   # skip if all changes were committed

これで、マスターブランチがに等しくなりorigin/master、すべての新しいコミットがオンになりmy_featureます。my_featureこれはローカルブランチであり、リモートブランチではないことに注意してください。

于 2014-02-06T14:44:33.570 に答える
116

クリーンな(変更されていない)作業コピーがある場合

1つのコミットをロールバックするには(次のステップのためにコミットのハッシュをメモしてください):

git reset --hard HEAD^

そのコミットを別のブランチにプルするには:

git checkout other-branch
git cherry-pick COMMIT-HASH

変更または追跡されていない変更を行った場合

また、追跡されていない変更された変更があれば削除git reset --hardされることに注意してください。したがって、変更がある場合は、次のようにします。

git reset HEAD^
git checkout .
于 2010-05-31T05:33:08.127 に答える
22

すでに変更をプッシュしている場合は、HEADをリセットした後、次のプッシュを強制する必要があります。

git reset --hard HEAD^
git merge COMMIT_SHA1
git push --force

警告:ハードリセットは作業コピーのコミットされていない変更を元に戻しますが、強制プッシュはリモートブランチの状態をローカルブランチの現在の状態で完全に上書きします。

念のため、Windows(BashではなくWindowsコマンドラインを使用)では、実際^^^^には1つではなく4つなので、

git reset --hard HEAD^^^^
于 2010-05-31T06:11:27.620 に答える
19

私は最近同じことをしました。他のブランチにコミットする必要があったときに、誤ってマスターに変更をコミットしました。しかし、私は何もプッシュしませんでした。

間違ったブランチにコミットしたばかりで、それ以降何も変更しておらず、リポジトリにプッシュしていない場合は、次の操作を実行できます。

// rewind master to point to the commit just before your most recent commit.
// this takes all changes in your most recent commit, and turns them into unstaged changes. 
git reset HEAD~1 

// temporarily save your unstaged changes as a commit that's not attached to any branch using git stash
// all temporary commits created with git stash are put into a stack of temporary commits.
git stash

// create other-branch (if the other branch doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// take the temporary commit you created, and apply all of those changes to the new branch. 
//This also deletes the temporary commit from the stack of temp commits.
git stash pop

// add the changes you want with git add...

// re-commit your changes onto other-branch
git commit -m "some message..."

注:上記の例では、git reset HEAD〜1を使用して1つのコミットを巻き戻していました。ただし、n個のコミットを巻き戻したい場合は、git reset HEAD〜nを実行できます。

また、間違ったブランチにコミットし、間違ったブランチにコミットしたことに気付く前にさらにコードを記述した場合は、gitstashを使用して進行中の作業を保存できます。

// save the not-ready-to-commit work you're in the middle of
git stash 

// rewind n commits
git reset HEAD~n 

// stash the committed changes as a single temp commit onto the stack. 
git stash 

// create other-branch (if it doesn't already exist)
git branch other-branch

// checkout the other branch you should have committed to.
git checkout other-branch

// apply all the committed changes to the new branch
git stash pop

// add the changes you want with git add...

// re-commit your changes onto the new branch as a single commit.
git commit -m "some message..."

// pop the changes you were in the middle of and continue coding
git stash pop

注:このWebサイトを参照として使用しました https://www.clearvision-cm.com/blog/what-to-do-when-you-commit-to-the-wrong-git-branch/

于 2017-05-30T21:51:29.300 に答える
12

間違ったブランチでの複数のコミットの場合

あなたにとって、それがちょうど約1コミットである場合、利用可能な他のより簡単なリセットソリューションがたくさんあります。私の場合、masterブランチではなく誤ってブランチで作成したコミットが約10個あり、それを呼び出しましょうtarget。コミット履歴を失いたくありませんでした。

あなたができること、そして私を救ったのは、4ステップのプロセスを使用して、この答えを参照として使用することでした-

  1. tempから新しい一時ブランチを作成しますmaster
  2. tempもともとコミットを目的としたブランチにマージします。target
  3. コミットを元に戻すmaster
  4. 一時的なブランチを削除しtempます。

上記の手順の詳細は次のとおりです-

  1. master(誤って多くの変更を行った場所)から新しいブランチを作成します

    git checkout -b temp
    

    注:-bフラグは新しいブランチを作成するために使用されます
    これが正しいかどうかを確認するgit branchために、tempブランチにいるgit logことを確認し、コミットが正しいかどうかを確認します。

  2. 一時的なブランチを、元々コミットを目的としたブランチにマージしtargetます。
    まず、元のブランチに切り替えます。つまり、元のブランチに切り替えます(まだ行っていない場合は切り替えるtarget必要があります)。git fetch

    git checkout target
    

    注:-bフラグ
    を使用しない場合 は、一時的なブランチを現在チェックアウトしているブランチにマージしましょう。target

    git merge temp
    

    競合がある場合は、ここでいくつかの競合に対処する必要があるかもしれません。正常にマージした後、プッシュ(私はそうします)または次のステップに進むことができます。

  3. この回答masterを参照として使用する際の偶発的なコミットを元に戻し、最初にに切り替えますmaster

    git checkout master
    

    次に、下のコマンドを使用してリモートと一致するように(または、必要に応じて適切なコマンドを使用して特定のコミットに)元に戻します。

    git reset --hard origin/master
    

    繰り返しになりますgit logが、意図した変更が有効になったことを確認するために、前後に実行します。

  4. 証拠を消去する、つまり一時的なブランチを削除します。このためには、最初に、tempがマージされたブランチをチェックアウトする必要があります。つまりtarget(そのままにしmasterて以下のコマンドを実行すると、を取得する可能性がありますerror: The branch 'temp' is not fully merged)、

    git checkout target
    

    そして、この事故の証拠を削除します

    git branch -d temp
    

どうぞ。

于 2020-01-21T20:15:43.343 に答える
11

したがって、masterコミットしたがコミットするつもりであっanother-branchたが(まだ存在していない場合もある)、まだプッシュしていないシナリオの場合、これは非常に簡単に修正できます。

// if your branch doesn't exist, then add the -b argument 
git checkout -b another-branch
git branch --force master origin/master

これで、へのすべてのコミットmasterがオンになりますanother-branch

愛を込めて提供:http://haacked.com/archive/2015/06/29/git-migrate/

于 2016-04-08T13:19:46.920 に答える
9

この答えを詳しく説明するためdevelopに、移動するコミットが複数ある場合、たとえばnew_branch

git checkout develop # You're probably there already
git reflog # Find LAST_GOOD, FIRST_NEW, LAST_NEW hashes
git checkout new_branch
git cherry-pick FIRST_NEW^..LAST_NEW # ^.. includes FIRST_NEW
git reflog # Confirm that your commits are safely home in their new branch!
git checkout develop
git reset --hard LAST_GOOD # develop is now back where it started
于 2018-10-18T00:48:18.360 に答える
3

この問題が発生し、Visual Studioを使用している場合は、次の操作を実行できます。

ブランチを右クリックして、次を選択しますView History

ここに画像の説明を入力してください

戻りたいコミットを右クリックします。そして、必要に応じて元に戻すかリセットします。

ここに画像の説明を入力してください

于 2017-04-04T23:39:24.037 に答える
2

私の場合、これは、プッシュしたコミットを元に戻し、そのコミットを他のブランチにチェリーピックすることで解決しました。

git checkout branch_that_had_the_commit_originally
git revert COMMIT-HASH
git checkout branch_that_was_supposed_to_have_the_commit
git cherry pick COMMIT-HASH

を使用git logして正しいハッシュを見つけることができ、いつでもこれらの変更をプッシュできます。

于 2020-04-15T19:29:26.470 に答える
1

変更を適用したいブランチがすでに存在する場合(ブランチ開発など)、以下のfotanusによって提供された指示に従ってください。

git checkout develop
git rebase develop my_feature # applies changes to correct branch
git checkout develop # 'cuz rebasing will leave you on my_feature
git merge develop my_feature # will be a fast-forward
git branch -d my_feature

また、必要に応じて、 my_featureの代わりにtempbranchまたはその他のブランチ名を使用することもできます。

また、該当する場合は、ターゲットブランチでマージするまで、スタッシュポップ(適用)を遅らせます。

于 2016-08-23T22:15:55.623 に答える