我用:
git checkout -b testbranch
我做了20次提交。
现在我想要压缩这20个提交。我是这样做的:
git rebase -i HEAD~20
如果我不知道有多少次提交呢?有没有什么方法可以做到:
git rebase -i all on this branch
我用:
git checkout -b testbranch
我做了20次提交。
现在我想要压缩这20个提交。我是这样做的:
git rebase -i HEAD~20
如果我不知道有多少次提交呢?有没有什么方法可以做到:
git rebase -i all on this branch
当前回答
假设你在特征分支上:
在特性分支中找到第一个提交。如果你正在使用gitlab或github,你可以直接在分支中查看它,并从那里复制散列,或者你可以使用以下命令:
Git日志<source_branch>..< feature_branch >——漂亮=格式:% h
执行以下命令:
git reset --soft <base_commit_hash>
git commit --amend --no-edit
现在在这个阶段,在您的本地,您有一个提交,其中包括在所有以前的提交中所做的更改。
回顾它,你需要用力推它。在强制推送之后,所有的更改都将合并到一个提交中,而您的分支将只有1个提交。
在特征分支中强制推送
git push --force
其他回答
如果你使用基于IDE的JetBrains,如IntelliJ Idea和prefare,使用命令行GUI:
进入版本控制窗口(Alt + 9/Command + 9) -“日志”选项卡。 在树中选择创建分支的点 右键点击它->重置当前分支到这里->选择软(!!)(重要的是不要失去你的变化) 按下对话框窗口底部的重置按钮。
就是这样。您未提交所有更改。现在如果你重新提交,它会被压缩
假设你从master分支,你不需要一直输入你的branch到重置步骤:
git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"
解释:
git revlist——count HEAD ^master自master创建feature分支以来的提交次数,f.ex。20. git reset——soft HEAD~20将对最近20次提交进行软重置。这将把更改保留在文件中,但删除提交。
用法:
在我的.bash_profile中,我为gisquash添加了一个别名,用一个命令就可以做到这一点:
# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'
在重置和提交后,你需要做一个git push -force。
提示:
如果你正在使用Gitlab >= 11.0,你就不需要再这样做了,因为它在合并分支时有一个压缩选项。
对于喜欢点击的人的解决方案:
安装源代码树(免费) 检查你的提交是什么样的。很可能你有类似的东西 右键单击父提交。在我们的例子中,它是主分支。
您可以通过单击一个按钮来取消上一个提交。在我们的例子中,我们需要点击2次。您也可以更改提交消息 结果非常棒,我们已经准备好了!
旁注:如果你把你的部分提交推到远程,你必须在挤压后强制推
git checkout -b temp
git checkout yourbranch
git fetch
git reset --hard origin/master
git merge --squash temp
git commit -m "new message"
最简单的方法。
这将创建一个新的分支,然后将你的分支重置为基础分支,然后在将临时分支合并回我们的分支之前,我们压缩更改并创建一个新的提交
为了完善一下Caveman的回答,使用git reset——soft <commit>。从文档中,这个命令:
根本不触及索引文件或工作树(但将头部重置为<commit>,就像所有模式一样)。这将使所有更改过的文件都变成“要提交的更改”,就像git状态所显示的那样。
换句话说,它将撤销到<commit>之前的所有提交。但是它不会改变工作目录。您最终会得到所有的更改,这些更改都是未分期和未提交的。就好像那些介入的提交从未发生过一样。
例子:
# on master
git checkout -b testbranch
# make many commits
git reset --soft master
git add .
git commit -m 'The only commit.'
此时,您仍然在testbranch上,它只有一次提交。像往常一样合并到master中。
在我的手中,Caveman回答的第一部分(git rebase -i)并没有压缩提交。