我用:

git checkout -b testbranch

我做了20次提交。

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

git rebase -i HEAD~20

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

git rebase -i all on this branch

当前回答

如果你使用基于IDE的JetBrains,如IntelliJ Idea和prefare,使用命令行GUI:

进入版本控制窗口(Alt + 9/Command + 9) -“日志”选项卡。 在树中选择创建分支的点 右键点击它->重置当前分支到这里->选择软(!!)(重要的是不要失去你的变化) 按下对话框窗口底部的重置按钮。

就是这样。您未提交所有更改。现在如果你重新提交,它会被压缩

其他回答

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

git rebase -i master

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

Git重置,正如之前在许多回答中提到的,是迄今为止实现你想要的最好和最简单的方法。我在以下工作流程中使用它:

(有关发展分支)

git fetch
git merge origin/master  #so development branch has all current changes from master
git reset origin/master  #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it

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

对于喜欢点击的人的解决方案:

安装源代码树(免费) 检查你的提交是什么样的。很可能你有类似的东西 右键单击父提交。在我们的例子中,它是主分支。

您可以通过单击一个按钮来取消上一个提交。在我们的例子中,我们需要点击2次。您也可以更改提交消息 结果非常棒,我们已经准备好了!

旁注:如果你把你的部分提交推到远程,你必须在挤压后强制推

签出您希望将所有提交压缩为一次提交的分支。我们说它叫feature_branch。

git checkout feature_branch

步骤1:

用你的本地主分支对你的origin/feature_branch进行软重置(根据你的需要,你也可以用origin/main重置)。这将重置feature_branch中所有额外的提交,但不会在本地更改任何文件更改。

git reset --soft main

步骤2:

将git repo目录中的所有更改添加到将要创建的新提交中。并通过信息提交相同的信息。

# Add files for the commit.
git add ...
git commit -m "commit message goes here"