628

を使用git rebase --interactive <commit>すると、任意の数のコミットを 1 つのコミットにまとめることができます。

コミットを最初のコミットに押しつぶしたくない場合を除き、これで問題ありません。それは不可能に思えます。

それを達成する方法はありますか?


適度に関連する:

関連する質問で、私は最初のコミットに対して押しつぶす必要がある別のアプローチを考え出すことができました。

興味がある場合: git: 最初にコミットを挿入し、他のすべてをシフトする方法は?

4

9 に答える 9

31

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
于 2010-04-18T13:05:52.017 に答える
29

すべてのコミットを 1 つの最初のコミットにまとめたい場合は、リポジトリをリセットして最初のコミットを修正します。

git reset hash-of-first-commit
git add -A
git commit --amend

Git リセットは作業ツリーをそのまま残すため、すべてがそのまま残ります。git add コマンドを使用してファイルを追加し、最初のコミットをこれらの変更で修正します。ただし、 rebase -i と比較すると、git コメントをマージする機能が失われます。

于 2014-05-12T08:57:43.590 に答える
24

価値のあることとして、リポジトリ内の唯一のものは空の .gitignore である「操作なし」の最初のコミットを常に作成することで、この問題を回避します。

https://github.com/DarwinAwardWinner/git-custom-commands/blob/master/bin/git-myinit

そうすれば、最初のコミットを台無しにする理由は決してありません。

于 2011-10-07T20:30:37.127 に答える
5

これにより、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 でも機能します。

于 2012-03-16T10:14:38.577 に答える
3

そのために git filter-branch を使用できます。例えば

git filter-branch --parent-filter \
'if test $GIT_COMMIT != <sha1ofB>; then cat; fi'

これにより、AB-C は A のコミット ログを破棄します。

于 2011-01-17T18:22:12.993 に答える
-1

rebase interactive を使用して、リモートにプッシュされる前に最後の 2 つのコミットを変更できます。

git rebase HEAD^^ -i
于 2011-12-27T18:48:07.357 に答える
-6

これを行う簡単な方法があります。あなたがmasterブランチにいるとしましょう

すべてのコミット履歴を削除する新しい孤立したブランチを作成します。

$ git checkout --orphan new_branch

最初のコミット メッセージを追加します。

$ git commit -a

マージされていない古いマスター ブランチを削除します。

$ git branch -D master

現在のブランチの名前を次のように変更new_branchmasterます。

$ git branch -m master
于 2013-10-25T21:15:12.863 に答える