获取 git 仓库
在现有目录中初始化仓库
git init
在当前目录下创建一个名为 .git 的子目录,里面含有 git 仓库必需的所有文件。
克隆现有的仓库
git clone url [customize name]
默认配置下,远程 git 仓库中的每个文件的每个版本都将被拉取下来。[customize name] 可选,没有则在当前目录中建立和 url 中项目相同的目录名;如果加上了,则在当前目录下创建名为 [customize name] 的子目录,里面存放从远程仓库复制的所有内容。
记录仓库变化
文件状态变化周期
工作目录中的每个文件只有两种状态:已跟踪 和 未跟踪。已跟踪文件指已被 git 纳入控制的文件,其他的文件属于未跟踪文件。当克隆一个远程 git 仓库到本地时,存放远程 git 仓库的目录中,所有文件属于已跟踪文件,并且是未修改状态。
- 没有被 git 管理的文件或目录属于未跟踪状态,这种类型的文件使用
git add 文件名
命令后,被 git 纳入管理,文件状态从 未跟踪 变为 已暂存 。 - git 管理的文件,在提交后没有进行任何修改,或者是刚从远程仓库复制下来的文件处于未修改状态。当文件内容发生变化时,文件状态会变为已修改。未修改状态的文件,使用
git rm --cached 文件名
命令后,文件的状态变为未跟踪。也就是说,该文件仍然在磁盘中,但是已经脱离了 git 的管理。 - 已修改状态的文件,使用
git add 文件名
命令后,文件状态变更为已暂存。这种状态的文件,表示已准备好提交到 git 仓库中,但还没有提交。 - 处于已暂存状态的文件,使用
git commit
命令后,会将文件提交给 git 仓库,文件内容的变化永久保存在 git 仓库中,然后文件的状态变为未修改。
查看当前文件的状态
使用 git status
会显示文件的状态信息。
Untracked files 这行信息下面的文件处于未跟踪状态。
Changes to be committed 这行信息下面的文件处于已暂存状态。
Changes not staged for commit 这行信息下面的文件内容已修改,未放到暂存区,处于已修改状态。
git status -s
/ git status --short
紧凑输出文件状态。
标志说明:
?? 未跟踪文件
A 新加到暂存区的文件
左M 已修改并且已放入暂存区的文件
右M 已修改并且未放入暂存区的文件
MM 文件修改且放入暂存区后,此文件又被修改了
忽略文件
.gitignore
文件中存放 git 应忽略的文件的模式,git 会忽略与这个文件中模式匹配的所有文件。
格式规范:
- 空白行和以 # 开头的行被 git 忽略
- 可以使用标准 glob 模式匹配
- 以 / 开头防止递归
- 以 / 结尾指定目录
- 在模式前面加上 !,表示忽略指定模式以外的文件或目录
查看已暂存和未暂存的修改
git diff
查看相较于最近一次提交或暂存的文件内容,当前文件内容的变化。
git diff --staged
/ git diff --cached
查看已暂存状态的文件中修改了的内容。也就是将要提交到 git 仓库的文件中修改了的内容。
提交更新
git commit
将所有处于暂存状态的文件提交到 git 仓库中,同时启动文本编辑器,用于书写本次提交的描述内容。
git commit -v
启动文本编辑器时,显示文件改变了的详细内容。
git commit -m '描述内容'
提交的同时写入本次提交的描述内容(说明)。
跳过暂存区域
git commit -a
将所有被 git 管理的文件状态变更为已暂存,然后全部提交到 git 仓库中。
移除文件
git rm 文件名
将 git 管理的文件移除,文件状态变更为未跟踪,同时,将其从磁盘上删除。
git rm --cached 文件名
将 git 管理的文件状态变更为未跟踪,不再被 git 管理。这个文件仍然在原本的目录中,只是不再被 git 管理。
移动文件
git mv 旧文件名 新文件名
更改文件的名字。
查看提交历史
git log
列出每次提交时的校验和、作者和提交日期等信息。
git log -p
显示每次提交时的内容差异。
git log --stat
显示每次提交时文件变化的统计信息,如内容变化的文件数量,文件内容新增行数、已删除行数。
git log --pretty=oneline/short/full/fuller
指定使用不同的格式显示提交历史。
git log --pretty=format:"%h - %an - %ar - : %s"
根据自定义格式显示提交历史。格式有
- %H/h 提交 hash 值
- %T/t 树 hash
- %P/p 父 hash
- %an 作者名
- %ae 作者电邮
- %ad 作者日期
- %ar 作者相对日期
- %cn 提交者名
- %ce 提交者电邮
- %cd 提交者日期
- %cr 提交者相对日期
- %s 提交信息
git log --graph
以树的形式显示提交历史。
限制输出长度
git log --since=日期
显示从指定日期到当前的提交历史。
git log --author=作者名
显示指定作者的提交历史。
git log --grep
显示提交信息与指定关键字匹配的提交历史。
git log -S [str]
显示的提交历史中,包含的文件内容变动必须包括指定字符串,要么修改要么删除。
撤销操作
git commit --amend
当前提交会覆盖掉上一次提交,上一次提交不会留下历史记录。
取消暂存的文件
git reset HEAD 文件名
将指定的已暂存文件状态变更为未跟踪。
撤销对文件的修改
git checkout -- 文件名
将指定文件的内容恢复到最近一次提交或暂存时的状态。修改的内容会丢失,尽量不用。
使用 git restore 撤销
git restore --staged 文件名
将指定的已暂存文件变更为未跟踪状态。该文件的内容不会发生变化。
git restore 文件名
将指定文件的内容恢复到最近一次暂存或提交时的状态。
远程仓库的使用
git remote
列出所有指定过的远程服务器的别名。
git remote -v
列出远程服务器的别名和对应的 url。
git remote add 别名 url
添加一个远程 git 仓库,同时为这个仓库取一个别名,别名代指仓库的 url。此时仅仅指定了别名,并没有从远程仓库拉取数据。
git fetch 别名
从仓库拉取本地没有的数据。并不会自动将拉取的数据和本地已有的数据合并,需要手动合并。
git pull
拉取远程默认分支中本地没有的数据合并到当前分支中。
git push 别名 分支名
将本地数据推送到指定远程仓库的指定分支上面去。必须保证远程仓库中的内容在最后一次拉取后没有变化才能成功。如果有其他人推送了数据,需要从远程仓库拉取这些数据和本地的数据合并后,再推送才可能成功。
git remote show 别名
查看远程仓库的信息。
git remote rename 旧别名 新别名
给远程仓库重新命名。
git remote rm 别名
/git remote remove 别名
从本地移除远程仓库,和该仓库关联的所有分支和信息都会被删除。
打标签
git tag
列出已有标签
git tag -l "[通配符]"
显示所有匹配的标签。如 git tag -l "v1.*"
显示所有 1.x 版本。
git 有两种类型的标签,轻量级(lightweight)标签和附注(annotated)标签。轻量级标签像一个不可更改的分支,本质上是一个特定的提交。附注标签则是一个存储在 git 数据库中的完整对象,包含标签名、电邮、日期及标签信息等内容的检验和。
git tag -a 标签名 -m 描述信息
创建一个附注标签。
git show 标签名
显示标签相关的信息。
git tag 标签名
创建一个轻量标签,实质是将提交的检验和存储到一个文件中,不提供其他信息。
git tag -a 标签名 提交的检验和(完整的或部分的)
给某个特定提交打标签。
git push
不会自动将标签推送到远程服务器,需要额外命令推送标签到远程服务器。
git push 别名 标签名
向远程仓库推送指定标签。
git push 别名 --tags
向远程仓库推送所有本地有而远程仓库没有的标签。
git push 别名 --follow-tags
向远程仓库推送所有的附注标签。不能仅推送轻量级标签。
git tag -d 标签名
删除本地指定的标签,不影响远程仓库中的标签。
git push 别名 :refs/tags/标签名
删除远程仓库中指定的标签。
git push 别名 --delete 标签名
删除远程仓库中指定的标签。
git checkout 标签名
查看特定标签创建时,所有被管理文件的状态及内容。
git 别名
git config --global alias.别名 命令名
为命令起别名。如使用 git config --global alias.cm 'commit'
后,git commit
和 git cm
等价。
参考
[1] Scott Chacon, Ben Straub, Pro Git.