私はからブランチを新しくmaster
します:
git checkout -b testbranch
私はそれに20回コミットします。
今、私はそれらの20のコミットを押しつぶしたいと思います。私はそれをします:
git rebase -i HEAD~20
コミット数がわからない場合はどうなりますか?次のようなことをする方法はありますか?
git rebase -i all on this branch
私はからブランチを新しくmaster
します:
git checkout -b testbranch
私はそれに20回コミットします。
今、私はそれらの20のコミットを押しつぶしたいと思います。私はそれをします:
git rebase -i HEAD~20
コミット数がわからない場合はどうなりますか?次のようなことをする方法はありますか?
git rebase -i all on this branch
回答:
すべてのコミットを押しつぶすもう1つの方法は、インデックスをマスターにリセットすることです。
git checkout yourBranch
git reset $(git merge-base master yourBranch)
git add -A
git commit -m "one commit on yourBranch"
これは、「yourBranch」がどのブランチからのものかを知っていることを意味するため、完全ではありません。
注:Gitでoriginブランチを見つけるのは簡単ではありません(ここで見られるように、多くの場合、視覚的な方法が最も簡単です)。
編集:使用する必要があります git push --force
リセットについては、
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
[それ]は、現在いるブランチを自動的に使用します。
あなたはそれを使用する場合と、コマンドは支店名に依存しないよう、あなたはまた、別名を使用することができます。
YourBranch
現在の場所をコミットするためにチェックアウトする方が良いです。これを行ってYourBranch
も問題はありませんreset
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
するには、現在使用しているブランチを自動的に使用するようにできます。コマンドをブランチ名に依存しないため、これを使用する場合はエイリアスも使用できます。
git push --force
場合(およびそのブランチで作業している複数の人がいる場合は同僚に警告します)
すべてのコミットを1つのコミットに圧縮するブランチをチェックアウトします。その呼び出されたとしましょう、feature_branch
。
git checkout feature_branch
origin/feature_branch
ローカルmaster
ブランチでをソフトリセットします(必要に応じて、オリジン/マスターでもリセットできます)。これにより、のすべての追加コミットがリセットされますfeature_branch
が、ファイルの変更はローカルで変更されません。
git reset --soft master
作成する新しいコミットに、git repoディレクトリのすべての変更を追加します。同じことをメッセージでコミットします。
git add -A && git commit -m "commit message goes here"
-f
フラグなしでそれをリモートブランチにプッシュできます。
あなたがやっていることはかなりエラーが発生しやすいです。ただやる:
git rebase -i master
これにより、ブランチのコミットのみが現在の最新のマスターに自動的にリベースされます。
commit -am "the whole thing!"
reset origin/master
マスターで直接コミットするのと同じ方法なので、メソッドは本当に悪いと思います-「ブランチのマージ」履歴がなく、プルリクエストオプションがありません。@WaZaAの答えは、私が思う通常のgitワークフローにはるかに一致している
これを行う別の簡単な方法:originブランチに行き、を実行しmerge --squash
ます。このコマンドは「押しつぶされた」コミットを行いません。これを行うと、yourBranchのすべてのコミットメッセージが収集されます。
$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
> [status 5007e77] Squashed commit of the following: ...
マスターから分岐していると仮定すると、yourBranch
常にリセットステップに入る必要はありません。
git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"
説明:
git rev-list --count HEAD ^master
マスターf.exから機能ブランチを作成してからのコミットをカウントします。20。git reset --soft HEAD~20
最後の20回のコミットをソフトリセットします。これにより、変更がファイルに残りますが、コミットは削除されます。使用法:
私の.bash_profileにgisquash
、1つのコマンドでこれを行うためのエイリアスを追加しました。
# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'
リセットしてコミットした後、を実行する必要がありますgit push --force
。
ヒント:
Gitlab> = 11.0を使用している場合、ブランチをマージするときにスカッシュオプションがあるため、これを行う必要はありません 。
Stackoverflowのいくつかの質問とスカッシュに関する回答を読んだことに基づいて、これはブランチのすべてのコミットをスカッシュするための良い1つのライナーだと思います:
git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master
これは、マスターがベースブランチであると想定しています。
クリックを好む人のためのソリューション:
sourcetreeをインストールする(無料)
親コミットを右クリックします。私たちの場合、それはマスターブランチです。
補足:部分的なコミットをリモートにプッシュする場合、スカッシュ後に強制プッシュを使用する必要があります
以前の多くの回答で述べたように、Gitリセットは、あなたが望むものを達成するための最善かつ最も簡単な方法です。次のワークフローで使用します。
(開発ブランチ上)
git fetch
git merge origin/master #so development branch has all current changes from master
git reset origin/master #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it
このgitリセット、ハード、ソフト、およびここで説明されている他のすべては、手順を正しく実行し、ある種のジニーを実行すれば、おそらく機能しています(私にとってはうまくいきませんでした)。
あなたが平均的なジョーのsmoであるなら、これを試してください:
git merge --squashの使用方法?
私の人生を救った、そしてスカッシュに行くつもりだ、私はそれを知ってからこれを4回使ってきた。シンプルでクリーン、基本的には1つのコマンド。簡単
に言うと、ブランチを使用している場合は、「my_new_feature」を開発オフにして、プルリクエストに35回(またはいくつ)コミットして、1にしたい場合があります
。A.ブランチが最新であることを確認してください。 「my_new_feature」との競合を開発、最新化し、マージして解決します
(このステップは、とにかくいつでもできるだけ早く実行する必要があります)
B.最新の開発を取得し、「my_new_feature_squashed」という新しいブランチに分岐します。
C. 魔法はここにあります。
作業を "my_new_feature"から "my_new_feature_squashed"に変更したい場合は、次のようにしてください
(開発から作成した新しいブランチで):
git merge --squash my_new_feature
これで、すべての変更が新しいブランチに反映されるので、自由にテストしてから、そのブランチの1つのコミット、プッシュ、新しいPRを実行し、翌日繰り返されるのを待ちます。
コーディングが好きではないですか?:)
このタスクのために特別に作成したツールを使用できます。
https://github.com/sheerun/git-squash
基本的にあなたは電話する必要がありgit squash master
、あなたは終わった
git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2d
commitnumberが変更されない