Git是一个使用普遍的版本控制工具,这是我根据Git在线文档的学习笔记。有关 Github 的内容,请期待后续文章。

下载

直接点击官网的Download按钮即可

准备工作

设置用户名与邮箱

1
2
$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email you@yourdomain.example.com

导入项目

  1. 如果有tar包,可以使用以下命令:
1
2
3
$ tar xzf project.tar.gz
$ cd project
$ git init # 初始化一个git目录
  1. 记录最初的版本

使用 $ git add . 可以记录当前目录下的所有内容,这些文件会被储存到一个临时的 staging area,Git 的术语叫 “index”。

  1. 最终提交

$ git commit 语句,可以永久地将 index 中的内容存储到 repository 中。

修改项目

修改项目也是同理,总共分三步:

  1. 用文本编辑器,或者 IDE 修改文件
  2. $ git add file1 file2 file3 命令将修改的文件添加到 index 中
  3. $ git commit 命令提交修改,并配上修改的信息

注意

  • 步骤2. 后, 步骤3. 前,可以使用 $ git diff --cached 查看 index 中要被上传的文件信息;

  • 当然也可以使用 $ git status 查看更简略的信息;

status方法

  • 可以使用更简略的 $ git commit -a 命令一次性地完成 stage 所有被修改的文件(不包含新文件),并 commit,一站式完成;
  • 关于 commit 的信息,有两种方式。一种是短的,大约在50个字符以内,用一行完成描述;另一种是较长的,具体格式为,第一行为大标题,第二行为空行,第三行开始时较长的详细描述。

查询项目历史

方法1,用 $ git log 查询,会按由近及远的顺序依次显示修改的简略信息;

方法2,用 git log -p 可以查询到具体的修改内容,如对文件内容的修改,增加、删除了哪些行等;

Log Method 2

方法3,用git log --stat --summary,可以看到每次修改的大致内容,如每个文件增减了多少行等等。

Log Method 3

注意

浏览时,用上下方向键可以调整阅读的区域,要退出,依次输入 wq 即可(虽然不太确定,不过这似乎是 vim 的语法。在这里,冒号已经输入好了,所以我们只需要输入 wq 两个字符)。

管理分支(branch)

创建并切换分支

可以通过 $ git branch 分支名 新建一个分支。

$ git branch 可以浏览现存的所有分支。

$ git switch 分支名 切换分支。(注意 不是 $ git branch switch 分支名

注意

在创建分支之前,务必确保曾经 commit 过一次。查询的方法,可以输入 $ git branch 查看有没有分支,如果列表是空的,则需要 commit。否则会报错:fatal: not a valid object name: ‘master’。参考链接

修改分支

修改分支和修改 master 是一样的流程,参见上文 修改项目

融合分支

融合分支,需要在 master branch 使用 $ git merge 分支名 命令,如果两个分支没有冲突,则融合结束。

如果二者有冲突,则需要通过 $ git diff 命令查看冲突,并直接修改文件夹中的文件。

Conflict cmd

此时要注意,不需要输入其他指令,切换分支,或者退出融合过程,直接修改文件夹中冲突的部分。见下图:

Conflict Txt
修改的时候,不只要修改冲突的内容,也要把类似 <<<<<<<HEAD 的内容也删除,否则这些内容会保留下来。

可以使用 $ gitk 查看图形化的 merge 流程,更加直观。

之后就可以用 git branch -d 分支名 删除实验性的分支了。这种修改,可以保证被删除的分支里的内容完全被融合到 master 中。如果分支中有部分内容未被融合,会提示无法删除。若不顾融合强制删除,则将小写d改为大写,git branch -D 分支名

协作(clone, pull, fetch, merge)

乙克隆了甲的项目,如果在本地,用 $ git clone 地址 仓库名 ,内容与原仓库一模一样。
乙修改了文件,并且 commit 了修改。甲可以通过 $ git pull 地址 master fetch 并 merge 乙的修改,甲可能要处理一些冲突。

如果甲想先看看乙做了哪些修改,可以用 $ git fetch 地址 master 获取到更改,并用 $ git log -p HEAD..FETCH_HEAD 查看乙的修改。HEAD..FETCH_HEAD 意味展示所有 FETCH_HEAD 中的内容但是排除 HEAD 中的内容。
可视化,则可以用 $ gitk HEAD..FETCH_HEAD
如果想看看他们两个人共同修改过的内容,则将两个点改成三个点:$ gitk HEAD...FETCH_HEAD,这样展示了排除相同文件后,甲乙所有的文件。

甲还可以用 $ git remote add 乙 地址 来速写,这样就可以用 $ git fetch 乙 来获取仓库了,而不需要输入一大串地址。相比之下,乙不需要进行这样的操作,因为甲的地址已经在克隆时自动记录了。
对比内容的命令则变为 $ git log -p master..bob/master,其他形式的可以类推。

对于远程克隆,则将地址改为 ssh 协议或者其他协议的地址名即可,只是多了登录的操作。

探索历史

上文已经探讨过 $ git log 的用法,这里更进一步地讨论。

$ git log中,展示的第一行内容是某个 commit 的名字。如

1
2
3
4
5
6
$ git log
commit c82a22c39cbc32576f64f5c6b3f24b99ea8149c7
Author: Junio C Hamano <junkio@cox.net>
Date: Tue May 16 17:18:22 2006 -0700

merge-base: Clarify the comments on post processing.

中, c82a22c39cbc32576f64f5c6b3f24b99ea8149c7 就是这次 commit 的名字。

要查询这个 commit,只需要用 $ git show c82a22c39c 即可。用更长的名字也无妨,但这个长度已经足够分别出不同的 commit。除此之外,还有一些查询方法,如查询某个分支的修改,查询某个分支的 “parent” commit 等等。这里就不一一列出,可以参见教程

还可以通过 $ git tag 标签名 commit名 来给 commit 加标签,这个我认为比较有用。

除此以外的指令,大多比较细枝末节,不再一一列出。

以上就是本文的全部内容。这些都是 Git 最基础的本地操作,还没有涉及到 Github 在线存储的环节。关于后者,请参见后续文章。