4513

マスター ブランチ内で、git merge some-other-branchローカルで実行しましたが、オリジン マスターに変更をプッシュすることはありませんでした。統合するつもりはなかったので、元に戻したいと思います。git statusマージ後に実行すると、次のメッセージが表示されました。

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

見つけたいくつかの指示に基づいて、実行してみました

git revert HEAD -m 1

しかし今、私はこのメッセージを受け取っていますgit status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

私のブランチが何回もコミットされたくないのです。どうすればその時点に戻ることができますか?

4

33 に答える 33

5161

git reflogどのコミットがマージ前のコミットであるかを確認します(よりgit reflogも優れたオプションになりますgit log)。次に、次を使用してリセットできます。

git reset --hard commit_sha

別の方法もあります:

git reset --hard HEAD~1

それはあなたに1コミットを戻します。

変更された、コミットされていない、またはスタッシュされていないファイルは、変更されていない状態にリセットされることに注意してください。それらを保持するには、変更を隠しておくか、--merge以下のオプションを参照してください。


@Velmontが彼の回答で以下に提案したように、この直接的なケースでは次を使用します:

git reset --hard ORIG_HEAD

変更を保存する必要があるため、より良い結果が得られる可能性があります。ORIG_HEADマージが発生する直前にコミットを指すため、自分で探す必要はありません。


さらなるヒントは、ファイルを不必要にリセットしないため、--merge代わりにスイッチを使用することです。--hard

git reset --merge ORIG_HEAD

- マージ

インデックスをリセットし、<commit> と HEAD の間で異なる作業ツリー内のファイルを更新しますが、インデックスと作業ツリーの間で異なるファイル (つまり、追加されていない変更があるファイル) は保持します。

于 2010-03-05T19:34:01.440 に答える
1604

ローカルマスターがオリジン/マスターより進んでいないと仮定すると、できるはずです

git reset --hard origin/master

次に、ローカルmasterブランチは と同じに見えるはずですorigin/master

于 2011-03-17T18:06:06.707 に答える
1223

Gitブックの第4章と、LinusTorvaldsによる元の投稿を参照してください。

すでにプッシュされているマージを元に戻すには:

git revert -m 1 commit_hash

Linusが言ったように、ブランチを再度コミットする場合は、必ず元に戻してください。

于 2011-06-02T16:31:43.723 に答える
1087

最も単純なコマンドが欠落していたのは奇妙です。ほとんどの答えはうまくいきますが、今行ったマージを元に戻すのは簡単で安全な方法です:

git reset --merge ORIG_HEAD

refORIG_HEADは、マージ前の元のコミットを指します。

(この--mergeオプションはマージとは関係ありません。 と同じですgit reset --hard ORIG_HEADが、コミットされていない変更には触れないため、より安全です。)

于 2013-01-29T15:46:35.217 に答える
444

新しいバージョンのGitでは、まだマージをコミットしておらず、マージの競合がある場合は、次のようにするだけです。

git merge --abort

差出人man git merge

[これ]は、マージによって競合が発生した後にのみ実行できます。git merge --abortマージプロセスを中止し、マージ前の状態を再構築しようとします。

于 2013-02-12T02:13:29.667 に答える
155

以前のコミットにリセットする必要があります。これはうまくいくはずです:

git reset --hard HEAD^

またはHEAD^^、そのコミットを元に戻すことさえできます。何ステップ戻す必要があるかわからない場合は、いつでも完全な SHA 参照を提供できます。

問題があり、マスター ブランチにローカルの変更がなかった場合は、にリセットできますorigin/master

于 2010-03-05T19:31:35.517 に答える
40

わかりました、ここで他の人が私に与えた答えは近いものでしたが、うまくいきませんでした. これが私がしたことです。

これをやって...

git reset --hard HEAD^
git status

...次のステータスになりました。

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

その後、同じgit resetコマンドをさらに数回入力する必要がありました。これを行うたびに、以下に示すようにメッセージが 1 つずつ変化しました。

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

この時点で、ステータス メッセージが変更されたgit pullことがわかりました。

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

簡単に言えば、私のコマンドは次のようになりました。

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
于 2010-03-05T19:54:06.280 に答える
23

git reflog以前のチェックアウトを見つけるために使用できます。時々、それはあなたが戻りたいと思う良い状態です.

具体的には、

$ git reflog
$ git reset --hard HEAD@{0}
于 2014-01-17T22:36:18.347 に答える
15

まだコミットしていない場合は、

$ git checkout -f

マージ (および実行したすべての操作) が取り消されます。

于 2013-01-18T15:25:37.117 に答える
15

オリジンに一致するように戻すことも検討しているこの質問に行きました(つまり、オリジンより先にコミットしません)。さらに調査すると、resetまさにそのためのコマンドがあることがわかりました。

git reset --hard @{u}

注:@{u}は の省略形ですorigin/master。(もちろん、これを機能させるにはリモート リポジトリが必要です。)

于 2017-02-16T21:54:41.200 に答える
11

特定のコミットによってマージまたは再起動を元に戻すには、次の 2 つのコマンドのみを使用できます。

  1. git reset --hard commitHash(再開したいコミットを使用する必要があります。例: 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force(新しいローカル マスター ブランチを origin/master に送信する)

頑張ってください!

于 2014-12-12T23:16:56.883 に答える
10

追加のオプションを見るために、私は主にここで説明されている分岐モデルに従ってきました: http://nvie.com/posts/a-successful-git-branching-model/とマージされています--no-ff(no早送り)通常。

このページを読んだのは、リリース ブランチの代わりにテスト ブランチをデプロイ用のマスターに誤ってマージしてしまったためです (ウェブサイト、マスターはライブです)。testing ブランチには他に 2 つのブランチがマージされており、合計で約 6 つのコミットがあります。

したがって、コミット全体を元に戻すには、1 つだけ必要git reset --hard HEAD^で、マージ全体を元に戻しました。マージは早送りされていないため、マージはブロックであり、一歩戻ると「ブランチがマージされていません」です。

于 2011-06-09T00:54:52.290 に答える
8

マージと対応するコミットがまだプッシュされていない場合は、いつでも別のブランチに切り替えて、元のブランチを削除して再作成できます。

たとえば、develop ブランチを誤って master にマージしてしまい、それを元に戻したいと思いました。次の手順を使用します。

git checkout develop
git branch -D master
git branch -t master origin/master

出来上がり!マスターはオリジンと同じ段階にあり、あなたのミスマージ状態は消去されます。

于 2012-06-26T11:15:48.300 に答える
5

戦略:すべてが良かったところから新しいブランチを作成します。

理由:マージを元に戻すのは困難です。マージをコミットまたはプッシュしたかどうか、またはマージ後に新しいコミットがあったかどうかなど、多くの要因に応じて、解決策が多すぎます。また、これらのソリューションを自分のケースに適応させるには、git を比較的深く理解している必要があります。盲目的にいくつかの指示に従うと、何もマージされない「空のマージ」になる可能性があり、さらにマージを試みると、Git は「既に最新の状態です」と通知します。

解決:

devにマージしたいとしましょうfeature-1

  1. マージを受け取るリビジョンを見つけます。

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. それをチェックしてください(時間をさかのぼってください):

    git checkout e5f6g7h8
    
  3. そこから新しいブランチを作成してチェックアウトします。

    git checkout -b feature-1
    

これで、マージを再開できます。

  1. マージ:git merge dev

  2. マージの競合を修正します。

  3. 専念:git commit

  4. 結果に満足したら、古いブランチを削除します。git branch --delete feature-1

于 2015-06-11T15:42:41.007 に答える
5

新しいブランチを作成してから、目的のコミットをチェリーピックします。

上記の多くの回答で説明されているように、そのセーバーとより簡単なリセット

于 2019-08-15T13:41:11.220 に答える
5

コマンドライン ソリューションが必要な場合は、MBO の回答を使用することをお勧めします。

あなたが初心者なら、グラフィカルなアプローチが好きかもしれません:

  1. キックオフgitk(コマンドラインから、またはファイルブラウザがある場合は右クリック)
  2. そこにあるマージコミットを簡単に見つけることができます-2つの親を持つ上からの最初のノード
  3. 最初/左の親へのリンクをたどります(マージ前の現在のブランチにあるもの、通常は赤です)
  4. 選択したコミットで、「ブランチをここにリセット」を右クリックし、そこでハードリセットを選択します
于 2013-03-21T14:38:22.977 に答える
3

私は、あなたが巻き戻したいと思うだけの識別ハッシュと1を加えたもの(またはあなたが行きたいコミットの数)の識別ハッシュがgit rebase -i [hash] [branch_name] どこにあるかを行うことができると思います。 [hash]. ファイルを保存します。出口。祈る。そして、巻き戻す必要があります。を実行する必要があるかもしれませんがgit reset --hard、この時点で問題ないはずです。履歴に残しておきたくない場合は、これを使用してスタックから特定のコミットをプルすることもできますが、それによってリポジトリが望ましくない状態になる可能性があります。

于 2010-03-08T02:55:58.307 に答える
1
  1. まず、すべてをコミットしたことを確認します。

  2. 次に、リポジトリを以前の動作状態にリセットします。

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    または使用--hardこれにより、コミットされていないすべてのローカル変更が削除されます!):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    誤ってマージされたコミットの前にあったハッシュを使用してください。

  3. 次の方法で、以前の正しいバージョンの上に再コミットするコミットを確認します。

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. 次の方法で、適切なバージョンのリポジトリの上に適切なコミットを適用します。

    • チェリーピックを使用する(既存のコミットによって導入された変更)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • または、次の方法でコミットの範囲を選択します。

      • それらをマージする前に、まず正しい変更を確認します。

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • それらをマージする前に、まず正しい変更を確認します。

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        ここで、これは、コミットした正しいコミットの範囲です(誤ってコミットされたマージを除く)。

于 2013-01-29T15:09:00.540 に答える
1

マージをコミットした場合:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
于 2016-11-10T15:57:30.533 に答える
1
  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

これは私のために働いた.. !!

于 2019-03-15T05:53:26.793 に答える
0

マージの直後に元に戻す必要があり、マージの試行後に他に何もしていないことに気付いた場合は、次のコマンドを発行できます git reset --hard HEAD@{1}

基本的に、マージ後に他に何もコミットされていない場合、マージshaは指しているため、マージ前の前のポイントになります。HEAD@{0}HEAD@{1}

于 2016-04-26T18:52:23.803 に答える
0

この場合、ブランチを でリセットする必要がありますgit reset --hard <branch_name>。リセットする前に変更を保存したい場合は、必ず新しいブランチとgit checkout <branch_name>.

状態を特定のコミットにリセットすることもできgit reset --hard <commit_id>ます。

変更がプッシュされた場合は、git revert <branch_name>代わりに使用できます。他のシナリオでもgit revert と git checkoutを使用する方法を確認してください。

于 2018-05-29T10:21:05.840 に答える
-14

git-reset コマンドを使用できます。

git-reset - 現在の HEAD を

指定された状態。git リセット [--混合 |

--ソフト | --ハード | --merge] [-q] [] git リセット [-q] []

[--] … git リセット --patch

[] [--] […]

GIT リセット

于 2010-03-05T19:28:19.723 に答える