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