mas*_*roy 16 git squash git-squash
当我正在处理新代码时,我会做很多小提交来跟踪我的更改.但是,我的公司更喜欢在一次提交中提交每个功能.所以解决方案是将我的整个分支压缩到一个提交.
我怎么压扁整个分支而不使用git rebase --interactive
,然后改变pick
到squash
对所有提交?
mea*_*gar 16
我的首选方法是双线(不包括下面的步骤1和4).其优点是你不需要知道/记录任何提交的ID,你可以写一个简单的别名来执行所有涉及的步骤,以及你的实际移动你的整个分支到原点 /主,使得实际合并到主可以快速 - 前进,不存在任何冲突.
首先,我的假设:
my-feature-branch
.这个分支与master
几个提交有所不同; 这是签出的分支.master
轨道远程分支origin/master
my-feature-branch
提交压缩到当前状态的原始状态/主数据上的单个提交(不是您的本地master
,可能已过期)git reset --hard
)我的流程如下:
获取,origin/master
当前是:
$ git fetch
Run Code Online (Sandbox Code Playgroud)通过将其重置为指向,删除本地分支上的所有提交 origin/master
$ git reset --mixed origin/master
Run Code Online (Sandbox Code Playgroud)将所有旧更改从分支的先前状态合并到索引中
$ git merge --squash HEAD@{1}
Run Code Online (Sandbox Code Playgroud)提交您的更改 - Git将使用提交消息预先填充您的编辑器,该消息包含来自压缩提交的所有提交消息
我提到的简单别名是:
alias squash="git fetch; git reset --mixed origin/master; git merge --squash HEAD@{1}"
Run Code Online (Sandbox Code Playgroud)
ian*_*ini 10
这是一个完美的用例git reset --soft
。
假设你有一个提交历史
D Your latest patch
C Your second patch
B Your first patch
A Someone else's work
Run Code Online (Sandbox Code Playgroud)
您没有分阶段更改,并且git status
,git log
或者git show
告诉您当前处于提交 D。
然后,git reset --soft B
将提交的累计变化C
和D
和舞台他们提交。git commit --amend
然后将这些更改“合并”到提交 B 中。
使用方法如下:
git reset --soft B
git commit --amend
Run Code Online (Sandbox Code Playgroud)
第二个命令将打开您的编辑器,并有机会编辑提交消息。
请注意,如果您在开始此过程之前已暂存更改(即您已完成git add XXX
但没有跟进git commit
),那么这些暂存更改也将合并到提交中。
可能最好的选择是git merge --squash
在合并时使用.这将使你的分支开发,这通常更容易进行故障排除,因为你将有一些概念"我正在改变提交Z中的特定功能",并查看该特定提交,你有所有您对多个文件所做的任何更改的上下文 - 查看单个提交,这是您的开发路径的压扁结果使得它更难记住"哦,是的,我必须在另一个文件中更改另一个,也......".您还可以使用的好处git bisect
,当你有你的整个路径-在所有它可以告诉你,在挤压的情况是"这个巨大的承诺打破了这里的东西".
使用的结果git merge --squash
是您正在"合并"到分支上的单个提交,其中包含来自分支的累积更改,但它会单独保留原始分支.
小智 6
在启动分支之前找到提交的哈希值并将其复制到剪贴板中。然后重置为该哈希。
$ git reset [hash]
Run Code Online (Sandbox Code Playgroud)
然后只需在单个消息中重新添加并重新提交更改。
$ git add -A
$ git commit -m 'EVERYTHING SQUASHED'
Run Code Online (Sandbox Code Playgroud)
编辑 git 配置文件~/.gitconfig
并将以下内容添加到别名部分
[alias]
squash = "!f(){ CUR=`git rev-parse HEAD` && git reset --soft ${1} && git commit -m \"$(git log --format=%B ${1}..${CUR})\"; };f"
Run Code Online (Sandbox Code Playgroud)
此别名获取当前 HEAD 提交哈希,重置回您指定的提交,并创建一个保留所有提交消息的新提交。
用法:
git squash <refspec>
Run Code Online (Sandbox Code Playgroud)
refspec 可以是任何有效的提交引用,例如提交哈希、分支名称、标记名称、HEAD^
HEAD~3