Git 简介
Git 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理,是目前使用范围最广的版本管理工具。
集中式 vs 分布式
集中式版本控制系统:版本库集中存放在中央服务器,可以接受代码,所有人将自己的工作与之同步。开发者从中心仓库克隆代码下来,进行工作,再将结果推送给中央服务器。
分布式版本控制系统:没有“中央服务器”,每个人电脑里都有完整的版本库。开发者既可以将自己的代码贡献到其他的仓库中,同时也能维护自己的公开仓库,让其他人可以在其基础上工作并贡献代码。实际使用时,通常会有一台充当“中央服务器”的电脑,用来方便“交换”大家的修改。
工作区、暂存区和版本库
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
Git 开发流程
(1)克隆远程项目到本地。
$ git clone https://github.com/xxx/xxx.git
(2)在本地建立自己的分支。
$ git checkout -b feature-name
(3)在自己的分支上进行开发,编写代码。
(4)查看文件状态及修改情况,提交分支。
$ git status
$ git add .
$ git commit -m "Commit Message"
(5)将自己的分支推送到远程仓库。
$ git push origin feature-name
(6)在 GitHub 网站上提交 pull request。
(7)若成功合并,删除本地的分支;否则修改程序,重新提交。
$ git branch -d feature-name
(8)开始新的任务前,拉取远程 dev 分支的最新代码到本地。
$ git pull origin dev
Git 使用方法
创建版本库
选择一个合适的地方,创建一个空目录,通过 git init
命令把这个目录变成 Git 可以管理的仓库。
$ git init
添加和提交文件
通过 git add
命令把文件添加到暂存区。
$ git add readme.txt
通过 git commit
命令把文件提交到仓库。可以多次添加文件,然后一次提交很多文件。
$ git commit -m "提交说明"
修改文件
通过 git status
命令查看仓库当前的状态,显示有变更的文件。
$ git status
通过 git diff
命令查看具体修改的内容,即暂存区和工作区的差异。
$ git diff readme.txt
如果需要撤销修改,可以用 git checkout -- <file>
命令让这个文件回到最近一次添加或提交时的状态。
$ git checkout -- readme.txt
如果用 git add
命令把修改文件添加到暂存区后,又需要撤销修改,可以用 git reset HEAD <file>
命令把暂存区的修改撤销掉(unstage),重新放回工作区。
$ git reset HEAD readme.txt
删除文件
通过 git rm
命令删除工作区文件,并且用 git commit
命令提交,可以从版本库中删除该文件。
$ git rm test.txt
版本回退
通过 git log
命令显示从最近到最远的提交日志。加上 --pretty
选项可以指定输出的信息和格式(参考)。
$ git log
$ git log --pretty=format:"%h | %ad | %s"
通过 git reset
命令把当前版本回退到上一个版本。在 Git 中,用 HEAD
表示当前版本,上一个版本就是 HEAD^
,上上一个版本就是 HEAD^^
,往上100个版本可以写成 HEAD~100
。
$ git reset --hard HEAD^
$ git reset --hard fd01cc8
通过 git reflog
命令查看命令历史,可以指定恢复到未来的某个版本。
$ git reflog
远程仓库
登录 GitHub,创建一个新的仓库,这个仓库目前是空的。
可以从这个 GitHub 仓库克隆出新的仓库。Git 支持多种协议,包括 https,但 ssh 协议速度最快。
$ git clone git@github.com:user/learngit.git
可以把一个已有的本地仓库与这个 GitHub 仓库关联,然后把本地仓库的内容推送到 GitHub 仓库。第一次推送 master 分支时,加上 -u
参数可以把本地的 master 分支和远程的 master 分支关联起来。
$ git remote add origin git@github.com:user/learngit.git
$ git push -u origin master
通过 git remote rm <name>
命令解除本地和远程的绑定关系,远程仓库本身没有任何改动。如果要真正删除远程仓库,需要登录 GitHub 上删除。
$ git remote rm origin
分支管理
创建 dev
分支,然后切换到 dev
分支。也可以用 git checkout -b
命令直接创建并切换到 dev
分支。
$ git branch dev
$ git checkout dev
$ git checkout -b dev
通过 git branch
命令查看所有分支,当前分支前面会标一个星(*)号。
$ git branch
在 dev
分支上进行工作,并添加和提交文件后,切换回 master
分支,通过 git merge
命令合并指定分支到当前分支。
$ git merge dev
合并完成后,可以用 git branch -d
命令删除分支。
$ git branch -d dev
解决冲突
当两个分支各自都分别有新的提交,Git无法执行“快速合并”,可以手动编辑文件,解决冲突后再提交。
用带参数的 git log
命令可以看到分支的合并情况。
$ git log --graph
标签管理
切换到需要打标签的分支上,创建一个新标签。默认标签是打在最新提交的 commit 上的。加上 -a
参数可以指定标签名,-m
参数可以指定说明文字。
$ git tag v1.0
$ git tag v0.9 852e113
$ git tag -a v0.1 -m "version 0.1 released" 1ea43fd
通过 git tag
命令查看所有标签。标签不是按时间顺序列出,而是按字母排序的。
$ git tag
创建的标签都存储在本地,不会自动推送到远程。可以用 git push origin <tagname>
命令推送一个本地标签,加上 --tags
选项可以推送全部未推送过的本地标签。
$ git push origin v1.0
$ git push origin --tags
可以用 git tag -d
命令删除本地标签。
$ git tag -d v0.1