分布式版本控制系统 Git
组成结构
- 工作区:就是你在电脑里能看到的目录。两种状态:已跟踪(tracked)或未跟踪(untracked)。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,是 Git 的版本库。
- 远程仓库
操作
初始化
// 本地初始化空仓库
git init // 使用当前目录作为Git仓库,并创建.git文件
git init [dir_name] // 指定目录
查看状态
git status // 查看项目的当前状态
git status -s // 以精简的方式显示文件状态
// 查看执行 git status 的结果的详细信息
git diff // 尚未缓存的改动
git diff --cached // 查看已缓存的改动
git diff HEAD // 查看已缓存的与未缓存的所有改动
git diff --stat // 显示摘要而非整个 diff
查看历史
git log
/* 添加参数
https://www.cnblogs.com/biglucky/p/5076885.html
*/
--oneline // 简洁的版本
--before={3.weeks.ago}
--after={2010-04-18}
--no-merges // 隐藏合并提交
--pretty=format:"%cn committed %h on %cd" // 格式化
git blame [file_name] // 显示修改记录
添加文件到本地仓库
git add [.|file_name] // 开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态
git commit –m "commit messages" // 将缓存区内容添加到仓库中
git commit -am "项目初始化+目录结构划分" // 将已跟踪文件放到暂存区(省略 git add)
git commit --amend // 进入vim编辑器,对上次提交的内容进行修改,也可以修改提交说明
远程仓库
// 创建一个远程仓库
git remote add origin git@github.com:pipizh/mini-program.git // 本地和远程仓库相互关联
git push -u origin master // 推送 → 用本地分支合并到远程分支。
git remote -v // 查看当前的远程库,执行时加上 -v 参数,可以看到每个别名的实际链接地址。
git fetch // 从远程仓库下载新分支与数据。
git pull // git fetch 和 git merge FETCH_HEAD 的简写。→ 将远程分支合并到本地分支。
版本回退
reset 的本质:移动 HEAD 以及它所指向的 branch
git reset HEAD file_name
// 添加选项
git reset --hard id // 根据 id 回退到指定的提交版本,此回退操作不建议
git reset --mixed id // (默认)
git reset --soft id
// git reflog 查看id
// --hard:删除工作空间改动代码,撤销commit,撤销git add,撤销工作区修改
// --mixed:撤销commit,撤销git add,保留工作目录
// --soft:保留工作目录的内容,并把因为保留工作目录内容所带来的新的文件差异放进暂存区,即只撤销commit
删除文件
git rm <file> // 删除工作区文件,并且将这次删除放入暂存区,提交之后会删除版本库中的文件。
// 同时暂存区不能存有该文件,如果删除文件之前修改过并且已经放到暂存区的话,git rm 命令会报错。必须要用强制删除选项 -f
git rm -f <file> // 删除工作区和暂存区文件,并且将这次删除放入暂存区。
git rm --cached <file> // 删除暂存区文件,但保留工作区的文件,并且将这次删除放入暂存区。
git rm –r * // 递归删除整个目录中的所有子目录和文件
克隆
// clone 远程仓库
git clone url_name [dir_name] // 指定地址和存放目录(可选)
git clone git@github.com:fsliurujie/test.git // SSH协议
git clone git://github.com/fsliurujie/test.git // GIT协议
git clone https://github.com/fsliurujie/test.git // HTTPS协议
标签管理
如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 git tag 给它打上标签。
git tag -a v1.0 [id] -m "commit messages"// 给最新一次提交打上(HEAD,也可通过id选定)"v1.0"的标签,-m 选项意为"创建一个带注解的标签"(可选)
git show v1.0 // 查看此版本所修改的内容
git tag // 查看所有标签
git checkout v1.0 // 切换到标签v1.0
git push v1.0
git push --tags // 推送全部尚未推送到远程的本地标签
git tag -d v1.0 // 删除本地标签v1.0
git push origin :refs/tags/v1.0 // 删除远程标签v1.0
分支管理
git branch branch_name // 创建分支
git checkout branch_name // 切换分支
git checkout -b branch_name // 创建子分支,并切换到子分支上。git 将还原你的工作目录到分支的状态
git branch -d branch_name // 删除本地分支
git push origin -d branch_name // 删除远程分支
git branch // 查看所有分支
// 将文件推送到远程仓库并创建远程分支
git push origin branch_name
// 合并分支
git checkout branch_name_1
git merge branch_name_2 // 切换到 branch_name_1,将 branch_name_2 分支上的代码合并到 branch_name_1
git push // 此命令默认推送到远程master
分支冲突
https://www.cnblogs.com/gavincoder/p/9071959.html
合并分支时,会产生冲突,不管在本地上合并两个分支,或是本地分支与远程分支的合并。(多人合作场景下)
如果在相同文件名下相同位置出现不同的修改(修改了同一个文件的名称),合并时就会产生冲突。Git用<<<<<<<
、=======
、>>>>>>>
标记出不同分支的内容。
解决冲突:git status
查看冲突文件,再手动编辑为希望的内容并add+commit。
开发建议:每次开发前先从 git 上 down 下来最新的代码在 master 上,在 master 基础上建立自己的分支,做的修改在分支提交。push 时先从远程仓库 pull master,然后和本地分支进行合并 merge 后再 push。这样即使修改同一个文件也不容易冲突。
错误
Git命令中文显示乱码的问题解决 git config --global core.quotepath false
网友评论