141

さまざまなコミットを潰そうとしています-HEADからHEAD〜3。これを行う簡単な方法はありますか、それともrebase --interactiveを使用する必要がありますか?

4

8 に答える 8

167

作業ツリーがクリーンであることを確認してから、

git reset --soft HEAD~3
git commit -m 'new commit message'
于 2011-09-01T19:46:25.447 に答える
37

私は個人的にwilhelmtellのソリューションが好きです:

git reset --soft HEAD~3
git commit -m 'new commit message'

ただし、これを実行できるように、エラーチェックを使用してエイリアスを作成しました。

g.squash 3 'my commit message'

実際にスクリプトを実行するエイリアスを設定して、(a)スクリプトをコード化し、(b)エラーチェックでより複雑な作業を行うことをお勧めします。以下は、押しつぶす作業を行うスクリプトです。これをHOMEパスのscriptsフォルダーに入れます。

押しつぶすためのスクリプト(squash.sh)

#!/bin/bash
#

#get number of commits to squash
squashCount=$1

#get the commit message
shift
commitMsg=$@

#regular expression to verify that squash number is an integer
regex='^[0-9]+$'

echo "---------------------------------"
echo "Will squash $squashCount commits"
echo "Commit message will be '$commitMsg'"

echo "...validating input"
if ! [[ $squashCount =~ $regex ]]
then
    echo "Squash count must be an integer."
elif [ -z "$commitMsg" ]
then
    echo "Invalid commit message.  Make sure string is not empty"
else
    echo "...input looks good"
    echo "...proceeding to squash"
    git reset --soft HEAD~$squashCount
    git commit -m "$commitMsg"
    echo "...done"
fi

echo
exit 0

次に、そのsquash.shスクリプトをエイリアスに接続するために、.zprofileに次を追加します。

export PATH="$PATH:$HOME/scripts" # Add scripts folder to PATH
...
alias g.squash='function _gSquash(){ sh squash.sh $1 $2; };_gSquash'
...

注:エイリアスは任意に作成できます。私は私のgitショートカットをたくさん持っていますg.<myCommand>

于 2014-06-03T14:58:04.013 に答える
23

wilhelmtellによる回答に追加するには、次のコミットにソフトリセットしてHEAD~2から修正するのが便利だと思いますHEAD~3

git reset --soft HEAD~2
git commit --all --amend --no-edit    

これにより、すべてのコミットがコミットにマージされ、HEAD~3そのコミットメッセージが使用されます。必ずきれいな作業ツリーから始めてください。

于 2017-08-20T10:20:45.700 に答える
10

私が使用した:

EDITOR="sed -i '2,/^$/s/^pick\b/s/'" git rebase -i <ref>

かなりうまくいきました。「pick」で始まる行を含むコミットログを作成しようとしないでください:)

于 2013-09-20T10:05:37.567 に答える
3

次のコマンドを使用して、最後のコミット内の最後の4つのコミットを押しつぶします。

git squash 4

エイリアスを使用して:

squash = !"f() { NL=$1; GIT_EDITOR=\"sed -i '2,$NL s/pick/squash/;/# This is the 2nd commit message:/,$ {d}'\"; git rebase -i HEAD~$NL; }; f"
sq = !git squash $1
sqpsf = !git squash $1 && git psf 

https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfigから

于 2015-03-01T02:13:09.610 に答える
2

これが最後の2つのコミットを潰すための1つのライナーです。この例では、最後から2番目のコミットのメッセージが保持されます。必要に応じてメッセージを変更できます。

git commit -am "$(git log -1 --skip=1 --pretty=%B | xargs && git reset --soft HEAD~2)"

このコマンドのエイリアスを作成し、代わりにエイリアスを使用する場合、このコマンドは非常に便利です。

于 2017-06-28T12:26:08.170 に答える
1

ブランチがマスターからフォークされてからすべてを押しつぶすには:

git reset --soft $(git merge-base --fork-point master) \
  && git commit --verbose --reedit-message=HEAD --reset-author
于 2018-02-12T19:56:49.410 に答える
-1

あなたはかなり近づくことができます

git rebase --onto HEAD〜4 HEAD〜master

これは、あなたが線形の歴史を持つマスターにいることを前提としています。中間コミットを破棄するため、スカッシュではありません。コミットメッセージを変更するには、新しいHEADを修正する必要があります。

于 2011-09-01T19:54:47.257 に答える