基础知识
版本控制系统
svn
集中式,有一个中央服务器,需要先从上面拉取最新的代码才能干活,干完活再推送上去,必须联网才能工作,对网络要求大
基本概念
repository
源代码仓库
checkout
提取代码
commit
提交代码
update
更新代码
从远程仓库checkout代码 --> 修改 --> update代码(副本可能过期需要更新) --> 调试没问题 --> 提交 --> 大家都可以看见 修改不同代码会合并,修改同一行代码会产生冲突,需手动解决。
让我们假设 Tom 和 Jerry 是一个项目的两个开发者。他们同时从版本库中检出了最新的版本并开始工作。此时,工作副本是与版本库完全同步的。然后,Jerry 很高效的完成了他的工作并提交了更改到版本库中。 此时 Tom 的工作副本就过期了。更新操作将会从版本库中拉取 Jerry 的最新改动并将 Tom 的工作副本进行更新。
开发
修改之前更新一次,提交之前再更新一次 先更新,再保留合并后的代码(删除多余的注释和代码),再提交即可解决冲突 取消更改就右边远程版本复制到左边本地版本
git
分布式,没有中央服务器,每个电脑就是一个完整的版本库,相互提交给对方就可看到相互的改动 可以设置自己的分支进行开发并提交,最后需要合并
概念
工作区
自己电脑上看见的目录就是工作区
版本库
仓库的 .git 文件夹就是版本库
暂存区
就在版本库内
自动创建第一个master分支,以及指向master分支的指针HEAD
add 添加到暂存区 commit 将暂存区文件提交到当前分支
注意事项
可以监听所有文本文件内容改动,但图像、视频等二进制文件内容改变无法监听,不能知道里面改了什么,只知道大小改变。
Git教程
入门
1、新建目录,右键鼠标进入 Git Bash Here
2、git init
将当前目录变成git管理的仓库
3、目录下创建一个文件
4、git add 文件名(可写多个文件名)
添加文件到暂存区 git add xx命令可以将xx文件添加到暂存区,如果有很多文件改动可以通过 git add -A . 来一次添加所有改变的文件。 注意 -A 选项后面还有一个小数点. git add -A表示添加所有内容, git add . 表示添加新文件和编辑过的文件不包括删除的文件; git add -u 表示添加编辑或者删除的文件,不包括新添加的文件
5、git commit -m "注释"
暂存区的文件都提交到仓库
6、git status
文件提交状态 每次git commit后最好查看是否还有未提交
7、修改文件内容
8、git diff 文件名
文件有修改,可查看文件修改了哪些地方
9、git status
查看状态,显示有修改内容,并且未提交
10、 git add 文件名
重复提交步骤
11、git commit -m "注释"
重复提交步骤
12、git status
再次查看状态
13、提交远程仓库
远程仓库
注册GitHub账号
创建密钥与本地关联
创建仓库(名字最好与本地相同)
远程仓库与本地仓库关联
git remote add origin https://github.com/xxx/xxx.git
本地提交到远程仓库,与远程仓库同步
git push -u origin master
提交当前主分支(master) -u 表示本地分支与远程分支同步,远程不用创建新的分支
开发
提交到本地版本库了,执行git push origin master 就可以提交到远程仓库 这就是分布式版本库
注意:以上是先建好本地库,再有远程库流程,工作中一般是直接从远程仓库拉取代码下
多人协作
从远程库克隆
创建好目录,在当前目录下 git bash git clone https://github.com/xxx/xxx.git
查看远程库信息
git remote git remote -v
本地主分支一定要与远程库对应,修复bug分支可以和本地主分支合并后再推送到远程库
多人协作工作模式流程
1、首先,可以试图用 git push origin branch-name (分支名)推送自己的修改. 2、如果推送失败,则因为远程分支比你的本地更新早,需要先用 git pull 试图合并。 3、如果合并有冲突,则需要解决冲突,并在本地提交。再用 git push origin branch-name 推送。
冲突解决
冲突表示:用 <<<<<<< , =======, >>>>>>表示冲突的地方 例如:
<<<<<<< HEAD
22222222
=======
11111111111
333333333333
>>>>>>> fenzhi1
<<<<<<< HEAD 主分支上修改的内容
======= 分隔符
>>>>>>>fenzhi1 分支上修改的内容
解决冲突:修改 fenzhi1 分支内容为主分支上的内容再添加,提交
创建和合并分支
多次提交时间串成一条时间线,就是一个主分支,即master分支,HEAD指向master也就是当前分支,master指向提交
创建分支并切换
查看分支
git branch
带星号就是当前分支
创建分支
git branch dev
创建dev分支
切换分支
git checkout master
切换master分支
创建并切换分支
git checkout -b dev
-b 相当于 git branch
提交的分支不同,内容不同
master(当前分支) 合并dev分支
git merge dev
合并后删除dev分支
git branch -d dev
基本命令
git init
将当前目录变成git管理的仓库
git clone https://github.com/xxxx/xxxx.git
克隆远程库 git clone -b [branch name] https://github.com/xxxx/xxxx.git 克隆某个分支远程库
git add 文件名
添加文件到暂存区 git add . (小数点) 添加所有新增和有变动文件到暂存区
git commit -m "注释"
提交到仓库
git status
文件提交状态 每次git commit后最好查看是否还有未提交
git remote add origin https://github.com/xxx/xxx.git
与远程仓库关联
git push -u origin master
提交当前主分支 -u 表示本地分支与远程分支同步,远程不用创建新的分支 git push origin [branch name] 提交远程分支仓库
git pull origin master
取回远程主机主分支的更新,再与本地的指定分支合并。
git log
git log 查看所有提交的日志,由最近到最远时间
git log --oneline git log --pretty==oneline 简略版日志
git reflog
查看远程库信息
git remote git remote -v
git diff 文件名
文件有修改,查看文件修改了哪些地方
版本回退
git reset --hard HEAD^
回退到上一个版本,^^ 则表示回退到上两个版本
git reset --hard HEAD~5
回退到前 5 个版本
回退到最新版本
git reflog
可显示每次改动提交的版本号
git reset --hard 版本号
git checkout -- 文件名 (文件名)
撤销修改(当不用版本回退时可使用)
未添加到暂存区
撤销当前修改内容
已添加到暂存区
撤销未添加到暂存区的内容
-- 不能漏,否则变成创建/切换分支
rm 文件名 (文件名)
删除文件
恢复文件
git checkout -- 文件名 (文件名) -- 不能漏,否则变成创建/切换分支
常用命令清单
http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html