2015-12-04 9 views
7

私はローカルブランチを持っていますが、私たちはプルリクエストと一緒にgit-flowを使用しています。私はPRフィードバックを受け取った後、いくつかのコミットをスカッシュしたいと考えています。私のgitブランチをスカッシュする方法は、リベースせずに同じブランチにコミットしますか?

(PRなどの)すべてのコミットを同じブランチにスカッシュできますか?

私はそれはようなものになるだろうと想像:

git checkout master     # For master 
git pull        # Get all branches up-to-date 
git checkout feature1     # Checkout the branch 
git checkout -b feature1_squash  # Make a copy of the branch 
git branch -D feature1     # Delete original branch 
git checkout master     # (?) Branch off latest master for safety 
git checkout -b feature1    # Make new (empty) original branch 
git merge --squash feature1_squash  # Merge with squash into it 
git push -f feature1     # Push, force will be required 

が、私はよく分かりません。
その多くのステップでは、関数を使用してすべてをまとめて、ブランチ名をパラメータとして渡すだけの良いケースのように思えます。もちろん、それを自動化することは、エラー、例外、エッジケースなどを確実に処理することを意味します。

私は訓練する初心者にはちょっと難しいので、インタラクティブリベースを使いたくありません。私もコミットの数を知る必要はありません、私はこのブランチに存在するすべてのものをやりたいだけです。

+1

私はあなたが望むものを正確に理解していません。それぞれに異なるコミットを持つ複数のブランチを持っていますか?それらをすべて1つのブランチ上の1つのコミットに入れると、開発履歴が失われますか? – houtanb

+1

私は1つのブランチ( 'feature1')にいくつかのコミットがあり、1つのコミットが必要です。 –

答えて

1

私は、あなたが慣習的でないことを示唆していると思うと、rebase -iをスカッシュするよりも新人の方が扱いにくいと思う。

git rebase -i HEAD~Nについては何が難しいですか(Nは縮退のために戻ってくるコミット数です)?リストを読み、必要に応じてコミットを縮小するだけです。 "Rewriting History"ガイドには詳細があり、新しいユーザーにはまったく適していると思います。

あなたは、あなたの研修生が常に練習するデモブランチを作ることができます。デモ用のブランチに5-6をコミットし、インタラクティブなリベースを使用して研修生にコミットを受けさせ、ライブブランチでそれを処理できることを証明するPRを作成します。

+0

ありがとうございます。リベースは私たちの問題を引き起こしています。(あまりにも)長い話。私のステップを関数にパッケージ化できれば、複雑さは隠されます。私たちはデモブランチを行うことができますが、プルリクエストのコメントが入ってきて、私たちは小さな変更を加えて、それを押しつぶしたい場合もあります。 –

+1

私は、複雑さを隠すこと(そしてツールの典型的な使用例を迂回し、同じツールを使用して同じ動作を引き起こす)は、あなたの研修生にとっては有害だと考えています。私は有能なプログラマーとして、彼らが数回rebaseしたら、それは第二の性質になると信じています。 gitosis(https://git-scm.com/book/en/v1/Git-on-the-Server-Gitosis)のようなツールを使用して、さまざまな機能へのアクセスを制御することもできますが、複雑。 いずれにせよ、幸運、私はtheyreがよく学ぶことができることを願っています! – Todd

+0

gitosisを忘れてしまいました、それはもはや維持されていません。 gitoliteはそれを置き換え、維持されます。 –

4

VonCからの回答はほぼあります。あなたが3回コミットしたいと知っていることは難しいです。

代わり

、あなたの場合は、そのブランチに

を(代わりに-mコミットまたはgitのを使用)merge-base

git reset --soft $(git merge-base YOUR_BRANCH WHERE_YOU_BRANCHED_FROM) 
git commit 

を使用して、あなたのメッセージを編集する必要があり、あなたはHEADを使用して、マスターから分岐したと仮定することができますあなたが分枝状の場所を覚えてカント場合のコマンドは

git reset --soft $(git merge-base HEAD origin/master) 
git commit 

(期日のうち、潜在的にあることローカルマスタに起源/マスターを使用)になりますあなたがPRに合併している場所が正しいと思われる場合

+0

さらに、コミットの数を知る必要がないための1つ –