获取 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 commitgit cm 等价。

参考

[1] Scott Chacon, Ben Straub, Pro Git.

 posted on 2020-08-01 12:50  x-yun  阅读(41)  评论(0编辑  收藏  举报