戻す - gitlab マージ 取り消し




まだプッシュされていないGitマージを元に戻す (18)

  1. まず、すべてをコミットしたことを確認します。

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

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    または--hardを使用し--hardコミットされた変更ではなくローカルのものがすべて削除されます )。

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

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

  3. 直前の正しいバージョンの上に再コミットするコミットを次のようにチェックします。

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

    • cherry-pick(いくつかの既存のコミットによって導入された変更)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • またはチェリーピックすることで、コミットの範囲を次のようにします。

      • 最初に、マージする前に正しい変更をチェックしてください:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • 最初に、マージする前に正しい変更をチェックしてください:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

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

私のマスターブランチ内では、 git merge some-other-branchローカルで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このメッセージが表示されgit status

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

私は自分の支部がいくつものコミットによって先に進まないようにしたい。 その点に戻るにはどうしたらいいですか?


2つのコマンドだけを使用して、特定のコミットによってマージを元に戻すか再起動することができます。

  1. git reset --hard commitHash (再起動したいコミットを使うべきです、例えば44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (新しいローカルマスターブランチをorigin / masterに送る)

行こうと頑張ってください!



git reflogどのコミットがマージ前のものかを確認します(git reflogはgit logよりも良いオプションです)。 その後、次の方法でリセットできます。

git reset --hard commit_sha

別の方法もあります

git reset --hard HEAD~1

1コミットを返すでしょう。

変更されたファイルと変更されていないファイル/ unstashedファイルは、変更されていない状態にリセットされることに注意してください 。 変更を隠しておくか、以下の--mergeオプションを参照してください。

@Velmontが彼の答えで以下のように提案したように、

git reset --hard ORIG_HEAD

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

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

- マージ

索引をリセットし、<commit>とHEADの間で異なる作業ツリー内のファイルを更新しますが、索引と作業ツリーの間で異なるもの(つまり、変更が加えられていないもの)を保持します。


あなたのローカルマスターが起点/マスターより先行していなかったとすれば、あなたはできるはずです

git reset --hard origin/master

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


この場合、ブランチをgit reset --hard <branch_name>したいでしょう。 変更を保存する前に変更を保存するには、新しいブランチとgit checkout <branch_name>必ず作成してgit checkout <branch_name>

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

変更が押された場合は、代わりにgit revert <branch_name>使うことができます。 他のシナリオでもgit revertとgit checkoutの使い方をチェックしてください。


さて、他の人が私にくれた答えは近いが、うまくいかなかった。 ここに私がしたことがあります。

これを行う...

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コマンドを何度か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

ちょっと見てみると、私はここで説明している分岐モデルにほぼ従っていますhttp://nvie.com/posts/a-successful-git-branching-model/ : http://nvie.com/posts/a-successful-git-branching-model/などがマージされています。 --no-ff (早送りなし)通常。

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

ですから、コミット全体を元に戻すには、ちょうど1つのgit reset --hard HEAD^必要でしたし、マージ全体を元に戻しました。 マージは早送りではなかったので、マージはブロックであり、一歩前進は「マージされない分岐」です。


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

git merge --abort

man git mergeから:

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


コマンドラインソリューションが必要な場合は、私はMBOの答えに行くことをお勧めします。

初心者の方は、グラフィカルなアプローチが好きかもしれません。

  1. gitkキックオフする(コマンドラインから、またはファイルブラウザを右クリックしてください)
  2. マージコミットを簡単に見つけることができます。最初の2つのノードを持つノード
  3. 最初の/左の親(マージの前にあなたの現在のブランチにあるもの、通常は赤です)へのリンクに従います。
  4. 選択したコミットで、[ここにブランチをリセット]を右クリックし、そこでハードリセットを選択します

マージの直後に元に戻す必要があり、マージ後に何もしなかった場合は、次のコマンドを実行するだけです: git reset --hard [email protected]{1}

基本的には、マージ後に他に何もコミットされていないので、 [email protected]{1}がマージ前の前のポイントになる場合、マージsha[email protected]{0}指しています。


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

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard

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

具体的には、

$ git reflog
$ git reset --hard [email protected]{0}

最もシンプルなチャンスの中で最もシンプルで、

あなたのローカル支店(ローカルではなくリモート)を取り出し、もう一度引っ張ってください。 こうすることで、マスターブランチ上の変更を元に戻すことができます。変更を加えることで誰もが影響を受けます。 それを始める。


最も単純な答えは、odinhoによって与えられたものです - Velmont

最初にgit reset --merge ORIG_HEAD

変更がプッシュされた後にリセットしたい場合は、これを行います(これは、git resetマージ問題の最初の投稿です)

git push origin HEAD --force

これは、プル後に再びマージされた変更を元に戻さないようにリセットされます。


最近、 git reflogを使ってこれを手伝ってきました。 これは主にマージが起こった場合にのみ機能し、それはあなたのマシン上にあります。

git reflogは次のようなものを返します:

fbb0c0f [email protected]{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 [email protected]{1}: checkout: moving from master to my-branch
e3753a7 [email protected]{2}: rebase finished: returning to refs/heads/master
e3753a7 [email protected]{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 [email protected]{4}: reset: moving to HEAD^
8400a0f [email protected]{5}: rebase: aborting

最初の行は、マージが発生したことを示します。 2行目はマージ前の時刻です。 私は単純にgit reset --hard 43b6032を使用して、このブランチをマージ前に追跡し、キャリーオンするようにします。


私はgit rebase -i [hash] [branch_name]を実行することができると思いますgit rebase -i [hash] [branch_name]ここで、 [hash]は、あなたが巻き戻したいものとは逆のハッシュを識別するハッシュです(あるいは多くのコミットをしたい)あなたがもう必要としないエディタのコミット。 ファイルを保存します。 出口。 祈る。 それは巻き戻されるべきです。 git reset --hardを行う必要があるかもしれませんが、 git reset --hardでは良いはずです。 これを使用して、特定のコミットを履歴から削除したくない場合はスタックから取り出すこともできますが、リポジトリはおそらく望ましくない状態になる可能性があります。


私はコミットIDを調べることを含まない単一のコマンドでこの問題を解決することができました。

git reset --hard remotes/origin/HEAD

受け入れられた答えは私のためには機能しませんでしたが、このコマンドは私が探していた結果を達成しました。





git-merge