git基本用法
git基本用法
一、本地仓库操作
1.仓库初始化
1 |
|
2.将修改保存到暂存区
1 |
|
查看暂存区状态
1 |
|
但是如果你不小心把不想添加的东西添加到暂存区,或者想丢弃已经添加的内容,这个时候你该怎么办呢?不用着急,这个时候git checkout
命令就可以大显身手了。丢弃添加的内容:
1 |
|
3.将修改提交到本地仓库
当执行完git commit
后,如果你试着执行以下git log
你可能会得到如下的输出:
1 |
|
其中:
“commit 37302ce99137cf30fabc14784d23ea63cadb928b”
中的后面这一串字符就是完整的commit id
;“Author”
就是这次提交的作者,它就是我们在git config
中配置的user.name
;- 最后输出的
“添加helloGit.txt”
,是我们在提交时添加的信息。
如果有多次提交即commit
,在执行git log
时,会输出每一次的提交的具体信息。这样的话,什么时候(Date
)由什么人(Author
)提交了什么内容(“添加helloGit.txt
”)就一目了然了。

二、远程仓库操作
1.克隆远程版本库
1 |
|
在团队开发中,我们必须选用一台主机做为Git
服务器来存放远程版本库。这样团队中的每个开发者,就可以基于一个共同的远程版本库进行开发。目前提供代码托管(即可以将远程版本库存放于其上的)的平台有Github
、Gitee
等,同时我们也可以搭建一台私有的运行Git
的服务器,来做为远程Git
服务器。Github
等平台的使用,及本地Git
服务器的搭建,会在后续的实训中具体介绍。本地Git
服务器,可以配置不同的连接方式,如shell
、git
或bash
。为了给挑战者提供一个便利的实训环境,我们为每个人配置了一台本地Git
服务器,并允许以bash
方式进行操作,即可以通过类似于/home/sample.git
这种形式的地址,做为远程仓库地址进行操作,而不是像https://sample.git
这种形式。
2.添加到远程版本库
现在你要自己启动一个项目了,你需要将你的代码保存到远程版本中。那么你要做的第一件事就是,需要为你的本地版本库添加一个远程仓库,然后整个团队才能基于这个远程版本库进行协同开发。
添加远程版本库需要用到的命令是git remote add
,其命令格式为:
1 |
|
使用示例如下:
1 |
|
这样就将https://sample.git
添加为远程仓库,并将其命名为origin
。
###编程要求
本关的编程任务是,补全右侧代码片段中Begin
至End
中间的脚本。通过执行你所编写的脚本,来完成为本地仓库添加远程仓库的任务。远程仓库的地址为/tmp/sample.git
。具体要求如下:
- 创建一个本地版本库;
- 为创建的本地仓库添加远程仓库,且将其命名为
git
。
3.推送本地仓库到远程仓库
推送本地内容时,会将所有未推送至远程仓库的内容,都提到远程仓库。它用到的命令是git push
,使用方法如下:
1 |
|
具体的使用方法如下:
1 |
|
这样就将本地分支的内容,推送到远程仓库origin
的master
分支了。
参数-u的作用
git push
的另外一种用法如下:
1 |
|
-u
参数的作用是,建立起本地master
分支和远程master
分支之间的对应关系,下一次如果再推送master
分支,就可以忽略远程分支名了,如下所示:
1 |
|
4.拉取远程分支到本地
拉取远程仓库的内容到本地,需要使用git pull
命令,其命令格式为:
1 |
|
其使用示例如下:
1 |
|
pull过程可能产生冲突
但是,在使用过程中,也可能会出现一种情况:远程分支和本地分支对同一内容做了修改,这就会导致将远程分支的修改,合并到本地分支的时候发生冲突。这个时候,可以选择解决冲突,然后合并(解决冲突会在后续的实训中介绍)。也可以选择直接强制拉取,使用远程分支的修改,覆盖本地分支的修改。强制拉取需要用到-f
参数,语法格式如下:
1 |
|
具体的使用示例如下:
1 |
|
三、分支管理
1.创建/切换本地分支
当你进入一个团队,在获得产品的完整代码之后,你首先要做的就是,在本地创建一个属于自己的分支,然后才能在自己的分支上进行开发。
我们在master
分支上,进行了C1
、C2
、C3
三次提交,且当前指针指向C3
提交。
一般情况下,我们只会将已经成熟的代码存放到master
分支,而将正在开发的代码或者测试版的代码放到其他分支。这时,我们就需要新建分支,以在该分支进行开发。如下图:

当我们在主分支进行了C2
提交后,新建了develop
分支,并在其上进行了两次提交。此时,工作区指针HEAD
指向develop
分支。
创建本地分支用到的命令是git branch
,而分支切换用到的命令是git checkout
。git checkout
是有很多用途的命令,在这里我们只讲它在分支操作中的使用。下面我们详细介绍这两个命令的使用。
分支切换 可以使用
git checkout
命令切换到其他分支。如你本地有master
分支和develop
分支,目前你正处于develop
分支进行开发,现在你想切换到master
去,则可以执行下面的操作:git checkout master
这样就能切换到master
分支继续进行开发。创建新的分支
当你需要创建一个新的分支的时候,可以使用
git branch
命令,其具体使用格式为:1
git branch 新的分支名字
使用示例如下:
1
#创建名为new_branch的新分支 git branch new_branch
创建新分支的同时切换 切换到一个新的分支,有一个更为简洁的命令:
git checkout -b
,它的使用格式为:git checkout -b 新的分支 名字
其具体使用方法如下:git checkout -b new_branch
这样就可以创建,并切换到了new_branch
分支。
2.删除本地分支
在开发过程中,很可能出现的一个情况是:你为了解决一个紧急bug
,而临时创建了一个分支或者分支过于混乱需要丢弃。这时你就需要进行分支删除操作。
本关任务:删除本地分支。
相关知识
现在我们来看一个实际的例子。请看下图:
首先,我们在master
工作到
C1
,然后开始一个新分支develop
分支,做为测试版的代码分支。提交到C5
的时候,又需要临时解决一个问题,于是从C5
的地方又分出一个分支issue
。提交到C7
的时候,该issue
被解决。issue
分支已经失去其意义,则需要将其删除,以保持本地版本库分支树的干净。我们将issue
分支上的代码,合并到develop
上之后,就可将issue
分支删除。删除issue
分支后的分支树如下:
其中,C8
为合并issue
分支所进行的提交。
删除本地分支,需要用到git branch
命令,且需要-D
参数,具体命令格式为:
1 |
|
具体使用示例如下:
1 |
|
示例中的命令,能够将本地分支develop
删除。
3.删除远程分支
在开发过程中,有时可能由于产品变更,或者版本变更,而需要丢弃远程版本库中某个分支的内容。这个时候,你就需要一系列操作,来确保安全有效地删除远程分支。
两种删除方法
删除分支用到的git
命令是git push
,在具体的使用过程中有不同的用法。
- 通过推送空分支到远程分支,实现删除:
一个删除远程分支的方法是,推送一个空分支到远程指定分支,以实现删除。推送本地分支到远程分支的方法是:
git push 远程主机名 本地分支:远程分支
与之类似,推送空分支实现删除的方法是:
git push 远程主机名 :远程分支
即:
前没有指定本地分支名。具体的使用示例如下:
1 |
|
- 通过
delete
参数删除远程分支:
除了推送空分支到远程分支外,也可以通过delete
参数实现删除。具体的命令格式为:
1 |
|
具体使用示例如下:
1 |
|
4.本地分支合并
在协作开发中,团队中每个人可能都只负责一个模块。所以,很有可能,你在开发过程中,需要用到别人所开发的功能。这个时候就需要将别人分支的内容,合并到你自己的分支;或者,
develop
分支或者master
分支有更新,你也需要将它们的修改,合并到你的分支,以跟上产品开发进程;也有可能你为了解决一个bug
,创建临时分支,完成开发后,需要将其合并到你的分支。这些都需要分支合并的知识。
分支合并需要用到git merge
命令,具体的命令格式为:
1 |
|
在具体使用中,如当前处于master
分支,需要将develop
分支合并到master
分支,则具体的使用方式如下:
1 |
|
同时,分支合并也分为正常合并和快进式合并,通过为git merge
添加参数,即可实现不同操作。
- 快进式合并
具体命令如下:
1 |
|
默认情况下,Git
执行"快进式合并",即fast-farward merge
,会直接将被合并的分支指向需要合并的分支。如下图:
- 正常合并
命令具体如下:
1 |
|
正常合并的方式如下图:
如图所示,Master
分支上产生了一次新的提交,也就是说生成一个新节点完成了合并,这样的话,版本演进更清晰。
示例
下面我们以一个具体的例子,来演示一下这两种合并方式的区别:
- 创建
master
分支,并在其上提交hello
文件; - 从
master
分支切换到新分支develop
,并进行两次提交,分别将hello1
、hello2
两个文件提交到develop
分支; - 切换回
master
分支,执行git merge develop
进行快进式合并,然后查看master
分支的日志,得到如下提示信息:

如上图可知,master
分支多了develop
分支上的两次提交信息。
- 将
master
分支回退到合并前状态,再次执行git merge --no-ff develop
,进行非快进式合并,然后再次查看日志:

四、日志与版本回退
1.回到前一次提交
如果提交到本地仓库中的代码发现了
bug
,就必须将代码回到上一个版本。而在Git
中,一次提交就对应着一个版本,因此可以根据日志信息进行版本回退。
日志的基本用法
在之前,我们已经介绍了git log
的基本使用方法,这里我们要进一步介绍git log
的使用。
- 查看提交的内容差异
git log
提供了-p
参数,用于查看每次提交之间的内容差异。git log -p
即可显示每次提交之间的变化。 - 而如果想限制显示的范围,则可以再添加参数用于限定:
git log -p -2
这样,则仅显示最近的两次更新。 - 其他
git log
选项:- 单词层面对比
Git
提供了--word-diff
选项,可以显示单词层面的差异。当需要在书籍、论文这种很大的文本文件上,进行对比的时候,这个功能就非常有用。 - 显示简要的增改行数
Git
提供了--stat
选项,则可以仅显示增加或者减少了多少行。 pretty
选项 使用--pretty
选项选项,可以指定不同的显示属性,如oneline
将每个提交放在一行显示。short
,full
和fuller
可以指定展示的信息的多少。
- 单词层面对比
git revert实现版本回退
版本回退可以用git revert
命令。git revert
撤销提交时,会保留所撤销的提交的记录和历史,并将撤销操作做为一次新的提交。即提交一个新的版本,将需要revert
的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。其具体的使用方法如下:
* git revert HEAD 撤销前一次 commit * git revert HEAD^ 撤销前前一次
commit * git revert commit
(比如:fa042ce57ebbe5b)撤销指定的版本,撤销也会作为一次提交进行保存
git reset实现版本回退
git reset
也能实现版本回退,但是git revert
和 git reset
也存在一定的区别 :
git revert
是用一次新的commit
来回滚之前的commit
,git reset
是直接删除指定的commit
;- 在回滚这一操作上看,效果差不多。但是,在日后继续
merge
以前的老版本时有区别。因为git revert
是用一次逆向的commit
,“中和”之前的提交,因此日后合并老的branch
时,导致这部分改变不会再次出现。但是git reset
是把某些commit
在某个branch
上删除,因而和老的branch
再次merge
时,这些被回滚的commit
应该还会被引入; git reset
是把HEAD
向后移动了一下,而git revert
是HEAD
继续前进,只是新的commit
的内容和要revert
的内容正好相反,能够抵消要被revert
的内容。
git reset
用法如下:
git reset HEAD
回到前一次commit
。也可以用于将错误的文件添加进暂存区后,想回退取消,如:git reset HEAD 文件名
git reset HEAD^
回到前前一次commit
。
git reset commit
比如:commit = fa042ce57ebbe5b
,回到指定的版本,撤销也会作为一次提交进行保存。
另外git reset
也可以指定reset
的模式:hard
、soft
、mixed
、merged
、keep
。
这几种模式的差别如下:
--soft
缓存区和工作目录都不会被改变;--mixed
– 默认选项。缓存区和你指定的提交同步,但工作目录不受影响;--hard
– 缓存区和工作目录,都同步到你指定的提交。
几种模式的具体使用方法如下:
1 |
|
2.删除文件
在Git使用过程中,涉及到撤回的操作,还有从暂存区或者分支删除文件。比如你错误地将测试过程中产生的日志文件提交到了暂存区或者分支上面去了,那么你可能就需要删除文件。
删除文件需要用到的命令是git rm
,且git rm
有参数--cached
。
当我们需要删除暂存区或分支上的文件,同时工作区也不再需要这个文件了,可以使用:
git rm 文件路径
当我们需要删除暂存区或分支上的文件,但本地又需要使用,
只是不希望这个文件被提交到版本库,可以使用:
git rm --cached 文件路径
简单来说就是,一般情况下使用
git rm 文件路径
;想要保留工作区(本地)的时候,添加--cached。
五、标签
六、高阶操作
参考资料
[1] https://www.educoder.net/paths/41