Git初步探索

By | 2017年8月31日

Git在管理代码上真的很方便,这里总结了一些基础知识,忘记了可以查一查。

.git

所有文件,包括本地仓库和配置文件等等都在.git这个文件夹中,我们通过ls命令看到的是当前分支的文件而已,其实也是从.git中取出来的。

文件的三种状态

  • 已提交(committed):表示文件已被安全地保存在本地仓库中
  • 已修改(modified):表示文件被修改,但没有被暂存,更没有提交
  • 已暂存(staged):表示文件已被暂存,下次提交时将会在提交清单中并被保存在本地库中

使用Git管理项目时,文件都在三个区域流转:工作目录、暂存区域、本地仓库。

Git基本工作流程:
  1. 在工作目录中修改某些文件.
  2. 对修改后的文件进行快照,然后保存到暂存区域。
  3. 提交更新,将保存在暂存区域的文件快照永久转储到Git目录中。

Git配置文件

有三个地方可以配置:

  • /etc/gitconfig git config --system
  • ~/.gitconfig git config --global
  • .git/config git config [--local]

初始化git仓库

  1. 若要手动建立一个新的使用Git管理的项目,执行git init,在当前目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中,然后通过git add跟踪需要管理的文件。
  2. 通过git clone一个远端仓库。指令为git clone url(http或https或ssh) 本地仓库名,它会将服务器上所有分支,所有文件的所有版本都克隆到本地来。

文件的状态循环

初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。

  • git status :查看当前文件状态
  • git add:跟踪一个新文件,实际上也将其暂存起来。后面接文件名或路径,若是路径则表示递归跟踪路径下的所有文件。
  • .gitignore:列出要忽略的文件模式,符合该模式的文件不会出现在未跟踪文件列表中。
  • .gitignore 的格式规范如下:
    • 所有空行或者以注释符号#开头的行都会被 Git 忽略。
    • 可以使用标准的 glob 模式匹配。匹配模式最后跟斜杠(/)说明要忽略的是目录。要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
    • 所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符;问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如[0-9] 表示匹配所有 0 到 9 的数字)。
  • git diff:不接任何参数,比较当前工作目录下文件和暂存区快照间的差异,若暂存区没有快照,则比较当前的和上次提交后的快照间的差异。
  • git diff --cached(--staged):比较暂存区和上一次提交的快照间的差异。
  • git commit -m “更新说明”:通过一行命令就完成提交更新

移除文件

  • git rm:将文件从Git仓库,跟踪清单中删除,也会将文件从当前工作目录中删除
  • git rm --cached:仅将文件从Git仓库中,跟踪清单中删除,但保留在本地工作目录中

重命名文件

  • $ git mv file_from file_to
    实际上等同于:
  • $ mv README.txt README
    $ git rm README.txt
    $ git add README

要记得在提交前删除老的文件名,再添加新的文件名。

查看提交历史

  • git log

常用的选项及其释义:

-p #按补丁格式显示每个更新之间的差异。
--stat #显示每次更新的文件修改统计信息。
--shortstat #只显示 --stat 中最后的行数修改添加移除统计。
--name-only #仅在提交信息后显示已修改的文件清单。
--name-status #显示新增、修改、删除的文件清单。
--abbrev-commit #仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
--relative-date #使用较短的相对时间显示(比如,“2 weeks ago”)。
--graph #显示 ASCII 图形表示的分支合并历史。
--pretty #使用其他格式显示历史提交信息。可用的选项包括 oneline
#,short,full,fuller 和 format(后跟指定格式)。

撤销操作

  • git commit --amend:撤销刚才的提交,重新编辑提交说明,重新提交暂存区的快照。
  • git reset HEAD 文件名:取消暂存该文件,即删除暂存区中该文件快照,避免commmit时提交上去。
  • git checkout 文件名:取消对文件的修改,该文件必须是修改后但没有暂存的。

远程仓库的使用

  • git remote:查看当前配置下的远程仓库
  • git remote -v:查看当前配置下的远程仓库及地址
  • git remote add [shortname] [url]:添加远程仓库
  • git fetch [remote-name]:此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。
    • 如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以git fetch origin会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
    • 如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用git pull命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。实际上,默认情况下git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
  • git push [remote-name] [branch-name]:将本地仓库的数据推送到远端仓库。只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。
  • git remote show [remote-name]:查看远端仓库的详细信息
  • git remote rename:修改远端仓库在本地的简短名称
    例:$ git remote rename pb paul
  • git remote rm:移除远端仓库(我觉得是移除远端仓库在本地的数据)

标签的使用

  • git tag:列出已有标签
  • git tag -a:新建含附注型标签
    例:$ git tag -a v1.4 -m 'my version 1.4'
  • git show:查看标签版本信息
  • git tag -s:签署标签
    例:$ git tag -s v1.5 -m 'my signed 1.5 tag'
  • git tag 标签名:新建轻量级标签
  • git tag -v [tag-name]:验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证。
  • git push origin [tagname]:分享标签到远端仓库
  • git checkout branchname tagname:将代码回退到标签并建立新分支

发表评论

电子邮件地址不会被公开。 必填项已用*标注