719

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

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

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

私がそうするときgit rebase -i origin/master~4 master、最初のものをとして保持しpick、他の3つをとして設定しsquash、そして終了します(emacsのcx ccを介して)、私は次のようになります:

$ 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。コミットメッセージを入力できるように、エディターが再起動されることを期待していました。私は何が間違っているのですか?

4

10 に答える 10

978

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

git rebase -i origin/master~4 master

その後、強制的にプッシュします

git push origin +master

--forceとの違い+

のドキュメントからgit push

--forceプッシュされるすべての参照に適用されることに注意してください。したがって、push.default設定された、matchingまたはで構成された複数のプッシュ先で使用するとremote.*.push、現在のブランチ以外の参照(リモートの対応物の背後にあるローカル参照を含む)が上書きされる可能性があります。1つのブランチのみにプッシュを強制するに+ は、refspecの前にあるを使用してプッシュします(たとえばgit push origin +master、ブランチにプッシュを強制しmasterます)。

于 2011-04-14T18:43:54.973 に答える
210

ブランチでは、このように行うことができました(最後の4つのコミットについて)

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
于 2015-09-16T11:47:14.477 に答える
84

受け入れられた答えとのわずかな違いですが、私は押しつぶすのに多くの困難を抱えていて、最終的にそれを手に入れました。

$ git rebase -i HEAD~4
  • 開いたインタラクティブ画面で、スカッシュ したいすべてのコミットの上部にあるピックスカッシュに置き換えます。
  • エディターを保存して閉じます

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

$ git push origin branch-name --force
于 2017-12-22T05:08:43.313 に答える
32

branch作業するだけで作業しないことで、多くの問題を回避できますmaster

git checkout -b mybranch

以下は、remoteすでにプッシュされたコミットとプッシュされたコミットの混合remote/localコミットのみに対して機能します。

# 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

役立つかもしれないプルリクエストノートもいくつかあります。

于 2016-09-05T16:45:50.027 に答える
31

git rebase -i master

エディターvmを開き、次のようなメッセージを送信します

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

ここで、他のすべてのコミットの選択を「f」(修正の略)に変更しました。

git push -f origin feature/feature-branch-name-xyz

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

于 2017-09-26T10:18:49.180 に答える
10

1) git rebase -i HEAD~4

詳細に説明すると、現在のブランチで機能します。HEAD〜4は、最新の4つのコミットを潰すことを意味します。インタラクティブモード(-i)

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

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

3) git push origin refs/heads/branch-name --force

出力:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)
于 2019-01-07T09:51:58.757 に答える
5

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つのブランチにのみ強制的にプッシュできます。

于 2019-08-13T13:23:04.487 に答える
4

1つのブランチで2つのコミット(そのうちの1つはすでにプッシュされています)を潰すために、次のことが機能しました。

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

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

于 2018-10-23T19:41:48.590 に答える
1

リモートでのSqushの変更

  • まず、ローカルマスターがリモートと同等であることを確認します
  • 次に、ローカル機能ブランチをマスターと同等になるようにリセットします。git reset --soft master
  • 次に、すべてのurの変更と変更(マスターにリセットしたローカル機能ブランチで行ったもの)をステージング領域に追加します:gitadd。
  • 次に、これらの変更をコミットします。git commit-m"これが最後のコミットメッセージです"
  • 次に、リモートブランチにプッシュを強制します。gitpush RemoteBranch --force
于 2021-10-28T12:50:03.520 に答える
1

私の場合、要件は、すべての機能ブランチのコミットを1つにまとめて、クリーンなコミット履歴を作成することでした。これを行うためにGitHubUIを利用しました。

問題:

  • 機能ブランチ(例:featureBranch)はマスターから作成されました(1か月前)。
  • featureBranchへのすべての変更をコミットしました(最大12コミット、1か月の作業)。そして定期的にリモートにプッシュされています。

要件:

  • マスターで機能ブランチを更新し、featureBranchで単一のコミットを行うには

続く手順:

  • GitHub UIのマスターから新しいブランチ(例:featureBranchLatest)を作成します。
  • featureBranchからfeatureBranchLatestへのPRを作成します。
  • 競合がある場合は解決します。PRをGitHubUIのスカッシュコミットオプションとマージします。(よりクリーンなメッセージになるようにコミットメッセージを変更します)。

これで、featureBranchLatestには、マスターからの最新の変更とともに、1回のコミットで必要なすべての変更の1回のコミットが含まれます。参照する必要がない場合は、古いブランチfeatureBranchを削除します。

于 2021-12-17T08:59:15.383 に答える