を使用git rebase --interactive <commit>すると、任意の数のコミットを 1 つのコミットにまとめることができます。
コミットを最初のコミットに押しつぶしたくない場合を除き、これで問題ありません。それは不可能に思えます。
それを達成する方法はありますか?
適度に関連する:
関連する質問で、私は最初のコミットに対して押しつぶす必要がある別のアプローチを考え出すことができました。
興味がある場合: git: 最初にコミットを挿入し、他のすべてをシフトする方法は?
を使用git rebase --interactive <commit>すると、任意の数のコミットを 1 つのコミットにまとめることができます。
コミットを最初のコミットに押しつぶしたくない場合を除き、これで問題ありません。それは不可能に思えます。
それを達成する方法はありますか?
関連する質問で、私は最初のコミットに対して押しつぶす必要がある別のアプローチを考え出すことができました。
興味がある場合: git: 最初にコミットを挿入し、他のすべてをシフトする方法は?
VonC のスクリプトを作り直して、すべてを自動的に実行し、何も要求しないようにしました。2 つのコミット SHA1 を指定すると、それらの間のすべてが「押しつぶされた履歴」という名前の 1 つのコミットに押しつぶされます。
#!/bin/sh
# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout $2
# reset the branch pointer to the initial commit (= $1),
# but leaving the index and working tree intact.
git reset --soft $1
# amend the initial tree using the tree from $2
git commit --amend -m "squashed history"
# remember the new commit sha1
TARGET=`git rev-list HEAD --max-count=1`
# go back to the original branch (assume master for this example)
git checkout master
# Replay all the commits after $2 onto the new initial commit
git rebase --onto $TARGET $2
すべてのコミットを 1 つの最初のコミットにまとめたい場合は、リポジトリをリセットして最初のコミットを修正します。
git reset hash-of-first-commit
git add -A
git commit --amend
Git リセットは作業ツリーをそのまま残すため、すべてがそのまま残ります。git add コマンドを使用してファイルを追加し、最初のコミットをこれらの変更で修正します。ただし、 rebase -i と比較すると、git コメントをマージする機能が失われます。
価値のあることとして、リポジトリ内の唯一のものは空の .gitignore である「操作なし」の最初のコミットを常に作成することで、この問題を回避します。
https://github.com/DarwinAwardWinner/git-custom-commands/blob/master/bin/git-myinit
そうすれば、最初のコミットを台無しにする理由は決してありません。
これにより、2 番目のコミットが最初のコミットに押しつぶされます。
A-B-C-... -> AB-C-...
git filter-branch --commit-filter '
if [ "$GIT_COMMIT" = <sha1ofA> ];
then
skip_commit "$@";
else
git commit-tree "$@";
fi
' HEAD
AB のコミット メッセージは B から取得されます (ただし、A から取得することをお勧めします)。
Uwe Kleine-König の回答と同じ効果がありますが、頭文字以外の A でも機能します。
そのために git filter-branch を使用できます。例えば
git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'
これにより、AB-C は A のコミット ログを破棄します。
rebase interactive を使用して、リモートにプッシュされる前に最後の 2 つのコミットを変更できます。
git rebase HEAD^^ -i
これを行う簡単な方法があります。あなたがmasterブランチにいるとしましょう
すべてのコミット履歴を削除する新しい孤立したブランチを作成します。
$ git checkout --orphan new_branch
最初のコミット メッセージを追加します。
$ git commit -a
マージされていない古いマスター ブランチを削除します。
$ git branch -D master
現在のブランチの名前を次のように変更new_branchしmasterます。
$ git branch -m master