前言
- GIT是一个分布式的版本控制工具。
- 参考资料 git官方教程-中文版 及 廖雪峰老师的git教程
- 下文面向windows系统,所有操作使用git自带的git bash。
- 编辑文本文档时不要使用记事本,可以用sublime text或notepad++.
本地使用
安装及创建版本库
下载git,安装,进入git bash,确认用户信息如下。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
常用命令
在bash中进入一个路径不含中文的空文件夹,使用git init
命令创建版本库
使用git add filename
命令把文件添加到暂存区
使用git commit -m "message"
命令把暂存区的内容提交到版本库。
使用git diff filename
查看对文件的修改
使用git status
查看当前状态(包括 未跟踪的文件/已修改但没有暂存的文件/已暂存且没有提交的文件)
使用git rm
在暂存区中删除一个文件,用法与git add
相似。
版本回退
使用git log
命令查看版本历史
使用git reset --hard commit_id
切换到目标版本,HEAD指向当前版本,HEAD^指向上个版本,HEAD~100指向上100个版本
使用git reflog
查看提交历史,以便找到未来的commit_id
工作区和暂存区
工作区,Working Directory 就是在电脑里能看到的目录。
版本库,Repository 就是在目录中的一个.git文件夹,存了与git有关的很多内容,如配置,分支,暂存区等。
暂存区,Stage 需要提交的文件通过git add
放到暂存区,然后通过git commit
统一提交到分支。
git diff filename
比较工作区与暂存区
git diff --cached filename
比较暂存区与版本库
git diff HEAD -- filename
比较工作区与版本库
如
-----------------------版本库--------------------------------------------
| |
git diff --cached |
| |
-------------暂存区------------------------------------ git diff HEAD
| |
git diff |
| |
-----工作区--------------------------------------------------------------
删除修改
- 仅修改了工作区,使用
git checkout -- filename
把该文件恢复到最近的git commit
或git add
- 已经暂存,使用
git reset HEAD filename
删除暂存区,然后修改工作区 - 已经提交,参考版本回退。
远程仓库
- Git是分布式版本控制系统,同一个git版本库可以分布到不同的机器上。首先需要一个原始版本库,此后别的机器就可以克隆这个版本库,且不同机器上的版本库是完全一样的,没有主次之分。
- 实际情况是找一台电脑充当服务器,其它人把仓库从服务器上克隆到自己电脑上,再将各自的提交推送到服务器库里,也能从服务器库中拉取别人的提交。
- 可以自行创建服务器,也可以直接使用github,以下均使用github。
初始设置:添加SSH
- 注册github账号。
- 每台电脑创建自己的SSH Key,在git bash里执行
$ ssh-keygen -t rsa -C "[email protected]"
。注意修改邮箱。 - 在用户主目录里找到
.ssh
文件夹,显示扩展名。id_rsa
文件就是私钥不能泄露,id_rsa.pub
是公钥,可以告诉任何人。 - 登陆github,打开账户设置,添加SSH Key,title任意填,Key里复制id_rsa.pub里的内容。
- 确认添加,你的github账户即可与你的电脑通讯。
本地向GITHUB上推送
- 在github上新建与本地仓库同名的空版本库(Repository),注意不要有readme。
- 建立远程库链接:本地仓库目录下执行
$ git remote add origin [email protected]:LittleFall/learngit.git
,其中LittleFall修改为你的github账户名,learngit修改为你的仓库名。origin可以修改为其它的名字,表示远程库。如果因名字写错等原因需要删除远程库链接,使用git remote rm origin
. - 注意,第一次添加时会有SSH的确认,输入yes再按两次回车即可,以后不会出现。
- 使用
git push
把本地分支推送的远程库中。git push -u origin master
,仅第一次使用需要加-u.
从远程库克隆
- 开发时最好首先设置远程库,再在各个本地库中克隆。
- 在github上新建一个库gitskills,可以加上readme以验证效果。
- 在本地的一个目录中使用
$ git clone [email protected]:LittleFall/gitskills.git
即可克隆,注意修改用户名。 - 会发现目录下出现了gitskills目录,里面有一个readme.md文件和.git文件夹。
- 有使用其它协议的克隆方法,但似乎这样最好。
分支管理
git将每次提交(commit)串成时间线,称为分支,目前只有一个分支:主分支master。可以通过创建其它分支来修改程序,最后合并到主分支里。
注意:分支实际上是指向提交的。
基本操作
- 列出所有分支
git branch
。 - 创建分支
git branch name
,切换分支git checkout name
,创建并切换分支git checkout -b name
. - 合并指定分支到当前分支
git merge name
。注意不修改mater时会使用Fast-forward
合并模式,直接把mater指针移动到待合并的分支指针上。 - 删除分支
git branch -d name
解决冲突
- git合并分支可能会产生冲突。git会将冲突标记在工作区的文件中,类似于
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
- 打开这个文件,将列出的部分直接修改成需要的值
Creating a new branch is quick and simple.
- 保存,add,commit,此时冲突已被解决。
- 使用
git log --graph --pretty=oneline --abbrev-commit
可以形象地看到分支合并过程。 - 记得在合并且冲突解决后删除副分支。
- 使用
git merge --no-ff -m "message" branchname
来合并分支且不使用Fast-forward
模式,会使用recursive
模式,新建一个commit,所以需要-m来记录信息。ff模式的好处是快速,坏处是删除副分支后会丢失分支信息。
分支策略
- master分支应当是非常稳定的,只用来发布新版本,不能在上边干活。
- dev分支适用于开发使用,每个程序员将自己的提交合并到dev上。
- bug分支:需要保存当前工作修改bug时使用
git stash
,将当前工作现场存储起来(类似于栈)。恢复工作现场时首先使用git status
观察当前当作现场是否“干净”,使用git stash list
查看存储内容,再使用git stash apply
+git stash drop
或git stash pop
进行恢复并删除存储的内容。 - feature分支:注意强行删除
git branch -D name
。
多人协作
- 查看远程库信息
git remote -v
- 建立本地分支和远程分支的链接关系
git branch --set-upstream-to= origin/<branch-name> <branch-name>
- 从远程抓取分支
git pull
,可能会有冲突,可以解决。 - 向远程推送分支
git push origin <branch-name>
变基
git rebase
可以把git log
的显示结果变成一条直线,非常好看,会更改提交的依赖关系。
标签管理
- 每个标签只能出现一次,其实不如叫做tid。
- 创建标签
git tag tagname
,注意标签是对应于commit的,会打给上个commit,一个commit可以有多个标签。 - 查看所有标签
git tag
- 对某次提交打标签
git tag name commit_id
- 指定说明文字
git tag -a tag_name -m "message"
- 利用git show tag_name可以查看详细信息
- 删除标签
git tag -d tag_name
。 - 标签只会创建在本地,可以
git push origin tag_name
来推送到远程库,git push origin --tags
推送全部标签。git push origin :refs/tags/<tagname>
删除一个远程标签,需要先删除本地。
自定义设置
- 忽略特殊文件:在版本库目录下添加
.gitignore
文件,里面放着需要忽略的文件名,可以使用通配符。再将这个文件add即可。 - 配置别名:
$ git config --global alias.st status
以后写status就可以写st了,还有
git config --global alias.perlg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
- 搭建git服务器,留坑。