你可能有过下面的经历
自己在本地开发,由于 Github
配置了CI,所以需要将新的代码 push到 github 来测试
所以你的 commit
上会有大量无用的 commit
与 commit message
比如:
update, done, fix,update,update …
当你测试通过之后,你想把上面的 commit
合并成一个显示。
如果这是你自己的仓库还好,如果是 fork 的仓库,在开发完成之后你想要 pull request,留着那么多的 commits 肯定不合适
那如何将多个 commits
记录合并成一个 commit
并且保留 commit
的代码呢?
先创建几个 commit
记录
1 | mkdir test |
现在我们看一下 commit
记录
1 | git log |
1 | commit 338fe65506a59f02e79badce0ff2c4dd77f08f8c (HEAD -> master) |
你现在想把 add3
, add2
合并到 add1
并且保留全部的内容,并将这个新的commit的记录改写为 add1,2,3
有如下两种方式
Git rebase
1 | git rebase -i HEAD~3 |
这时 git
会为你打开 rebase
的对话框
你会看到如下的内容。
1 | pick 278713a add 1 |
而对应着,git rebase
有如下命令
1 | # p, pick = use commit |
我们这里使用 fixup
,丢弃掉 log message
1 | r 278713a add1,2,3 |
关闭对话框之后进入到 commit message
的界面,这时填写 add1,2,3
并关闭
再次 git log
1 | commit 74d943e839c96fe256bd3324a6da0a5e6fbeafa1 (HEAD -> master) |
完成修改 :)
Git reset --soft
--soft
保证你的 commit
不丢失,内容不会被删除,仅仅移动了 HEAD
我们将 HEAD 移动到 add1 之前(也就是 add0
)
1 | git reset --soft 3011974bb76dbc5ccc75abf9a528605c60cbb51f |
使用 git log
你会发现只剩下 add0
的提交
下面添加全部的文件
1 | git add . |
完成
之后往 GitHub 提交时由于 commit
的变更你会推送失败
可以 force-with-lease
更新
1 | git push --force-with-lease |
不推荐使用 -force
比如A,B一起在 master
分支开发,B开发完成之后将代码 push
到了 master
A在本地 master
分支进行了 rebase
操作。这时A与 remote/master
已经冲突了
如果A 使用 git push --force
,则会覆盖掉 B 推送到 master
上的代码
https://stackoverflow.com/a/37460330/7529562
参见
https://github.com/Jisuanke/tech-exp/issues/13