Progit 阅读笔记

155 阅读2分钟

git是怎样一个系统

直接记录快照,而非差异比较

近乎所有操作都是本地执行

Git 保证完整性

Git 一般只添加数据

Git三种状态

1)已提交 committed 表示修改了文件,但还没保存到数据库中

2)已修改 modified 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中

3)已暂存 staged 已提交表示数据已经安全地保存在本地数据库中

Git工作流程

1)在工作区中修改文件 2)将想要提交的下次更改选择性暂存,更改部分在暂存区 3)提交更新,找到暂存区文件,将快照永久性存储到Git目录

获取Git仓库

在已存在目录中初始化仓库

  $ cd /Users/user/my_project 
  $ git init

由此生成.git子目录使其变成仓库

  $ git add *.c
  $ git add LICENSE
  $ git commit -m 'initial project version'

克隆现有的仓库

可以往后接制定的新目录名,可以用https,git,ssh协议

本地协议 file://

优点: 简单直接,快速协作

缺点: 不方便从多个位置访问,这个协议并不保护仓库避免意外的损坏

http协议 https://

优点: 可以使用用户名/密码授权,不须公钥上传到服务器

缺点: 管理凭证麻烦

SSH协议 ssh://

优点: 访问安全,高效

缺点: 不支持匿名访问 Git 仓库,使用者也必须通过SSH访问你的主机不利于开源的项目

Git协议

优点: Git协议是 Git 使用的网络传输协议里最快的

缺点: 缺乏授权机制。 把 Git 协议作为访问项目版本库的唯一手段是不可取的。大型的企业防火墙通常会封锁这个端口

  $ git clone https://github.com/libgit2/libgit2

Git基本操作

记录更新到仓库 查看哪些文件处于什么状态

  $ git status

跟踪新文件 暂存已修改的文件

add命令还能用于合并时把有冲突的文件标记为已解决状态等。将这个命令理解为“精确地将内容添加到下一次提交中”。

  $ git add README

git status -s 命令将得到格式更为紧凑的输出。

?? 表示新添加的未跟踪文件

A 新添加到暂存区中的文件

M 修改过的文件

忽略文件

文件 .gitignore 的格式规范:

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

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

比较工作目录中当前文件和暂存区域快照之间的差异,修改之后还没暂存起来的变化内容。

  $ git diff

比对已暂存文件与最后一次提交的文件差异

  $ git diff --staged

提交更新

  $ git commit
  $ git commit -m "Story 182: Fix benchmarks for speed"

跳过add步骤,加-a

  $ git commit -a -m 'added new benchmarks'

移除文件

从暂存区域移除指定文件,下一次提交时,该文件就不再纳入版本管理了

  $ git rm PROJECTS.md

把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录 中。

  $ git rm --cached README

移动文件

Git中对文件改名

  $ git mv file_from file_to

查看提交历史

  $ git log

-p 会显示每次提交所引入的差异(按 补丁 的格式输出) -2 只显示最近的两次提交 --stat 每次提交的简略统计信息 --pretty 不同于默认格式的方式展示提交历史

撤消操作

将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改,快照会保持不变,而所修改的只是提交信息。

  $ git commit --amend

取消暂存的文件

  $ git reset HEAD CONTRIBUTING.md

撤消对文件的修改(危险慎用)

  $ git checkout -- CONTRIBUTING.md

远程仓库的使用

查看远程仓库

输出的origin是Git给你克隆的仓库服务器的默认名字

  $ git remote

-v 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL

添加远程仓库

  $ git remote add <shortname> <url>

从远程仓库中抓取与拉取

  $ git fetch <remote>

推送到远程仓库

  $ git push origin master

查看某个远程仓库

  $ git remote show origin

远程仓库的重命名与移除

  $ git remote rename pb paul
  $ git remote remove paul

打标签

列出标签

  $ git tag

附注标签

  $ git tag -a v1.4 -m "my version 1.4"

轻量标签

  $ git tag v1.4-lw

后期打标签

  $ git log --pretty=oneline

共享标签

  $ git push origin <tagname>

删除标签

  $ git tag -d <tagname>

检出标签

  $ git checkout 2.0.0

分支

分支创建

  $ git branch testing

分支切换

  $ git checkout testing

新建分支

  $ git checkout -b iss53

分支的合并

  $ git merge iss53

远程分支

推送

  $ git push <remote> <branch>

拉取

  $ git pull

变基

  $ git checkout experiment
  $ git rebase master

可以使用 rebase 命令将提交到某一分支上的所有修改都移至另一分支上 变基的风险 如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。