Git使用之追加提交和合并提交
在上一篇Git使用教程之版本回退我们已经学会如何使用git进行版本管理,并尝试提交和版本回退。接下来我们将继续学习,有关提交的高级用法。例如我们想把多次提交合并成一次提交,把漏提交的内容追加到上次提交。本节我们将使用两个重要的命令git commit --amend追加提交git commit --amend
和git rebase
命令。
首先我们设想下面一种情况,在开发过程中,你为了完成某一项工作,修改了很多个文件,最后当工作完成的时候,我们需要将这次完成的功能提交到代码库。提交的时候你可能会这么注释“finish xxx work”完成了某某某工作。这个工作完成之后,你可能要进行下一个工作。在进行下个工作之前,你突然发现刚才的提交漏了两个文件,这个时候如果你再次提交一次,显然是不合适的。因为那样会产生两次提交不利于以后的版本维护。那么这个时候就需要用到
git commit --amend
了。千说不如一练。看下面的demo。首先新建一个文件1.txt和新建一个2.txt,然后将1.txt添加到暂存区,并提交到版本库,log为commit 1.txt。然后将2.txt添加到暂存区,然后提交的时候使用
--amend
会出现如下的界面
1 commit 1.txt
2
3 # Please enter the commit message for your changes. Lines starting
4 # with '#' will be ignored, and an empty message aborts the commit.
5 #
6 # Date:Wed Jul 11 15:19:00 2018 +0800
7 #
8 # On branch master
9 # Changes to be committed:
10 #new file:1.txt
11 #new file:2.txt
12 #
这个时候我们看到了第一次提交的内容和log。提交完成之后我们查看当前git状态和提交历史。我们发现虽然我们提交了两次,但是log中只出现了一次提交。因为我们使用
--amend
将第二次提交追加到第一次提交上了。这样会使我们的提交历史变得整洁清晰。commit ce42e88895cc87c43458c284df911b500b7e94fd (HEAD -> master)
Author: snowzhang
Date:Wed Jul 11 15:19:00 2018 +0800commit 1.txt and commit 2.txt
git rebase 合并多次提交
rebase
在git
中是一个非常有魅力的命令,使用得当会极大提高自己的工作效率;相反,如果乱用,会给团队中其他人带来麻烦。它的作用简要概括为:可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase
命令可以使我们的提交历史干净、简洁!前提:不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外)
当我们在本地仓库中提交了多次,在我们把本地提交push到公共仓库中之前,为了让提交记录更简洁明了,我们希望把如下分支B、C、D三个提交记录合并为一个完整的提交,然后再push到公共仓库。
文章图片
git rebase commit.png 下面开始实践
rebase
命令
- 首先创建三次次提交BCD
snowzhang@snowdeMBP-2:~/gitLearn$git log
commit 9a931be7950033df6905b8b77dc590cdfc37367c (HEAD -> master)
Author: snowzhang
Date:Wed Jul 11 15:50:55 2018 +0800commit Dcommit 68b8f4ce42e0201fb731085790ffeb190d9747b5
Author: snowzhang
Date:Wed Jul 11 15:50:06 2018 +0800commit Ccommit d9bebec678b202ac388518ed0aed3a2fb7bc85b3
Author: snowzhang
Date:Wed Jul 11 15:49:27 2018 +0800commit B
这里我们使用命令:
git rebase -i[startpoint][endpoint]
其中
-i
的意思是--interactive
,即弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。在查看到了log日志后,我们运行以下命令:
git rebase -i ce42e8889
文章图片
rebase vim .png
上面显示未注释区域为我们的编辑区域,下面注释区的Commands为命令,具体命令解释如下:
我们将按照上面的命令提示,修改pick成下面这样
- pick:保留该commit(缩写:p)
- reword:保留该commit,但我需要修改该commit的注释(缩写:r)
- edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
- squash:将该commit和前一个commit合并(缩写:s)
- fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
- exec:执行shell命令(缩写:x)
- drop:我要丢弃该commit(缩写:d)
pick d9bebec commit B
s 68b8f4c commit C
s 9a931be commit D
最终查看
git log
会给出这样的提示commit 3ab108fd7e0fb3a7477763f2ef8032251105e69f (HEAD -> master)
Author: snowzhang
Date:Wed Jul 11 15:49:27 2018 +0800commit Bcommit Ccommit D
【Git使用之追加提交和合并提交】证明我们已经将BCD三次提交合并成一次提交了。
至此,关于两种合并方式已经演示完毕。写的不好,还请多多包涵。
下一节,讲讲什么是工作区,暂存区,和git库,以及他们之间的关系。
推荐阅读
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- gitlab|gitlab 通过备份还原 admin/runner 500 Internal Server Error
- iOS中的Block
- Linux下面如何查看tomcat已经使用多少线程
- 使用composer自动加载类文件
- android|android studio中ndk的使用