web-dev-qa-db-ja.com

コミットされたコミットをgitで潰す方法は?

これは複数のコミットを潰すことの良い説明を与えます:

http://git-scm.com/book/en/Git-Branching-Rebasing

しかし、既にプッシュされたコミットに対しては機能しません。ローカルリポジトリとリモートリポジトリの両方で、最近のいくつかのコミットを無効にするにはどうすればよいですか。

編集: 私がgit rebase -i Origin/master~4 masterをするとき、最初のものをpickに保ち、他の3つをsquashに設定し、そして(emacsのc-x c-cで)終了します:

$ git rebase -i Origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i Origin/master~4 master
Interactive rebase already started

2f40はpickコミットです。そして今4つのコミットのどれもgit logに現われません。コミットメッセージを入力できるように、エディタを再起動します。何がおかしいのですか?

457
Loren

スカッシュはローカルでコミットします

git rebase -i Origin/master~4 master

そして押して

git Push Origin +master

--force+の違い

git Push のドキュメントから:

--forceはプッシュされるすべてのrefに適用されるので、Push.defaultmatchingに設定して、またはremote.*.Pushで設定された複数のPush宛先と共に使用すると、リモートブランチより厳密に後ろのローカルrefを含めて上書きできます。プッシュを1つのブランチのみに強制するには、refspecの前にある+をPushに使用します(たとえば、masterブランチにプッシュするにはgit Push Origin +master)。

636

ブランチでは、このようにすることができました(最後の4コミット)。

git checkout my_branch
git reset --soft HEAD~4
git commit
git Push --force Origin my_branch
91
jakob-r

branchname__を処理する&notを処理するmastername__を作成するだけで、多くの問題を回避できます。

git checkout -b mybranch

以下はremotename__コミットがすでにプッシュされた場合、およびremotename__プッシュされたコミットの混合/ localname__のみがコミットされた場合に有効です。

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git Push -u Origin +mybranch

pull request notes もあるかもしれません - /。

20
Stuart Cardall

受け入れられた答えへのマイナーな違いが、私は押しつぶすのが非常に困難であり、そしてついにそれを得ました。

$ git rebase -i HEAD~4
  • 開いた対話型画面で、スカッシュしたいすべてのコミットの上部にある pick squash に置き換えます。
  • esc --> :wqを介してエディターを保存して閉じます

を使用してリモートにプッシュします。

$ git Push Origin branch-name --force
17
BLRBoy

git rebase -i master

あなたはエディタvmを開き、このような何かをmsgsします。

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

ここで私は他のすべてのコミットのpickを "f"(Stands for fixup)に変更しました。

git Push -f Origin feature/feature-branch-name-xyz

これにより、すべてのコミットが1つのコミットに修正され、他のすべてのコミットが削除されます。私はこれをしました、そしてそれは私を助けました。

11
Nupur

GitlabまたはGithubで作業している場合、この方法で問題が発生する可能性があります。上記の方法のいずれかを使用してコミットを破棄します。私の好きなものは:

git rebase -i HEAD~4
or
git rebase -i Origin/master

コミットのためにスカッシュまたはフィックスアップを選択します。この時点で、gitステータスを確認します。メッセージは次のようになります。

    On branch ABC-1916-remote
    Your branch and 'Origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

そして、あなたはそれを引っ張りたいと思うかもしれません。 しないでくださいまたは以前と同じ状況になります。

代わりに、次を使用してオリジンにプッシュします。

git Push Origin +ABC-1916-remote:ABC-1916

+は、1つのブランチにのみプッシュを強制することを許可します。

0
Alex

1つのブランチ上で2つのコミットを潰した場合、そのうちの1つは既にプッシュされていましたが、次のように動作しました。

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git Push --force

デフォルトでは、これは古いコミットに対するコメントとして最新のコミットのコミットメッセージを含みます。

0
lobsterhands

1)git rebase -i HEAD〜4

To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)

2)この時点で、2番目以降のコミットを変更するために、コミットのリストと共にエディターが開き、pickをsquashに置き換えて保存します。

出力:refs/heads/branch-nameのリベースおよび更新に成功しました。

3)git Push Origin refs/head/branch-name --force

output:... remote:remote:branch-nameのマージリクエストを作成するには、remote: http:// xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D = sss remote:にアクセスしてください。 ip:sc/server.git + 84b4b60 ... 5045693ブランチ名 - >ブランチ名(強制更新)

0
terwxqian