Git
- 三种状态
- 已提交(committed):表示数据已经安全的 保存在本地数据库中
- 已修改(modified):表示修改了文件,但还没保存到数据库中
- 已暂存(staged):表示对一个已修改文件的当前 版本做了标记,使之包含在下次提交的快照中
由此引入 Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
文件的状态变化周期
基础命令
- 全局用户信息
git config --global user.name "FangJu"
git config --global user.email "xxx@qq.com"
- 单个项目用户信息
git config user.name "FangJu"
git config user.email "xxx@qq.com"
- 检查配置信息
git config --list
- 在现有目录中初始化仓库
git init
- 跟踪新文件(添加内容到下一次提交中)
git add <filename>
git add -A 提交所有变化
git add -u 提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
git add . 提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
- 提交更新
git commit -m "commit description"
git commit -a -m "commit description" #跳过使用暂存区域
提交完成后,会看到是在哪个分支提交的,这次提交的完成的SHA-1校验和(由40位16进制组成),以及本次提交文件增减情况
注:提交记录是对暂存区文件的提交,其他已修改但未暂存的文件可以在下次提交修改
- 克隆现有的仓库
git clone [url]
- 查看当前文件状态
git status
- 状态简览
git status -s
三种标识符:“??”代表新添加的未跟踪文件;“M”可能出现在两个位置,在左边代表修改过并放入了暂存区,在右边代表修改过没被放入暂存区;“A”代表新添加到暂存区的文件
- 查看已暂存和未暂存的修改
git diff
git diff --cached
git diff --staged
git diff本身只显示尚未暂存的改动,而不是上次提交以来所作的所有改动
- 从暂存区删除文件
git rm <filename>
git rm -f <filename>
会从工作目录中删除文件
- 从暂存区移除文件
git rm --cached <filename>
只会从git的暂存区中移除,不会从磁盘中删除
- 移动文件
git mv file_from file_to
git mv相当于运行了下面三条命令
mv file_from file_to
git rm file_from
git add file_to
- 查看提交历史
git log
git log -p #并显示每次提交的内容差异
git log -p -2 #并显示最近两次
git log --stat #附带一些总结性信息
git log --pretty=oneline #一行显示
git log --pretty=format:"%h " #特定格式显示
git log --pretty=format:"%h %s" --graph #输出树图
- 取消暂存的文件
git commit --amend
自上次提交以来还未做任何修改就使用此命令,则快照不变,修改的只是提交描述信息
- 取消暂存的文件
git reset HEAD <filename>
虽然在调用时加上 --hard 选项可以令 git reset 成为一个危险的命令(可能导致工作目录中所有当前进度丢失!),但本例中工作目录内的文件并不会被修改。 不加选项地调用 git reset 并不危险,它只会修改暂存区域
- 查看远程仓库
git remote
git remote -v #并显示url
- 添加远程仓库
git remote add <shortname> <url>
- 从远程仓库中抓取与拉取
git fetch [remote-name] #拉取之后不会合并
git pull #拉取之后会合并到本地分支
- 推送到远程仓库
git push origin master
- 查看某个远程仓库
git remote show origin
- 远程仓库的移除与重命名
git remote rename oldname newname
git remote
- 修改本地以及远程分支的名称
git branch -m <old_branch> <new_branch> #修改本地分支的名称
git push origin :<old_branch> #删除远程分支
git push --set-upstream origin <new_branch> #新增远程分支
- 列出标签
git tag
- 创建附注标签
git tag -a v1.4 -m "new version 1.4"
- 后期打标签
git tag -a v1.2 <commit id>
- 共享标签
git push origin [tagname]
git push origin --tags #推送所有标签
- 删除标签
git tag -d <tagname>
git push <remote> :refs/tags/<tagname> #远程同步
- 检出标签
git checkout <tagname>
这会使你的仓库处于分离头指针状态,在此状态下如果你做了某些更改并提交了它们,标签不会发生变化,但你的新提交不属于任何一个分支,并且将无法访问,除非确切的提交哈希。
- Git别名
git config --global alias.unstage 'reset HEAD --'
即之后git unstage fileA与git reset HEAD – fileA等价
Git分支
在进行提交操作时,Git 会保存一个提交对象(commit object)。知道了 Git 保存数据的方式,我们可以很自 然的想到——该提交对象会包含一个指向暂存内容快照的指针。 但不仅仅是这样,该提交对象还包含了作者的姓 名和邮箱、提交时输入的信息以及指向它的父对象的指针。首次提交产生的提交对象没有父对象,普通提交操作 产生的提交对象有一个父对象,而由多个分支合并产生的提交对象有多个父对象。当使用 git commit 进行提交操作时,Git 会先计算每一个子目录(本例中只有项目根目录)的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外, 还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。
- 分支创建
git branch testing
- 查看各个分支所指对象
git log --oneline --decorate
- 分支切换
git checkout <branchname>
- 分支合并
git merge <branchname>
同一个父节点的分支合并时只会增减代码,不会产生冲突;不同父节点的分支合并时,对同一个文件的同一个部分进行了不同的修改,Git就没法干净的合并它们,这时候需要自己解决冲突
- 查看每个分支最后一次提交
git branch -v
- 查看哪些分支合并到了当前分支
git branch --merged
- 查看所有包含未合并工作的分支
git branch --no-merged
- 显式获得远程引用的完整列表
git ls-remote
git remote show #获得远程分支的更多信息