《Pro Git》读书笔记

Posted by YinChangdao on December 15, 2017

Git保证完整性

  • Git 中所有数据在存储前都计算校验和,然后以校验和来引用。SHA-1散列(hash, 哈希). 这是一个由40个十六进制字符组成的字符串,基于 Git 中文件的内容或目录结构计算出来。
  • Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

初次运行Git前的配置

  • 设置用户信息

$ git config --global user.name "#NAME#"  
$ git config --global user.email #NAME@example.com#

获取Git仓库

在现有目录中初始化仓库

若需使用Git来对现有的项目进行管理,只需进入该目录并输入:

$ git init    

该命令将创建一个名为.git的子目录

克隆现有的仓库

$ git clone #url#    这会在当前目录下创建一个需要克隆的仓库的目录,并在这个目录下初始化一个 ***.git*** 文件夹,从远程仓库拉取的所有数据放入 ***.git*** 文件夹,然后从中读取最新版本的文件的拷贝。  

记录每次更新到仓库

检查当前文件状态

$ git status
$ git status -s   

跟踪新文件

git add 命令可以用来开始跟踪新文件,也可以把已跟踪的文件放到暂存区,还可用于合并时把有冲突的文件标记为已解决状态等。将这个命令理解为 ‘添加内容到下一次提交中’ 而不是 ‘将一个文件添加到项目中’ 要更加合适。

$ git add #FILE#    

暂存已修改的文件

修改一个已被跟踪的文件,运行 git status 命令后,这个文件将出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但是还没有放到暂存区。要暂存这次更新,需要运行 git add 命令。文件放到暂存区后,假设此时,再修改这个文件,重新编辑后,再运行 git status 将会发现这个文件同时出现在暂存区和非暂存区。原因是Git只不过暂存了运行 git add 时候的版本,需要再次运行 git add 把最新版本重新暂存起来,然后 git commit.

忽略文件

可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。

$ cat .gitignore  
$ *.[oa]  
$ *~   

查看已暂存和未暂存的修改

  • 若要知道具体修改了文件的什么地方,可以用 git diff 命令。
  • 不带参数的 git diff 可以直接查看尚未暂存的文件更新了哪些部分。
  • 若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff –cache 或者 git diff –staged

提交更新

$ git commit -m "#DESCRIPTION#"

跳过使用暂存区域

  • git commit 加上 -a 选项,Git就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤.
$ git commit -a

移除文件

  • 从Git中移除某个文件,就必须要从已跟踪文件清单中移除,然后提交。手动移除文件后需要再运行 git rm 记录此处移除文件的操作。
  • 当我们想把文件从Git仓库中移除(即从暂存区域移除), 但仍然希望保留在当前工作目录,只是不希望Git继续跟踪。可以使用 –cached 选项。
$ git rm --cached #FILE#
  • 删除以 suffix 结尾的所有文件
$ git rm \*#suffix#

移动文件

  • 在Git中对文件改名
$ git mv #FILE_FROM# #FILE_TO#
  • 实际上 git mv 相当于运行了下面3条命令:
$ mv #FILE_FROM# #FILE_TO#
$ git rm #FILE_FROM#
$ git add #README#

查看提交历史

  • -p 选项用来查看提交文件的差异,-2 选项用来查看最近两次提交日志。 –stat 可以查看每次提交的简略统计信息。
$ git log -p -2
  • 定制要显示的记录的格式
$ git log --pretty=format:"%h - %an, %ar : %s"

撤销操作

  • 当提交到暂存区后发现忘记提交部分文件或者想要修改提交信息时,可以运行 -amend 重新提交,这将代替第一次提交的结果。
$ git commit --amend

取消暂存的文件

  • 将暂存的文件改为非暂存状态。
$ git reset HEAD #FILE#

撤销对文件的修改

  • 将已修改的文件还原为上次提交的样子。
$ git checkout -- #FILE#

远程仓库的使用

查看远程仓库

$ git remote -v    

添加远程仓库

  • 添加一个远程仓库,同时指定一个可以轻松引用的简写:
$ git remote add #shortname# #url#

从远程仓库中抓取与拉取

  • 使用 fetch 执行完后,将可以拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
$ git fetch #remote-name#   

推送到远程仓库

$ git push #REMOTE-NAME# #BRANCH-NAME#  

查看远程仓库更多信息

$ git remote show #REMOTE-NAME#  

远程仓库的移除与重命名

$ git remote rename #OLD_NAME# #NEW_NAME#  
$ git remote rm #REMOTE_NAME#  

打标签

列出标签

$ git tag
$ git rag -1 'v1.8.5*'    

创建标签

  • 标签类型: 轻量标签(lightweight)、附注标签(annotated)

附注标签

$ git tag -a v1.0 -m 'SOME MESSAGE'   * 查看标签信息  
$ git show v1.0  

轻量标签

  • 轻量标签没有保存其他信息
$ git tag v1.0

后期打标签

  • 对过去的提交打标签,在命令的末尾指定提交的校验和(或部分校验和)
$ git tag -a v1.0 #SHA-1#

共享标签

  • 默认情况下,git push 命令并不会传送标签到远程仓库服务器上,在创建完标签后必须显示的推送标签到共享服务器上。
git push origin v1.5
  • 若想一次性推送很多标签,可以使用带有 –tags 选项的 git push 命令。这将会把所有不再远程仓库服务器上的标签全部传送到那里。
$ git push #origin# --tags  

检出标签

  • 在 Git 中不能真的检出一个标签,标签并不能像分支一样来回移动。若想工作目录与仓库中特定的标签版本完全一样,可以在特定的标签上创建一个新分支.
$ git checkout -b #BRANCHNAME# #TAG_NAME#  

定义别名

  • 例如给 commit 定义别名为 ci
$ git config --global alias.ci commit
$ git config --global alias.last 'log -1 HEAD'