我用:

git checkout -b testbranch

我做了20次提交。

现在我想要压缩这20个提交。我是这样做的:

git rebase -i HEAD~20

如果我不知道有多少次提交呢?有没有什么方法可以做到:

git rebase -i all on this branch

当前回答

另一种简单的方法是:在原始分支上进行合并-挤压。该命令不执行“压缩”提交。当你这样做时,你分支的所有提交消息将被收集。

$ 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: ...

其他回答

解决方案- 1

A.把master拖进你的特性分支(确保更新了master)

git pull origin master  

B.软复位至master

git reset --soft master

C.提交更改

git commit -m “commit message"

D.做git推

git push --force  

解决方案- 2

使用git rebase压缩提交

A.

$git rebase -i HEAD~3  (HEAD~<no. of commits you want to squash>)

B.你会得到一个交互式提示,你需要选择顶部提交,并在那些你想要合并/挤压的前面插入挤压或s。

注意:请确保在插入模式下进行更改并保存文件;(VI编辑器中的wq)

C.现在你会得到另一个交互式提示,你需要把#放在你不想要的commit消息前面,或者添加你自己的消息。再次保存文件,您的提交将成功地更改基准。

干杯!

How

你需要得到分支的合并基

git merge-base master your-branch
# 566f8438e0cd0e331ceb49a9cb0920143dfb065c

然后你就可以改基了

git rebase -i 566f8438e0cd0e331ceb49a9cb0920143dfb065c
# then squash/pick/do commit messages

或者只是进行软重置并提交所有内容

git reset --soft 566f8438e0cd0e331ceb49a9cb0920143dfb065c
git add .
git commit -m "The only commit"

自动化

如果你经常这样做,你可以把这些放在你的.bashrc使用自动化。

g-rebase-branch() {
  git branch --show-current | xargs git merge-base master | xargs git rebase -i
}

g-one-commit() {
  local last_commit_message=`git show -s --format=%s`
  git branch --show-current | xargs git merge-base master | xargs git reset --soft
  git add -A
  git commit -m "$last_commit_message"
  git commit --amend
}

然后直接在终端上做这些。

g-one-commit

但如果你合并的是与master不同的分支,那么你可以用“$1”替换master来做到这一点

g-one-commit staging

你可以通过子命令来实现

$ git rebase -i HEAD~$(git rev-list -count HEAD ^master)

这将首先计算从master分离后的提交次数,然后将其还原到确切的长度。

你正在做的事情很容易出错。只做:

git rebase -i master

它会自动将你的分支的提交重置到当前最新的主节点上。

另一种解决方案是将所有提交日志保存到一个文件中

分支> git 日志.log

现在branch.log将拥有自开始以来的所有提交id。向下滚动并进行第一次提交(这在终端中很困难) 使用第一次提交

Git复位-软

所有提交都将被压缩