use*_*850 241 git version-control
我创建了新的分支master:
git checkout -b testbranch
我做了20次提交.
现在我要压缩那20个提交.我这样做:
git rebase -i HEAD~20
如果我不知道有多少提交怎么办?有什么方法可以做以下事情:
git rebase -i all on this branch
Von*_*onC 295
压缩所有提交的另一种方法是将索引重置为master:
git checkout yourBranch
git reset $(git merge-base master yourBranch)
git add -A
git commit -m "one commit on yourBranch"
Run Code Online (Sandbox Code Playgroud)
这并不完美,因为它意味着你知道"yourBranch"来自哪个分支.
注意:使用Git找到原始分支并不容易/可能(视觉方式通常是最简单的,如此处所示).
编辑:你需要使用 git push --force
Karlotcha Hoa 在评论中补充道:
对于重置,你可以做到
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
Run Code Online (Sandbox Code Playgroud)
[那]自动使用您当前所在的分支.
如果您使用它,您也可以使用别名,因为该命令不依赖于分支名称.
Eev*_*vee 94
你正在做的事情很容易出错.做就是了:
git rebase -i master
Run Code Online (Sandbox Code Playgroud)
这将自动仅将您的分支提交修改为当前最新的主数据.
WaZ*_*ZaA 70
另一种简单的方法:进入原点分支并执行merge --squash.此命令不执行"squased"提交.当你这样做时,将收集yourBranch的所有提交消息.
$ 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: ...
Run Code Online (Sandbox Code Playgroud)
小智 68
签出要将所有提交压缩到一个提交的分支.让我们说它,feature_branch.
git checkout feature_branch
origin/feature_branch使用本地master分支对您进行软复位(根据您的需要,您也可以使用origin/master重置).这将重置您的所有额外提交feature_branch,但不会在本地更改任何文件更改.
git reset --soft master
将git repo目录中的所有更改添加到将要创建的新提交中.并使用消息提交相同的内容.
git add -A && git commit -m "commit message goes here"
Alo*_*thi 37
解决方案 - 1
\nA. 将 master 拉入您的功能分支(确保更新您的 Master)
\ngit pull origin master \nRun Code Online (Sandbox Code Playgroud)\nB. 软复位到主机
\ngit reset --soft master\nRun Code Online (Sandbox Code Playgroud)\nC. 提交您的更改
\ngit commit -m \xe2\x80\x9ccommit message"\nRun Code Online (Sandbox Code Playgroud)\nD. 进行 git 推送
\ngit push --force \nRun Code Online (Sandbox Code Playgroud)\n解决方案 - 2
\n使用 git rebase 压缩提交
\nA。
\n$git rebase -i HEAD~3 (HEAD~<no. of commits you want to squash>)\nRun Code Online (Sandbox Code Playgroud)\nB.您将收到一个交互式提示,您需要选择顶部提交并在要合并/压缩的提交前面插入“squash”或“s” 。
\n注意:确保在插入模式下进行更改并保存文件;(VI 编辑器中的 wq)
\nC.现在您将看到另一个交互式提示,您需要将 # 放在您不想要的提交消息前面,或者添加您自己的消息。再次保存文件,您的提交将成功变基。
\n干杯!
\nmle*_*les 26
假设您是从主服务器分支的,则无需yourBranch始终进入重置步骤:
git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"
Run Code Online (Sandbox Code Playgroud)
说明:
git rev-list --count HEAD ^master自从你从master,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)'
Run Code Online (Sandbox Code Playgroud)
重置和提交后你需要做一个git push --force.
提示:
如果您正在使用Gitlab> = 11.0,则不再需要这样做,因为它在合并分支时具有 压缩选项.

Cav*_*man 19
您需要获取分支的合并基础
git merge-base master your-branch
# 566f8438e0cd0e331ceb49a9cb0920143dfb065c
Run Code Online (Sandbox Code Playgroud)
然后你可以重新设置它
git rebase -i 566f8438e0cd0e331ceb49a9cb0920143dfb065c
# then squash/pick/do commit messages
Run Code Online (Sandbox Code Playgroud)
或者只是进行软重置并提交所有内容
git reset --soft 566f8438e0cd0e331ceb49a9cb0920143dfb065c
git add .
git commit -m "The only commit"
Run Code Online (Sandbox Code Playgroud)
如果您经常这样做,您可以通过将它们放入您的.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
}
Run Code Online (Sandbox Code Playgroud)
然后直接在终端中执行这些操作。
g-one-commit
Run Code Online (Sandbox Code Playgroud)
但是如果您要合并与 master 不同的分支,那么您可以替换master为"$1"来执行此操作
g-one-commit staging
Run Code Online (Sandbox Code Playgroud)
see*_*ebi 17
由于我在这里提出的解决方案遇到了一些麻烦,我想分享一个非常简单的解决方案(无论如何它确实有效):
git merge origin/master && git reset --soft origin/master
Run Code Online (Sandbox Code Playgroud)
前面的合并 cmd 确保在提交时不会发生来自 master 的最近更改(倒置)!之后,只需提交更改并执行git push -f
Tra*_*der 14
基于阅读几个关于压缩的Stackoverflow问题和答案,我认为这是一个很好的一个班轮来压缩分支上的所有提交:
git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master
Run Code Online (Sandbox Code Playgroud)
这是假设master是基本分支.
Ric*_*aca 12
要稍微完善穴居人的答案git reset --soft <commit>,请使用. 从文档来看,这个命令:
根本不触及索引文件或工作树(但将头重置为 <commit>,就像所有模式一样)。
git status正如所说的那样,这将使所有更改的文件“要提交的更改” 。
换句话说,它会撤消您迄今为止的所有提交<commit>。但它不会更改工作目录。您最终会得到所有未上演且未提交的更改。就好像那些干预提交从未发生过。
例子:
# on master
git checkout -b testbranch
# make many commits
git reset --soft master
git add .
git commit -m 'The only commit.'
Run Code Online (Sandbox Code Playgroud)
此时,您仍在testbranch,它有一个提交。像平常一样合并到 master 中。
Caveman 答案的第一部分(git rebase -i)并没有在我手中压制提交。
Dom*_*omi 12
在之前的回答中,我没有看到任何关于如何处理“杂乱分支”和“自我冲突”的信息。master例如,我经常最终在我的功能分支(称为)上进行提交feature,这会导致自身冲突。我发现这是最烦人的问题之一。
我发现Felix Rieseberg 的解决方案是最好的。这是我对他的建议的简短转录:
tmpoff分支master
git checkout master && git pull && git checkout -b tmpfeature更改合并到tmp(没有任何提交,仅暂存文件更改)。
git merge --squash $featuretmp现在是master+ 1 次提交(包含所有更改)。
git commit ...feature和git reset --hard tmp(feature原来的内容没有了,现在基本是了tmp,只是改名了)
git checkout $feature && git reset --hard tmporigin/feature(然后清理)
git push -f && git branch -D tmpFelix 指出,这将产生尽可能干净的合并,而不会因 和 之间混乱/复杂的关系而产生任何奇怪的自我master冲突feature:
您可能会遇到少量不可避免的合并冲突。请相信这是尽可能少的冲突数量,因为您跳过了最初创建的许多中间提交。
如果您使用基于JetBrains的 IDE,如IntelliJ Idea并在命令行上使用 GUI:
就是这样。您未提交所有更改。现在,如果您进行新的提交,它将被压缩
小智 8
您可以使用子命令来完成此操作,即
$ git rebase -i HEAD~$(git rev-list --count HEAD ^master)
这将首先计算自从您偏离 master 以来的提交,然后重新调整回确切的长度。
假设您位于功能分支上:
git log <source_branch>..<feature_branch> --pretty=format:%h
git reset --soft <base_commit_hash>
git commit --amend --no-edit
Run Code Online (Sandbox Code Playgroud)
现在,在这个阶段,在您的本地,您有 1 次提交,其中包括所有先前提交中完成的更改。
回顾一下,需要强推一下。强制推送后,所有更改将合并到一次提交中,并且您的分支将只有 1 次提交。
git push --force
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
132306 次 |
| 最近记录: |