Skip to content

Latest commit

 

History

History
390 lines (324 loc) · 13.8 KB

Lecture04.md

File metadata and controls

390 lines (324 loc) · 13.8 KB

git 简介

git 是一个分布式版本控制软件,用于维护代码项目。其本身是 Linus 大佬为了控制 Linux 的内核 版本,又不愿为各种商业版本控制系统左右时,用不到两周的时间用 C 编写的分布式版本控制系统, 但其现在不仅管理着 Linux 内核的开发,也是最流行的分布式版本控制系统。版本控制的意义在于, 我们写一段代码,或者写一个文档,在不断地对其进行修改和更新的过程中记录我们每一次的修改 和更新,从而在出现错误是能够及时找到错误的原因或回到未出错的版本进行修改。市面上如今也有 很多同步协作平台提供本地的自动更新和同步以及版本记录功能,但使用最为广泛的还是 git。

git安装和初始配置

查看是否安装 git which git 使用apt-getyumpacman等方式安装 git,Mac可以使用 homebrew 进行安装

首先进行用户设置

git config --global user.name "name"
git config --global user.email "mail"

直接使用 git config 会显示更多设置选项

创建版本库

版本库也叫仓库(repository,即常说的 repo),其本质上是一个目录文件,其下的所有文件被 git 所管理,每个文件的修改、删除都能被 git 跟踪,从而我们可以在任何时刻追踪文件的历史或将其 还原到某个历史版本。

选择一个我们希望被 git 管理的目录,然后执行

git init

即可将该目录变成 git 可以管理的仓库,可以发现目录下多了一个 .git 目录,里面记录了所有 git 管理的信息,将其删除 rm -rf .git 即可取消 git 对当前目录的管理。 使用

git status

可以方便地查看当前版本库的状态

向版本库添加文件

git 能跟踪版本库内所有文本文件的每次改动,具体到哪一行增删了哪些词都会记录。对于二进制文件, git 只能跟踪其大小的变化。

git有三个特别的区域----工作区,暂存区和头指针。工作区就是我们工作的文件目录,我们实际进行 代码的修改和增删文件都在工作区进行。

使用

git add <filename>

可以将文件的修改添加到暂存区,其中文件名可以使用通配符,如 git add * 可将目录下的所有文件都添加 到暂存区。 使用

git commit -m "comment"

可以将暂存区的文件修改提交到版本库,并将头指针HEAD指向当前提交,comment 部分用来解释本次提交 的代码改动说明,方便日后查看。

git diff

可以告诉我们当前版本库和 HEAD 所指向的提交间进行了何种修改。

文件的增删在 git 中也对应着文件的修改,从版本库中删除文件需要使用

git rm <filename>

上面的命令会将文件从版本控制中移除,并将本地的文件删除。 如果不使用这个命令,而只是把文件从本地删除,那么该文件还是在版本控制中。 想查看版本控制中所有的文件,可以使用 git ls-files

版本穿梭

在我们进行了多次提交后,可以使用

git log

来查看每次提交的细节,使用 git log --pretty=oneline 可以查看简化版的输出信息。其中包含了每次 提交的 commit id 和说明的内容。 git中使用 HEAD 指向当前的版本,HEAD^ 指向上一个版本,HEAD~10 指向向上10个版本。 通过

git reset --hard HEAD^

可以将版本回退至上一次提交的版本,同理可回退至前若干个版本。 通过

git reset --hard <commit id>

可以将版本跳跃至对应的 commit id 的提交版本,但是 git log 不会显示当前版本之后的提交内容, 使用

git reflog

可以查看我们执行过的每条命令,从而找到我们目标版本的 commit idgit reset--hard 参数表示 强行将 HEAD 指针指到 <commit id> 对应的版本。通过 git reset --help 可以查看其更多的操作参数,如 --soft--mixed--merge 等。

git 管理的是文件的修改,而非文件本身。我们每次使用 git add 会将当前的修改放进暂存区,而后续继续 对文件的修改则需要新的 add 操作。可以通过 git checkout -- <filename> 放弃对工作区内文件的修改,通过 git reset HEAD <filename> 放弃暂存区内文件的修改。

有时觉得查找 <commit id> 太麻烦,可以给当前的提交添加一个标签,通过

git tag <tagname>

添加标签。标签通常标记比较重要的版本更新,从而可以在之后的开发中快速找到之前的稳定版本。所有提交操作 的 <commit id> 部分都可以替换为对应的标签。

git 的分支管理

git 最有特色的功能之一就是其分支管理功能, git 将每次提交串成一条时间线,每条时间线被称为一个分支,默认情况下有一条主分支 master。多人协作时,为了 不妨碍他人的工作,可以创建新的分支进行修改,在修改完成后再和 master 分支合并。

创建与合并分支

通过

git branch dev
git checkout dev

可以创建一条新的名为dev的分支并指向它。也可以使用git checkout -b dev一步完成这个操作。 通过git branch可以查看所有的分支,当前分支前会有一个*号。现在我们所有的提交都会在dev分支上进行, 当我们完成所有修改并提交后,使用

git checkout master

切换回master分支,再查看修改的文件会发现所有在dev上的修改都看不到了,通过

git merge dev

可以将 devmaster 合并。然后可以通过

git branch -d dev

删除 dev 分支,再用 git branch 查看就只有 master 分支了。

解决冲突

如果我们在新分支提交后切换回master又做了新的提交,这时合并二者会出现冲突,需要我们手动解决冲突 后进行合并。git status会告诉我们存在冲突的文件,打开对应文件会发现git使用<<<<<<<,======= >>>>>>>标注出了不同分支的内容,将文件修改成我们需要的内容后再进行addcommit即可解决冲突。 通过git log --graph可以看到分支合并的情况。

远程仓库

git 的最突出特点之一就是远程仓库,可以将一台电脑的 git 仓库方便地克隆到其他电脑里。GitHub 就是著名的 免费提供 git 仓库托管服务的网站,注册 GitHub 账号即可免费获得 git 远程仓库。本地的 git 仓库和 GitHub 仓库间 的传输通过 SSH 或 HTTPS 协议进行,使用 SSH 时需要先进行 SSH-Key 的设置。

  • 创建ssh key
ssh-keygen -t -rsa -C <email>
  • 在主目录下找到 .ssh 目录,找到 id_rsa.pub 文件
  • 登陆 GitHub,在 Settings->SSH Keys 页面添加 id_rsa.pub 的内容
  • 使用测试命令 ssh [email protected] 进行测试。出现以下提示信息表示成功。
    Hi (YourName)! You've successfully authenticated, but GitHub does not provide shell access.
    Connection to github.com closed.
    

添加远程库

在 GitHub 上创建一个新的仓库,创建页面会提示使用

git remote add origin [email protected]:username/repo.git

或者

git remote add origin https://github.com/username/repo.git

在本地链接远程库,通过

git push -u origin master

将本地的 master 分枝推送到远程,第一次使用是会有验证 GitHub 服务器的 SSH Key 的警告,输入 yes 来将 GitHub 服务器 的 SSH Key 添加到本地的信任列表里。

从远程库克隆

通过

git clone <url>

的方式可以将远程库克隆到本地。通过git push origin master可以向其推送分支,通过git fetch可以获取最新 版本的版本库。

多人协作

当我们从远程仓库克隆时,git 自动把本地的master分支和远程的master分支对应,远程仓库默认名称 为origin,通过

git remote -v

可以查看远程分支的详细信息。

通过

git push origin master
git push origin dev

等可以向远程仓库推送对应的分支。多人协作时,远程分支可能在你推送时已经更新过,这时会出现推送失败的提示, 使用

git pull

将远程的分支抓取到本地试图合并(其本质是git fetch然后merge),若有冲突还需手动解除冲突,在本地完成合并和提交后再次push即可。

git pull可能会提示no tracking information的错误,需要使用

git branch --set-upstream-to <branch-name> origin/<branch-name>

将本地的分支与远程的分支链接。

更多 git 的使用细节可以从https://book.git-scm.com/获取更为详细的 git 使用手册, 廖雪峰的 Git 教程 也是相当简明易懂的 git 教学网站(本文档 git 部分参考了此网站内容)。

Git Attributes

要慎重使用,无论是crlf还是lfs

Git Ignore

使用时要小心,之后添加文件有些可能需要手动添加,git add -f

使用时发现的问题

本地有修改时,git pull不能直接用,但git push仍然可以用。 git checkout 也不能用,git stash可以用。 git stash常与git stash pop配套使用,用于临时保存


Doxygen

Doxygen 是为软件生成说明文档的工具。

安装 Doxygen

Doxygen 的官方下载页面提供了多种安装方案

可以通过 clone 他们的 git repo 得到他们最新的测试版本

git clone https://github.com/doxygen/doxygen.git
cd doxygen

mkdir build
cd build
cmake -G "Unix Makefiles" ..
make
make install

也可以下载最新的发行版本,他们提供了源码版,二进制版,Windows 版和 Mac OS 的 dmg 安装文件 以源码版为例,我们下载doxygen-1.8.14.src.tar.gz文件解压

tar -czvf $PATHOF(doxygen-1.8.14.src.tar.gz)
cd doxygen-1.8.14
mkdir build
cd build
cmake -G "Unix Makefiles" ..
make
make install

我们还可以从安装文件生成 Doxygen 的使用说明文档,回到build目录

cmake -Dbuild_doc=YES ..
make docs

我们可以得到htmllatex两种格式的说明文档,到html目录下,打开任意一个html 文件即可在浏览器中以html的形式浏览Doxygen的使用说明文档;在latex目录下进行编译 即可得到其pdf格式的说明文档。

生成项目说明文档

Doxygen通过专用的配置文件生成代码的说明文档,可以通过

doxygen -g <config-file>

生成一个配置文件的模板。Doxygen的配置文件采用<TAGNAME>=<VALUE>的结构,与 Makefile 的结构 类似。模板中有对每一个标记的详细说明,其中以下标记较为重要

  • <OUTPUT_DIRECTORY>: 这个标记定义生成的说明文档放置的位置,可以使用相对路径
  • <INPUT>: 这个标记记录需要生成说明文档的源代码的位置,可以使用多个以空格分隔的路径,可以使用相对路径
  • <FILE_PATTERNS>: 这个标记定义 doxygen 搜索源文件的后缀名
  • <RECURSIVE>: 这个标记值为 YES 时,doxygen 会递归地搜索整个 INPUT 目录的层次结构并提取信息
  • <EXTRACT_ALL>: 这个标记设置为 YES 时,doxygen 会对所有的类和函数提起信息,即使其没有说明文档。

编辑完配置文件后,通过

doxygen <config-file>

即可得到htmllatex两种格式的说明文档文件,用浏览器打开html目录下的index.html文件即可查看说明文档。 latex格式的说明文档需要进一步编译为pdf格式。

简单的代码内说明语句

C 风格的代码说明语句可以有如下几种形式

/**
 * ...text...
 */
/*!
 * ...text...
 */
///
/// ...text...
///
//!
//! ...text...
//!
/***************************//**
 * ...text...
 ******************************/
////////////////////////////////
/// ...text...
///////////////////////////////

doxygen对代码的说明通过注释模块来实现,对于C风格的代码,其基本格式如下

/*! \class Text
    \brief A test class.

	A more detailed description
*/

其中\class用于类的注释,还有许多其他类型注释如下

  • \struct用于C结构体注释
  • \fn用于函数的注释
  • \var用于变量的注释
  • \def用于宏的注释
  • \typedef用于定义的注释
  • \file用于文件的注释
  • \namespace用于命名空间的注释

更为详细和进阶的 doxygen 使用方法可以查看我们在安装时生成的说明文档。


对 doxygen 的补充

默认用 doxygen -g 可以生成配置文件 Doxyfile ,修改后通过 doxygen Doxyfile 即可生成文档。 (或者如果配置文件是使用默认的 Doxyfile的话,直接用doxygen命令也可以生成文档) 要生成pdf文档,可以到文档的latex目录下用 make 编译,即可生成refman.pdf 文档。 也可以到html目录中,打开网页,然后将网页打印为pdf文件上输出。 生成pdf文档后,可以打开观看,在Linux上可以用轻量级的evince软件来阅读。 所有这些命令,都可以写在makefile中,包括预览pdf的命令。

/** \file */
/**
  * \author The Writer
  *
  * email: mailto:[email protected] or <mailto:[email protected]>
  * or [email protected]
  */
void fie(void);
/**
  * \author The Writer
  * (mailto:[email protected]) or (<mailto:[email protected]>)
  * or ([email protected])
  */
void fie1(void);

See also the doxygen manual: http://www.doxygen.nl/ especially: