基础知识
版本控制系统
-
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 -- 文件名 (文件名)
- -- 不能漏,否则变成创建/切换分支