Chr*_*sen 3505
没有git rebase
或你可以相当容易地做到这一点git merge --squash
.在这个例子中,我们将压缩最后3次提交.
如果要从头开始编写新的提交消息,这就足够了:
git reset --soft HEAD~3 &&
git commit
Run Code Online (Sandbox Code Playgroud)
如果你想用现有提交消息的串联开始编辑新的提交消息(即类似于pick/squash/squash/.../squash git rebase -i
指令列表将启动你),那么你需要提取这些消息并传递他们git commit
:
git reset --soft HEAD~3 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"
Run Code Online (Sandbox Code Playgroud)
这两种方法都以相同的方式将最后三次提交压缩成一个新的提交.软复位只是将HEAD重新指向您不想压缩的最后一次提交.软复位不会触及索引和工作树,使索引处于新提交所需的状态(即,它已经具有您将要"扔掉"的提交的所有更改).
Ano*_*mie 1873
使用git rebase -i <after-this-commit>
和替换用"南瓜"或"修正"的第二和随后提交"取",如在所描述的手动.
在此示例中,<after-this-commit>
是SHA1哈希值或当前分支的HEAD的相对位置,从中为rebase命令分析提交.例如,如果用户希望在过去查看当前HEAD的5个提交,则命令是git rebase -i HEAD~5
.
Mar*_*air 702
你可以使用git merge --squash
它,这比它更优雅git rebase -i
.假设你是主人并且想要将最后12次提交压缩成一次.
警告:首先确保提交git status
干净的工作检查(因为git reset --hard
会丢弃分阶段和未分阶段的更改)
然后:
# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12
# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}
# Commit those squashed changes. The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit
Run Code Online (Sandbox Code Playgroud)
该文档git merge
--squash
更详细地描述了该选项.
更新:这个方法的唯一真正优势git reset --soft HEAD~12 && git commit
在于克里斯·约翰森在他的回答中提出的更简单的方法是,你得到的提交消息预填充了你正在压缩的每个提交消息.
nob*_*bar 205
我建议git reset
尽可能避免- 特别是对于Git-novices.除非你真的需要基于一些提交自动化一个进程,否则有一种不那么奇特的方式......
git merge --squash (working branch name)
git commit
提交消息将根据壁球预先填充.
Xys*_*Xys 133
2020没有变基的简单解决方案:
git reset --soft HEAD~2
git commit -m "new commit message"
git push -f
2 表示最后两次提交将被压缩。你可以用任何数字替换它
Eth*_*anB 128
从bash添加全局"squash"别名:(或Windows上的Git Bash)
git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'
Run Code Online (Sandbox Code Playgroud)
...或使用Windows的命令提示符:
git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"
Run Code Online (Sandbox Code Playgroud)
你~/.gitconfig
现在应该包含这个别名:
[alias]
squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"
Run Code Online (Sandbox Code Playgroud)
用法:
git squash N
Run Code Online (Sandbox Code Playgroud)
...自动压缩最后一次N
提交,包括在内.
注意:结果提交消息是所有压缩提交的组合,按顺序.如果您对此不满意,可以随时git commit --amend
手动修改它.(或者,编辑别名以符合您的口味.)
br3*_*3nt 104
感谢这篇方便的博客文章,我发现你可以使用这个命令来压缩最后3次提交:
git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)
这很方便,因为即使您在没有跟踪信息/远程仓库的本地分支上也能正常工作.
该命令将打开交互式rebase编辑器,然后允许您按照正常情况重新排序,压缩,重写等.
使用交互式rebase编辑器:
交互式rebase编辑器显示最后三次提交.此约束由HEAD~3
运行命令时确定git rebase -i HEAD~3
.
最新的提交HEAD
首先显示在第1行.以a开头的行#
是注释/文档.
显示的文档非常清楚.在任何给定的行上,您可以将命令从更改pick
为您选择的命令.
我更喜欢使用该命令,fixup
因为这会将提交的更改"压缩"到上面一行的提交中,并丢弃提交的消息.
正如第1行的提交一样HEAD
,在大多数情况下,你会将其保留为pick
.你不能使用squash
或fixup
因为没有其他提交来压缩提交.
Mat*_*s M 55
如果您使用TortoiseGit,您可以使用以下功能Combine to one commit
:
Show Log
Combine to one commit
从上下文菜单此函数自动执行所有必需的单个git步骤.不幸的是只适用于Windows.
tru*_*olf 46
基于这篇文章,我发现这个方法对我的用例更容易.
我的'dev'分支在96个提交之前超过了'origin/dev'(所以这些提交还没有推到远程).
我想在推动改变之前将这些提交压缩成一个.我倾向于将分支重置为'origin/dev'状态(这将保留96个提交中的所有更改未分级),然后立即提交更改:
git reset origin/dev
git add --all
git commit -m 'my commit message'
Run Code Online (Sandbox Code Playgroud)
aab*_*iro 42
在分支中,您想要组合提交,运行:
git rebase -i HEAD~(n number of commits back to review)
Run Code Online (Sandbox Code Playgroud)
这将打开文本编辑器,如果您希望将这些提交合并在一起,则必须使用'squash'切换每个提交前面的'pick'.例如,如果您要将所有提交合并为一个,那么'pick'是您做的第一个提交,所有未来的提交(放在第一个提交之下)应设置为'squash'.如果使用vim,请在插入模式下使用:x来保存并退出编辑器.
然后继续改变:
git rebase -i HEAD~1
Run Code Online (Sandbox Code Playgroud)
有关此方法和其他重写提交历史记录的更多信息,请参阅此有用的帖子
Jak*_*han 41
为此,您可以使用以下git命令.
git rebase -i HEAD~n
Run Code Online (Sandbox Code Playgroud)
n(此处为4)是最后一次提交的次数.然后你有以下选择,
pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....
Run Code Online (Sandbox Code Playgroud)
更新如下,
p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请单击链接
祝好运!!
Mar*_*oma 32
Anomies答案很好,但我对此感到不安全,所以我决定添加一些屏幕截图.
看看你在哪里git log
.最重要的是,找到你不想压缩的第一次提交的提交哈希.所以只有:
git rebase -i [your hash]
在我的情况下执行:
$ git rebase -i 2d23ea524936e612fae1ac63c95b705db44d937d
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我想在第一次提交的时候压缩所有内容.排序是从头到尾,所以完全是另一种方式git log
.在我的情况下,我想:
如果您只选择了一个提交并压缩其余提交,则可以调整一个提交消息:
而已.一旦你保存了这个(:wq
),你就完成了.看看吧git log
.
ana*_*ana 31
这是执行后将遵循的另一个可视化示例:
git rebase -i HEAD~3
来源:https : //www.git-tower.com/learn/git/faq/git-squash/
Sau*_*ahu 30
有没有人提到在IntelliJ IDEA UI上做起来有多么容易:
git
窗口Squash Commits
编辑压缩的提交消息Force Push
ras*_*hok 29
1)识别提交短哈希
# git log --pretty=oneline --abbrev-commit
abcd1234 Update to Fix for issue B
cdababcd Fix issue B
deab3412 Fix issue A
....
Run Code Online (Sandbox Code Playgroud)
这里甚至git log --oneline
还可以用来获得短哈希.
2)如果你想压缩(合并)最后两次提交
# git rebase -i deab3412
Run Code Online (Sandbox Code Playgroud)
3)这打开了一个nano
合并编辑器.它看起来像下面
....
pick cdababcd Fix issue B
pick abcd1234 Update to Fix for issue B
....
Run Code Online (Sandbox Code Playgroud)
4)重命名字pick
到squash
其存在之前abcd1234
.重命名后应该如下所示.
....
pick cdababcd Fix issue B
squash abcd1234 Update to Fix for issue B
....
Run Code Online (Sandbox Code Playgroud)
5)现在保存并关闭nano
编辑器.按ctrl + o
,然后按Enter
保存.然后按ctrl + x
退出编辑器.
6)然后nano
编辑器再次打开以更新注释,必要时更新它.
7)现在它成功压扁,您可以通过检查日志来验证它.
# git log --pretty=oneline --abbrev-commit
1122abcd Fix issue B
deab3412 Fix issue A
....
Run Code Online (Sandbox Code Playgroud)
8)现在推动回购.请注意+
在分支名称前添加符号.这意味着强制推动.
# git push origin +master
Run Code Online (Sandbox Code Playgroud)
注意:这是基于在ubuntu
shell 上使用git .如果您使用不同的操作系统(Windows
或Mac
),那么除编辑器外,上述命令是相同的.你可能得到不同的编辑器.
rnw*_*ser 28
方法 1(如果您有很多提交)
git rebase -i master
然后按键盘“i”进行编辑
你会看到这样的:
pick etc1
pick etc2
pick etc2
Run Code Online (Sandbox Code Playgroud)
将单词 pick 替换为'f'
并按esc y :wq
pick etc1 //this commit will the one commit
f etc2
f etc2
Run Code Online (Sandbox Code Playgroud)
然后按这个命令
git push origin +head
Run Code Online (Sandbox Code Playgroud)
方法2如果你的提交很少,你可以这样做来删除一个提交,你需要做同样的事情来删除你的第二个提交,依此类推
git reset --soft HEAD^1 // or git reset --soft head~1
git commit --amend //then press `:wq`
git push -f
Run Code Online (Sandbox Code Playgroud)
方法 3如果您已经有一个提交并且不想再提交另一次提交
git add files...
git commit --amend //then press `:wq`
git push origin +head
Run Code Online (Sandbox Code Playgroud)
San*_*mar 27
如果你在一个feature-branch
从Golden Repository()克隆的远程分支(被叫)上golden_repo_name
,那么这就是将你的提交压缩为一个的技巧:
查看黄金回购
git checkout golden_repo_name
Run Code Online (Sandbox Code Playgroud)从中创建一个新分支(黄金回购),如下所示
git checkout -b dev-branch
Run Code Online (Sandbox Code Playgroud)壁球与您已经拥有的当地分支合并
git merge --squash feature-branch
Run Code Online (Sandbox Code Playgroud)提交你的更改(这将是dev-branch中唯一的提交)
git commit -m "My feature complete"
Run Code Online (Sandbox Code Playgroud)将分支推送到本地存储库
git push origin dev-branch
Run Code Online (Sandbox Code Playgroud)Ari*_*zon 20
真正方便的是:
找到你要压缩的提交哈希,比方说d43e15
.
现在用
git reset d43e15
git commit -am 'new commit name'
Run Code Online (Sandbox Code Playgroud)
Aya*_*yan 20
将最后10次提交压缩为1次提交:
git reset --soft HEAD~10 && git commit -m "squashed commit"
Run Code Online (Sandbox Code Playgroud)
如果您还想使用压缩提交更新远程分支:
git push -f
Run Code Online (Sandbox Code Playgroud)
Pra*_*hwa 20
最简单的方法是使用 GitHub Desktop。只需选择历史记录中的所有提交,右键单击并选择“Squash x commits”:
Cas*_*bel 17
这是超级愚蠢的kludgy,但是以一种很酷的方式,所以我只是把它扔进戒指:
GIT_EDITOR='f() { if [ "$(basename $1)" = "git-rebase-todo" ]; then sed -i "2,\$s/pick/squash/" $1; else vim $1; fi }; f' git rebase -i foo~5 foo
Run Code Online (Sandbox Code Playgroud)
翻译:为git提供一个新的"编辑器",如果要编辑的文件名是git-rebase-todo
(交互式rebase提示),除了第一个"pick"改为"squash",否则会产生vim - 这样当你被提示时编辑压缩的提交消息,你得到vim.(显然我在分支foo上压缩了最后五次提交,但是你可以随意更改它.)
不过,我可能会做马克·朗格尔建议的事情.
Wil*_*iss 16
如果您想将每个提交压缩到一个提交中(例如,在第一次公开发布项目时),请尝试:
git checkout --orphan <new-branch>
git commit
Run Code Online (Sandbox Code Playgroud)
小智 14
我认为最简单的方法是通过从master创建一个新的分支并进行合并 - 对功能分支进行处理.
git checkout master
git checkout -b feature_branch_squashed
git merge --squash feature_branch
Run Code Online (Sandbox Code Playgroud)
然后,您已准备好提交所有更改.
Alb*_*lan 12
例如,如果您想将最后3次提交压缩为分支机构(远程存储库)中的单个提交,例如:https : //bitbucket.org
我所做的是
Wil*_*ken 11
(MASTER)
Fleetwood Mac Fritz
? ?
Add Danny Lindsey Stevie
Kirwan Buckingham Nicks
? ????????????
Add Christine ?
Perfect Buckingham
? Nicks
LA1974???????????
?
?
Bill <?????? YOU ARE EDITING HERE
Clinton (CHECKED OUT, CURRENT WORKING DIRECTORY)
Run Code Online (Sandbox Code Playgroud)
在https://github.com/fleetwood-mac/band-history存储库的这段非常简短的历史记录中,您已经打开了pull请求,以将Bill Clinton提交合并到原始(MASTER
)Fleetwood Mac提交中。
您打开了一个拉取请求,并在GitHub上看到以下内容:
四次提交:
认为没有人会愿意阅读完整的存储库历史记录。(实际上有一个存储库,单击上面的链接!)您决定压缩这些提交。所以你去跑步git reset --soft HEAD~4 && git commit
。然后将git push --force
其放到GitHub上以清理您的PR。
那会发生什么呢?您刚刚完成了一次从Fritz到Bill Clinton的提交。因为您忘记了昨天您正在从事该项目的白金汉尼克斯版本。而且git log
与您在GitHub上看到的不符。
git checkout
他们git reset --soft
该git commit
直接从该经线从到到Col*_*inM 10
假设您当前位于要压榨的分支上,简单的单线始终有效,master是它的起源分支,而最新的commit包含您希望使用的提交消息和作者:
git reset --soft $(git merge-base HEAD master) && git commit --reuse-message=HEAD@{1}
Run Code Online (Sandbox Code Playgroud)
Pul*_*sal 10
许多答案都是基于git rebase
命令的,但根据我的经验,它对于 git 初学者来说有些复杂和高级。
假设您想压缩最后 3 次提交。然后是以下步骤:
git log -1 --oneline
并记下当前状态的提交 id(以防万一您在 git reset 上做错了)git reset --soft HEAD~3
您将返回 3 次提交(并且有点忘记您之前已经进行了这 3 次提交)git commit -m <NEW_SINGLE_MESSAGE>
这将自动组合您的消息下的三个提交如果 git reset 出现问题,您可以通过 git reset --soft <ORIGINAL_COMMIT>
iro*_*rrl 10
我们对这个答案非常满意,这意味着您不需要计算提交。
\n如果您在 master 分支上有大量提交并希望将它们全部合并为一个:
\n[您会注意到此时的所有更改都将显示在 IDE 的源代码控制部分中 - 最好查看它们以检查是否全部存在]
\n就是这样!
\n如果您不关心中间提交的提交消息,则可以使用
git reset --mixed <commit-hash-into-which-you-want-to-squash>
git commit -a --amend
Run Code Online (Sandbox Code Playgroud)
小智 8
我受到克里斯·约翰森的回答的启发,并找到了更好的解决方案。
如果我们想压缩最后 3 个提交,并从头开始编写新的提交消息,这就足够了:
git reset --soft HEAD~3 && git commit
Run Code Online (Sandbox Code Playgroud)
如果我们想压缩最后的许多提交,比如说 162 个提交,那么很难计算第 162 个提交的排名,但是我们可以使用提交 ID,这就足够了:
git reset --soft ceb5ab28ca && git commit
Run Code Online (Sandbox Code Playgroud)
ceb5ab28ca 是第 162 次提交的提交 ID。
我发现一个更通用的解决方案不是指定“N”次提交,而是指定您想要压缩的分支/提交 ID。这比将提交计数到特定提交更不容易出错——只需直接指定标签,或者如果你真的想要计数,你可以指定 HEAD~N。
在我的工作流程中,我启动了一个分支,我在该分支上的第一次提交总结了目标(即它通常是我将作为功能的“最终”消息推送到公共存储库的内容。)所以当我完成后,所有我想做的是git squash master
回到第一条消息然后我准备推送。
我使用别名:
squash = !EDITOR="\"_() { sed -n 's/^pick //p' \"\\$1\"; sed -i .tmp '2,\\$s/^pick/f/' \"\\$1\"; }; _\"" git rebase -i
Run Code Online (Sandbox Code Playgroud)
这将在执行之前转储被压缩的历史记录 - 如果您想恢复,这使您有机会通过从控制台获取旧的提交 ID 来恢复。(Solaris 用户注意到它使用 GNU sed-i
选项,Mac 和 Linux 用户应该可以接受。)
有问题的是,“最后”的含义可能是模棱两可的。
例如git log --graph
输出以下(简体):
* commit H0
|
* merge
|\
| * commit B0
| |
| * commit B1
| |
* | commit H1
| |
* | commit H2
|/
|
Run Code Online (Sandbox Code Playgroud)
然后按时间的最后提交是H0,合并,B0。要压缩它们,您将必须基于提交H1重新建立合并的分支。
问题在于H0包含H1和H2(通常在合并之前和分支之后会有更多提交),而B0则没有。因此,您至少必须管理来自H0,合并,H1,H2,B0的更改。
可以使用rebase,但使用的方式与其他提到的答案不同:
rebase -i HEAD~2
这将为您显示选择选项(如其他答案中所述):
pick B1
pick B0
pick H0
Run Code Online (Sandbox Code Playgroud)
将壁球而不是接球放到H0:
pick B1
pick B0
s H0
Run Code Online (Sandbox Code Playgroud)
保存并退出rebase之后,将在H1之后依次应用提交。这意味着它将要求您再次解决冲突(其中HEAD首先为H1,然后在应用提交时累积提交)。
重置完成后,您可以选择压缩的H0和B0消息:
* commit squashed H0 and B0
|
* commit B1
|
* commit H1
|
* commit H2
|
Run Code Online (Sandbox Code Playgroud)
PS:如果您只是对BO进行一些重置:(例如,使用/sf/answers/1308359181/reset --mixed
进行了详细说明):
git reset --mixed hash_of_commit_B0
git add .
git commit -m 'some commit message'
Run Code Online (Sandbox Code Playgroud)
那么您将压倒H0,H1,H2的B0更改(在分支之后和合并之前完全放弃提交更改)。
与这样的工作流程有关的问题的答案呢?
merge --squash
进行PR 会更容易,但是团队认为这样做会拖慢过程。)我在此页面上没有看到这样的工作流程。(可能是我的眼睛。)如果我理解rebase
正确,那么多次合并将需要多种冲突解决方案。我什至不想考虑!
因此,这似乎对我们有用。
git pull master
git checkout -b new-branch
git checkout -b new-branch-temp
git checkout new-branch
git merge --squash new-branch-temp
//将所有更改置于阶段git commit 'one message to rule them all'
git push
如何使用 Git 将我最后的 X 次提交合并为一次提交?
git rebase -i HEAD~X
Run Code Online (Sandbox Code Playgroud)
将显示以下内容:
pick 1bffc15c My earlier commit
pick 474bf0c2 My recent commit
# ...
Run Code Online (Sandbox Code Playgroud)
对于你想要压缩的提交,用fixup替换pick,所以它变成:
pick 1bffc15c My earlier commit
fixup 474bf0c2 My recent commit
# ...
Run Code Online (Sandbox Code Playgroud)
如果它在 vim 中打开(终端内的默认界面),然后按Esc
键盘上的键,输入:wq
和Enter
以保存文件。
验证:检查git log
简单的解决办法:
git reset --soft HEAD~5
git commit -m "commit message"
git push origin branch --force-with-lease
除了其他出色的答案,我想补充一下如何git rebase -i
总是使我对提交顺序感到困惑-从旧到新,反之亦然?这是我的工作流程:
git rebase -i HEAD~[N]
,其中N是我要加入的提交数,从最近一次开始。因此git rebase -i HEAD~5
意味着“将最后5次提交压缩为新的提交”; 归档时间: |
|
查看次数: |
1468360 次 |
最近记录: |