Git 学习笔记(一)

话说使用Git也有三个多月了,之前一直在用SVN管理代码。重复的敲了这么久的commit&add指令,其实并没有真正理解其中的含义,系统的学习和整理一些知识,才能构建自己的知识体系。于是找来官方的文档,打算好好看一下。其实相关的学习在一周前已经完成了,一直没有整理出来。本篇的知识主要来自Pro Git的前两章,”分支”我打算单独记一篇,毕竟是Git的杀手锏。

配置和初始化

1
2
git config --global user.name  配置提交的用户名
git config --global user.email 配置提交的邮箱地址

–global选项用来配置全局设置,用户和邮箱设置好后,在配置好基本的信息后,在每一次提交时,系统都会自动的带上作者信息。

完成配置后,选择需要进行版本管控的文件目录执行下列指令

1
git init 创建.git子目录。.git可以用来跟踪文件版本信息。

文件的生命周期

你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。 已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。 工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。 初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。

添加文件与克隆

1
2
3
4
5
6
git add *.c 添加后缀为.c的文件
git add LICENSE 添加版权信息
git commit -m "msg"

git clone [url] 克隆远程服务器上几乎所有的文件以及过往的历史版本。
git clone [url] [filename] 自定义克隆到本地仓库的名字。

查看文件状态

1
2
3
git status 查看文件的状态
git status -s 得到状态的简写状态
git status --short

几种状态:

  • nothing to commit, working directory clean : 所有更改均已提交
  • Untracked files: 未被跟踪文件
  • Changes to be committed: 使用add添加未跟踪文件后还未commit
  • Changes not staged for commit: 已跟踪文件修改后未commit

忽略文件 .gitignore

*.[oa] 忽略所有以.o和.a结尾的文件。 一般这类对象文件和存档文件都是编译过程中出现的。
*~ 忽略所有~结尾的文件 许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。
文件 .gitignore 的格式规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

分析文件差异

git diff 当前做的哪些更新还没有暂存? 有哪些更新已经暂存起来准备好了下次提交?

与git status的区别: 通过文件补丁的格式显示具体哪些行发生了改变

git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因

git difftool 分析文件差异,可视化工具

提交和删除

git commit 这种方式会启动文本编辑器以便于编辑本次提交说明。

可以使用git commit -m “msg”的方式来一起提交

git add 用来将文件添加到缓存区,便于详细的编辑提交信息。但有时过于繁琐,可以使用

git commit -a -m “msg”来跳过缓存区使用缓存区

git rm README.md 移除文件,如果删除前已经使用git add 放到了暂存区。必须使用强制删除选项git rm -f (force)这样的数据不能被git恢复

另一种情况,当不希望文件被追踪。但仍然希望保留在当前目录,如果忘记添加到.gitignore不小心把一大堆 .a 文件添加到了暂存区。

使用–cached 选项

1
2
3
4
5
6
7
8
9
git rm --cached README

git rm log/\*.log删除log/目录下,以.log为扩展名的所有文件
git rm \*~删除以~结尾的所有文件

git mv README.md README对文件进行改名相当于执行了以下三条指令:
mv README.md README
git rm README.md
git add README

查看历史

1
2
git log 查看提交历史
git log -p -2 查看最近两次提交的差异历史

-p 选项用来显示每次提交的内容差异

-2 用来仅显示最近两次提交

这个选项适用于查看团队其他成员提交代码时的更改,也可以使用下面的指令来查看简要信息:

1
2
3
4
5
git log --stat

git log --pretty=oneline 将每个提交信息放在一行显示,还有short full fuller可以用

git log --pretty=format:"%h - %an :%s" 按格式显示提交信息

查看远程仓库

1
git remote -v 查看配置的远程仓库列表

添加远程仓库

1
git remote add <shortname> <url>添加一个远程git仓库,同时指定一个方便检索的url

从远程仓库中抓取与拉取

1
git fetch [remote-name]

如果你使用clone命令克隆了一个仓库,命令会自动将其添加为远程默认仓库并默认以“origin”为简写。git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。fetch命令会将数据拉取到你的本地仓库,他并不会自动合并或修改你当前的工作,当准备好时你必须手动将其合并入你的工作

1
git pull抓取然后合并远程分支到当前分支

默认情况下,git clone 命令会自动设置本地master分支跟踪克隆的远程仓库的master分支(或不管是什么名字的默认分支)运行git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。

推送到远程仓库

1
git push origin master

推送成功的前提是服务器仓库没有更新,否则需要先git pull 拉取合并后再推送才能成功。

查看远程仓库

1
git remote show origin

远程仓库的重命名与移除

1
git remote rename <old name><new name>

移除远程仓库

1
git remote rm <name>

列出标签

1
git tag

列出某一系列的标签

1
git tag -l "v1.8.5*" 使用通配符查看V1.8.5系列

创建标签

1
2
3
4
git tag -a v1.4 -m "msg" 创建附注标签
git show v1.4 查看标签和对应的信息

git tag v1.4 轻量标签

后期打标签

1
2
git log --pretty=oneline 列出提交历史
git tag -a v1.4 9fc1b02 需要在末尾指定校验和或(9fc1b02 )部分检验和

共享标签

默认情况下,git push命令并不会传送标签到远程服务器仓库上,在创建完标签后必须显示的推送标签到共享服务器

1
git push origin [tagname] git push origin v1.5

也可以使用–tags选项一次推送很多标签,这将会把所有不在远程仓库服务器上的标签全部传送到那里

1
git push origin --tags

检出标签

在git中并不能真的检出一个标签,因为他们不能像分支一样来回移动。如果想要工作目录与仓库中特定的标签版本完全一样,可以使用

1
2
git checkout -b [branch name]  [tag name]
git checkout -b version2 v2.0.0

如果在这之后又进行了一次提交,version2分支会因为改动向前移动,version2会与标签v2.0.0不同。