Git 的结构和状态
3层结构:
- 工作区(working directory)
- 暂存区(stage)
- 版本库(Repository)
关系如图:工作区是在电脑里能看到的目录,工作区有一个隐藏目录.git
,这就是 Git 的版本库。把文件往版本库里添加的时候,将需要提交的文件修改通通放到暂存区,然后提交。(图源于廖雪峰Git教程)
4种状态:
- untracked 未被追踪
- modified 工作区修改了某个文件但是还没有添加到暂存区
- staged 把工作区修改的文件添加到了暂存区但是没有提交到版本
- committed 数据被安全的存储在本地库中
基本命令
登录
git config --global user.name “your name”
git config --global user.email “your email”
初始化 git 仓库:
git init
// 会在工作区添加一个隐形的
.git
文件夹
查看目录
ls -a
添加到暂存区
- 将文件添加到暂存区:
git add filename
- 将工作目录下的所有修改的文件添加到暂存区:
git add .
提交
- 将暂存区内的文件提交到版本库:
git commit -m '备注信息'
- 跳过 git add 添加到暂存区命令 直接将工作区所有
已跟踪的
文件提交(未跟踪untracked的文件不能使用此命令):
git commit –am '备注信息'
查看版本
git log
查看项目文件状态
git status
撤销操作
- 撤销上一次提交 并将暂存区的文件重新提交
git commit –amend
- 拉去暂存区的文件并将其替换工作区的文件
git checkout –filename
- 拉去最近一次提交的版本库中的这个文件到暂存区,该操作不影响工作区
git reset HEAD filename
文件删除
- 删除工作区及暂存区中的该文件相当于删除文件后执行
git rm filename
- 在不小心将不需要追踪的文件添加到暂存区,想删除暂存的文件但是不想删除工作区的文件很有用
git add git rm –cached filename
- 当工作区或者暂存区文件修改了(防止将修改误删除了)
git rm -f filename
改名
git mv oldname newname
Git分支
- 查看分支
git branch
- 创建分支
git branch branchname
- 修改分支名称
git branch –m oldname newname
- 切换分支
git checkout -b branchname
- 创建+切换分支
git checkout -b branchname
- 删除分支
git branch –D branchname
- 合并指定分支到当前分支
git merge branchname
分支的指针
HEAD指针 指向当前工作的分支 在切换分支时指向新的分支
比较差异
- 比较暂存区和工作区的差异
git diff
- 比较暂存区与版本区的文件差异
git diff --staged
- 比较分支内的两个版本的差异
git diff 版本号 版本号
- 比较两个分支的最新提交 版本的差异
git diff 分支 分支
解决冲突
当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。”解决冲突” 就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交。git status
也可以告诉我们冲突的文件。
用 git log --graph
命令可以看到分支合并图。