git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。在开发过程当中,咱们常常会使用到 git 的 commit 命令,使用多了分支的历史信息就会显得杂乱无章,最后合并到主分支时会影响主分支历史信息的优雅性。那么这个状况发生时咱们应该如何解决呢?git
接下来咱们看一下一些常见的场景:bash
本地已经提交过一次 commit,以后我又修改了内容,可是又不想再提交一次 commit 信息。分布式
这种状况可使用 git commit --amend, 这个命令来更改 commit 信息,把这一次的修改合并到该 commit 中,而后保存退出。这样就达到了保存此次修改的所有内容,而且只提交了一个 commit 信息。ui
perfect !!spa
本地已经屡次 commit,可是显得杂乱无章,想要把屡次 commit 合并成一次 commit 提交。3d
首先,使用 git log 查看历史提交信息版本控制
这个场景介绍两种方法解决code
方法一:git reset --softcdn
注意箭头所指的地方是你要回退的版本的 commitidblog
经过 git status 能够看到已经回退了,须要 git commit 保存该修改;经过 git log 能够看到目前已经回退到第一次提交的版本。
方法二:git rebase -i
出现以下界面,红色框内是操做区域,蓝色框内是指令说明区域
指令说明
pick:意味着包括提交。从新进行命令时,从新安排pick命令的顺序会更改提交的顺序。若是选择不包括提交,则应删除整行。
reword:与类似pick,可是使用后,从新设置过程将暂停并为您提供更改提交消息的机会。提交所作的任何更改均不受影响。
edit:将有机会修改提交,这意味着您能够彻底添加或更改提交。您还能够进行更多提交,而后再继续进行变基。这使您能够将大型提交拆分为较小的提交,或者删除在提交中所作的错误更改。
squash:该命令使您能够将两个或多个提交合并为一个提交。提交被压缩到其上方的提交中。Git使您有机会编写描述这两个更改的新提交消息。
fixup:这相似于squash,可是要合并的提交已丢弃其消息。提交仅合并到其上方的提交中,而且较早提交的消息用于描述这两个更改。
exec:这使您能够对提交运行任意的Shell命令。
复制代码
perfect !!
git reset --soft commitid 和 git rebase -i 的区别:
git reset --soft commitid: 将代码回退到某个版本,而后再进性一次提交,这个时候咱们能够选择上一个 commit 信息或者新建一个 commit。
git rebase -i: 只是合并 commit 没有对代码进性提交,并且 git rebase 能够合并一个区间,好比我提交了6次,可是我想保留第一次和第六次,那么咱们就可使用 git rebase -i [startpoint] [endpoint] 将中间的commit 信息合并,若是不指定就是开区间。
当咱们的代码已经推到远程仓库后,这个时候咱们该怎么办呢?
遇到这样的状况也是能够解决的,咱们能够按照一二场景合并成咱们须要的 commit message 后,使用 git push -f 命令,这个命令能够覆盖掉以前提交的 commit message。可是不建议这样作,有必定风险存在。若是只是为了好看的 commit 最终引起系统 bug,那也就得不偿失了。