git基本用法

git基本用法

一、本地仓库操作

1.仓库初始化

1
2
3
mkdir gitTraining
cd gitTraining
git init

2.将修改保存到暂存区

1
2
3
4
#添加所有修改  
git add .
#添加hello.txt文件
git add hello.txt

查看暂存区状态

1
git status

但是如果你不小心把不想添加的东西添加到暂存区,或者想丢弃已经添加的内容,这个时候你该怎么办呢?不用着急,这个时候git checkout命令就可以大显身手了。丢弃添加的内容:

1
git checkout hello.txt  

3.将修改提交到本地仓库

当执行完git commit后,如果你试着执行以下git log你可能会得到如下的输出:

1
2
3
4
5
commit 37302ce99137cf30fabc14784d23ea63cadb928b  
Author: educoder <educoder@163.com>
Date: Sun Dec 24 23:35:48 2017 +0800

添加helloGit.txt

其中:

  • “commit 37302ce99137cf30fabc14784d23ea63cadb928b”中的后面这一串字符就是完整的commit id
  • “Author”就是这次提交的作者,它就是我们在git config中配置的user.name
  • 最后输出的“添加helloGit.txt”,是我们在提交时添加的信息。

如果有多次提交即commit,在执行git log时,会输出每一次的提交的具体信息。这样的话,什么时候(Date)由什么人(Author)提交了什么内容(“添加helloGit.txt”)就一目了然了。

image-20220504195643301

二、远程仓库操作

1.克隆远程版本库

1
2
3
4
##克隆到当前路径
git clone xxx.git
##也可以指定克隆到某个目录
git clone xxx.git "指定目录"

在团队开发中,我们必须选用一台主机做为Git服务器来存放远程版本库。这样团队中的每个开发者,就可以基于一个共同的远程版本库进行开发。目前提供代码托管(即可以将远程版本库存放于其上的)的平台有GithubGitee等,同时我们也可以搭建一台私有的运行Git的服务器,来做为远程Git服务器。Github等平台的使用,及本地Git服务器的搭建,会在后续的实训中具体介绍。本地Git服务器,可以配置不同的连接方式,如shellgitbash。为了给挑战者提供一个便利的实训环境,我们为每个人配置了一台本地Git服务器,并允许以bash方式进行操作,即可以通过类似于/home/sample.git这种形式的地址,做为远程仓库地址进行操作,而不是像https://sample.git这种形式。

2.添加到远程版本库

现在你要自己启动一个项目了,你需要将你的代码保存到远程版本中。那么你要做的第一件事就是,需要为你的本地版本库添加一个远程仓库,然后整个团队才能基于这个远程版本库进行协同开发。

添加远程版本库需要用到的命令是git remote add,其命令格式为:

1
git remote add “远程仓库名” “远程仓库地址”  

使用示例如下:

1
git remote add origin https://sample.git  

这样就将https://sample.git添加为远程仓库,并将其命名为origin。 ###编程要求 本关的编程任务是,补全右侧代码片段中BeginEnd中间的脚本。通过执行你所编写的脚本,来完成为本地仓库添加远程仓库的任务。远程仓库的地址为/tmp/sample.git。具体要求如下:

  • 创建一个本地版本库;
  • 为创建的本地仓库添加远程仓库,且将其命名为git

3.推送本地仓库到远程仓库

推送本地内容时,会将所有未推送至远程仓库的内容,都提到远程仓库。它用到的命令是git push,使用方法如下:

1
git push 远程仓库名 本地分支名 远程分支名  

具体的使用方法如下:

1
git push origin master master  

这样就将本地分支的内容,推送到远程仓库originmaster分支了。

参数-u的作用

git push的另外一种用法如下:

1
git push -u 远程仓库名 本地分支名 远程分支名  

-u参数的作用是,建立起本地master分支和远程master分支之间的对应关系,下一次如果再推送master分支,就可以忽略远程分支名了,如下所示:

1
2
3
4
#初次推送  
git push -u origin master master
#再次推送
git push origin master

4.拉取远程分支到本地

拉取远程仓库的内容到本地,需要使用git pull命令,其命令格式为:

1
git pull 远程主机名 远程分支名 本地分支名  

其使用示例如下:

1
2
#将远程仓库origin的master分支的内容拉取到本地master分支  
git pull origin master:master

pull过程可能产生冲突

但是,在使用过程中,也可能会出现一种情况:远程分支和本地分支对同一内容做了修改,这就会导致将远程分支的修改,合并到本地分支的时候发生冲突。这个时候,可以选择解决冲突,然后合并(解决冲突会在后续的实训中介绍)。也可以选择直接强制拉取,使用远程分支的修改,覆盖本地分支的修改。强制拉取需要用到-f参数,语法格式如下:

1
git pull 远程主机名 远程分支名 本地分支名 -f  

具体的使用示例如下:

1
2
#将远程仓库origin的master分支的内容拉取到本地master分支  
git pull origin master:master -f

三、分支管理

1.创建/切换本地分支

当你进入一个团队,在获得产品的完整代码之后,你首先要做的就是,在本地创建一个属于自己的分支,然后才能在自己的分支上进行开发。

我们在master分支上,进行了C1C2C3三次提交,且当前指针指向C3提交。 一般情况下,我们只会将已经成熟的代码存放到master分支,而将正在开发的代码或者测试版的代码放到其他分支。这时,我们就需要新建分支,以在该分支进行开发。如下图:

image-20220504204122931

当我们在主分支进行了C2提交后,新建了develop分支,并在其上进行了两次提交。此时,工作区指针HEAD指向develop分支。 创建本地分支用到的命令是git branch,而分支切换用到的命令是git checkoutgit 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,而临时创建了一个分支或者分支过于混乱需要丢弃。这时你就需要进行分支删除操作。

本关任务:删除本地分支。

相关知识

现在我们来看一个实际的例子。请看下图:

image-20220504210335362

首先,我们在master工作到 C1,然后开始一个新分支develop分支,做为测试版的代码分支。提交到C5的时候,又需要临时解决一个问题,于是从C5的地方又分出一个分支issue。提交到C7的时候,该issue被解决。issue分支已经失去其意义,则需要将其删除,以保持本地版本库分支树的干净。我们将issue分支上的代码,合并到develop上之后,就可将issue分支删除。删除issue分支后的分支树如下:

image-20220504210346301

其中,C8为合并issue分支所进行的提交。

删除本地分支,需要用到git branch命令,且需要-D参数,具体命令格式为:

1
git branch -D 需要删除的分支的名字

具体使用示例如下:

1
2
#删除develop分支  
git branch -D develop

示例中的命令,能够将本地分支develop删除。

3.删除远程分支

在开发过程中,有时可能由于产品变更,或者版本变更,而需要丢弃远程版本库中某个分支的内容。这个时候,你就需要一系列操作,来确保安全有效地删除远程分支。

两种删除方法

删除分支用到的git命令是git push,在具体的使用过程中有不同的用法。

  1. 通过推送空分支到远程分支,实现删除

一个删除远程分支的方法是,推送一个空分支到远程指定分支,以实现删除。推送本地分支到远程分支的方法是: git push 远程主机名 本地分支:远程分支

与之类似,推送空分支实现删除的方法是:   git push 远程主机名 :远程分支前没有指定本地分支名。具体的使用示例如下:

1
2
#删除远程develop分支,其中origin为远程仓库名  
git push origin :develop
  1. 通过delete参数删除远程分支

除了推送空分支到远程分支外,也可以通过delete参数实现删除。具体的命令格式为:

1
git push 远程主机名 --delete 远程分支名

具体使用示例如下:

1
2
#删除远程develop分支,其中origin为远程主机名  
git push origin --delete develop

4.本地分支合并

在协作开发中,团队中每个人可能都只负责一个模块。所以,很有可能,你在开发过程中,需要用到别人所开发的功能。这个时候就需要将别人分支的内容,合并到你自己的分支;或者,develop分支或者master分支有更新,你也需要将它们的修改,合并到你的分支,以跟上产品开发进程;也有可能你为了解决一个bug,创建临时分支,完成开发后,需要将其合并到你的分支。这些都需要分支合并的知识。

分支合并需要用到git merge命令,具体的命令格式为:

1
git merge 需要合并的分支

在具体使用中,如当前处于master分支,需要将develop分支合并到master分支,则具体的使用方式如下:

1
git merge develop

同时,分支合并也分为正常合并和快进式合并,通过为git merge添加参数,即可实现不同操作。

  • 快进式合并

具体命令如下:

1
git merge --no-ff develop

默认情况下,Git执行"快进式合并",即fast-farward merge,会直接将被合并的分支指向需要合并的分支。如下图:

image-20220504211936606

  • 正常合并

命令具体如下:

1
git merge develop

正常合并的方式如下图:

image-20220504212319049

如图所示,Master分支上产生了一次新的提交,也就是说生成一个新节点完成了合并,这样的话,版本演进更清晰。

示例

下面我们以一个具体的例子,来演示一下这两种合并方式的区别:

  1. 创建master分支,并在其上提交hello文件;
  2. master分支切换到新分支develop,并进行两次提交,分别将hello1hello2两个文件提交到develop分支;
  3. 切换回master分支,执行git merge develop进行快进式合并,然后查看master分支的日志,得到如下提示信息:
image-20220504212558452

如上图可知,master分支多了develop分支上的两次提交信息。

  1. master分支回退到合并前状态,再次执行git merge --no-ff develop,进行非快进式合并,然后再次查看日志:
image-20220504212613766

四、日志与版本回退

1.回到前一次提交

如果提交到本地仓库中的代码发现了bug,就必须将代码回到上一个版本。而在Git中,一次提交就对应着一个版本,因此可以根据日志信息进行版本回退。

日志的基本用法

在之前,我们已经介绍了git log的基本使用方法,这里我们要进一步介绍git log的使用。

  • 查看提交的内容差异 git log提供了-p参数,用于查看每次提交之间的内容差异。git log -p即可显示每次提交之间的变化。
  • 而如果想限制显示的范围,则可以再添加参数用于限定:git log -p -2这样,则仅显示最近的两次更新。
  • 其他git log选项:
    1. 单词层面对比 Git提供了--word-diff选项,可以显示单词层面的差异。当需要在书籍、论文这种很大的文本文件上,进行对比的时候,这个功能就非常有用。
    2. 显示简要的增改行数 Git提供了--stat选项,则可以仅显示增加或者减少了多少行。
    3. pretty选项 使用--pretty 选项选项,可以指定不同的显示属性,如oneline 将每个提交放在一行显示。 shortfullfuller 可以指定展示的信息的多少。

git revert实现版本回退

版本回退可以用git revert命令。git revert撤销提交时,会保留所撤销的提交的记录和历史,并将撤销操作做为一次新的提交。即提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容。其具体的使用方法如下: * git revert HEAD 撤销前一次 commit * git revert HEAD^ 撤销前前一次 commit * git revert commit (比如:fa042ce57ebbe5b)撤销指定的版本,撤销也会作为一次提交进行保存

git reset实现版本回退

git reset也能实现版本回退,但是git revertgit reset也存在一定的区别 :

  • git revert是用一次新的commit来回滚之前的commitgit reset是直接删除指定的commit
  • 在回滚这一操作上看,效果差不多。但是,在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit,“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现。但是git reset是把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入;
  • git reset 是把HEAD向后移动了一下,而git revertHEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。

git reset用法如下:

  • git reset HEAD 回到前一次 commit。也可以用于将错误的文件添加进暂存区后,想回退取消,如:   git reset HEAD 文件名
  • git reset HEAD^ 回到前前一次 commit
  • git reset commit 比如:commit = fa042ce57ebbe5b,回到指定的版本,撤销也会作为一次提交进行保存。

另外git reset也可以指定reset的模式:hardsoftmixedmergedkeep。 这几种模式的差别如下:

  • --soft 缓存区和工作目录都不会被改变;
  • --mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响;
  • --hard – 缓存区和工作目录,都同步到你指定的提交。

几种模式的具体使用方法如下:

1
2
3
4
5
6
#直接丢弃工作区和暂存区的修改  
git reset --hard HEAD
#暂存区内容保留,工作区修改丢弃
git reset --mixed HEAD
#暂存区和工作区内容都保留
git reset --soft HEAD

2.删除文件

在Git使用过程中,涉及到撤回的操作,还有从暂存区或者分支删除文件。比如你错误地将测试过程中产生的日志文件提交到了暂存区或者分支上面去了,那么你可能就需要删除文件。

删除文件需要用到的命令是git rm,且git rm有参数--cached。 当我们需要删除暂存区或分支上的文件,同时工作区也不再需要这个文件了,可以使用: git rm 文件路径 当我们需要删除暂存区或分支上的文件,但本地又需要使用, 只是不希望这个文件被提交到版本库,可以使用: git rm --cached 文件路径

简单来说就是,一般情况下使用git rm 文件路径;想要保留工作区(本地)的时候,添加--cached。

五、标签

六、高阶操作

参考资料

[1] https://www.educoder.net/paths/41


git基本用法
https://wuhlan3.gitee.io/2022/05/01/git基本用法/
Author
Wuhlan3
Posted on
May 1, 2022
Licensed under