contents
版本控制工具
功能 | 解释 | 备注 |
---|---|---|
协同修改 | 多人并行不悖的修改服务器端的同一个文件。 | 最后一个提交的解决代码不同的冲突 |
数据备份 | 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。 | |
版本管理 | 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空间,提高运行效率。 | SVN 采用的是增量式管理的方式,而 Git 采取了文件系统快照的方式。 |
权限控制 | 对团队中参与开发的人员进行权限控制;对团队外开发者贡献的代码进行审核——Git 独有。 | |
历史记录 | 查看修改人、修改时间、修改内容、日志信息。将本地文件恢复到某一个历史状态。 | |
分支管理 | 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。 |
Git操作
- 进入项目目录,右键“git bash here”,创建版本库,(自动创建.git,存放gits所有版本的历史记录,配置信息等)
git init
- 配置信息:
配置用户名-配置用户邮箱
git config user.name "用户名"
git config user.email "用户邮箱"
(在目录中的隐藏文件.git\config可查看)
统一配置(若具体项目中未配置则会去找全局的)
git config --global user.name "用户名"
git config --global user.email "用户邮箱"
(在C:\Users\hp.gitconfig可查看)
- 查看当前代码状态
git status
红色字体显示的文件表示没有被add,绿色字体显示的文件表示放到了暂存区(已经被add准备要commit但还没有commit)
这时还可以通过git diff看修改的内容
- 提交代码
git add 文件夹 #也可以是文件夹里具体文件 文件夹/文件名
note:文件名带中文的话,要整个打引号
5. 把暂存区的文件提交
git commit -m "修改说明"
note:
a. 若不用-m “修改说明”,则会跳转到vscode,在第一行写"修改说明"保存
或者vim的模式,按i在第一行写"修改说明",写完按esc 再输入:wq退出
b. 若使用-am"修改说明",表示add操作+commit操作在同一步中进行
- 查看修改记录
git log
上图包括了版本号,提交用户,提交时间的信息
省略时间和修改用户的信息,查看日志
git log --pretty=oneline
- 返回之前的版本
git reset --hard HEAD^ #或者git reset --hard HEAD~1
代码 | 解释 |
---|---|
hard | 硬回退,无论是库还是本地库全部退回一个版本 |
HEAD | 指针,指向最新的版本 |
^ | 几个^就表示往回退几个版本 |
~2 | 数字表示从当前往前回几个版本 |
也可reset到remote的版本,用
git reset --hard origin/master
- 查询所有版本日志的版本号,退回
# 查询
git reflog
红色框框中的是版本号
#退回
git reset --hard 版本号
- 编辑文件后,还原到库中最新一次commit的版本的文件
(还原到暂存区的文件,即add后的文件,不是版本层面的还原,reset是还原版本)
$ git checkout -- 文件/文件名
–后面的空格勿漏
- 删除库中的文件
按照提交文件的操作类似,在文件夹删除文件后,git add, git commit
物理结构
区域 | 说明 | 举例 |
---|---|---|
工作区(Working Directory) | 用户电脑本地硬盘目录 | 最新改过的代码 |
本地库(Repository) | 工作区有个隐藏目录.git,它就是Git的本地版本库 | 有所有历史记录 |
暂存区(stage) | 一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index) | 只有一份最新add进来的 |
分支branch管理
master是主干分支
- 返回当前branch和版本号
git branch -v
- 新建一个branch
git branch 分支名称
note:
-
此时查询branch就会出现两个分支,版本都是一个版本
-
*和绿色字体表示用户当前所在的branch
- 改变当前branch到另一个branch
git checkout 要改的分支名称
在这个branch上做得改变,在回到其他分支上时,这些改变是没有的。
若把创建新branch和switch到这个新branch放在同一步,那么用
git checkout -b 新分支名称
也可传入origin上的分支,来建立新的分支
git checkout origin/分支名 -b 新分支名称
PS:
用git fetch 获取remote上分支信息(mate-data)
git fetch origin 分支名称
- 把其他branch合并到master(任意branch都可)
branch先要回到要把其他文件合并的主branch上,再进行合并操作。
git checkout master
git merge dev
- 删除branch
git branch -D 要删除的分支名称
冲突
冲突一般指同一个文件同一位置的代码,在两种版本合并时版本管理软件无法判断到底应该保留哪个版本,因此会提示该文件发生冲突,需要程序员来手工判断解决冲突。
由于conflict,从而命令行后缀会进入MERGING状态,表示此时是解决冲突的状态。
通过conflict的位置查看confict
vim boy.txt
该状态下对代码进行修改,最后不要忘记去掉标记。
再次git add 和git commit 提交后,后缀MERGING消失,说明冲突解决完成。。
也可以直接通过命令行查看不同再到文件中进行修改,接着add,commit
git diff
位置 | 合并branch | pull |
---|---|---|
head和===之间 | 当前branch基于最新版本的改变 | 自己的基于最新版本的改变 |
===和>>>之间 | 另一个branch基于最新版本的改变 | remote基于最新版本的改变 |
github
GitHub是一个Git项目托管网站,主要提供基于Git的版本托管服务
1,2,6步骤上面的内容一致的,下面从3开始
3在GitHub搭建项目
4推送代码到远端
a. 增加远程地址
git remote add 远端代号 远端地址
名称 | 说明 |
---|---|
远端代号 | 是指远程链接的代号,一般直接用origin作代号,也可以自定义。 |
远端地址 | 默认远程链接的url |
例子 | git remote add origin https://github.com/user111/Helloworld.git |
note:可去.git/config中查看,修改远端代号,远端地址等
b. 推送到远程库
git push 远端代号 本地分支名称
名称 | 说明 |
---|---|
远端代号 | 是指远程链接的代号。 |
分支名称 | 是指要提交的分支名字,比如master。 |
例子 | git push origin master |
第一次push要github的账号和密码
5克隆代码
a. 下载下来的代码是自带git仓库的(不需要git init 初始化),直接克隆即可
克隆之前设置一下uers.name和user.email
git clone 远端地址 新项目目录名
名称 | 说明 |
---|---|
远端地址 | 指远程链接的地址。 |
项目目录名 | 指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名(地址中.git前的内容)。命令执行完后,会自动为这个远端地址建一个名为origin的代号。 |
例子 | git clone https://github.com/user111/Helloworld.git hello_world |
b. 下载指定分支(若不指定则只下载主分支)
git clone -b 指定分支名称 远端地址 新项目目录名
c. 如果访问一个Git URL需要用法名和密码,可以在Git URL前加上用户名,并在它们之间加上@符合以表示分割,然后执行命令,git会提示你输入密码。示例如下
git clone Remi@http://www.kernel.org/pub/scm/git/git.git 新项目目录名
7git push到github
首先得是项目参与者,需要项目管理人员invitate
成为项目参与者后就能git push 成功了!
push过程中的几种情况(本地分支local_branch,远程分支 remote_branch),首先都需要本地切换到需要push的local_branch
- 远程已有remote_branch分支并且已经关联本地分支local_branch
git push 远端代号 local_branch
- 远程已有remote_branch分支但未关联本地分支local_branch
git push -u 远端代号/remote_branch local_branch
- 远程没有remote_branch分支并(这里,remote_branch为远端希望创建的分支名称)
git push 远端代号 local_branch:remote_branch
8git pull
git pull 远端代号 远端分支名
名称 | 说明 |
---|---|
远端代号 | 指远程链接的代号。 |
远端分支名 | 指远端的分支名称,如master。 |
例子 | git pull origin master |
也可以到需要更新的目录下,直接
git pull
协作冲突
在上传(push)或同步(pull)代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。
这时,直接pull,并进入merge状态,需要手动修改后 git add, git commit.
fork
- 若一个第三方要push,需要先fork
- fork相当于做一个镜像,如此在自己的github库里操作与原先的库没有任何影响
若不fork直接git clone 则最后会push失败
- 在自己的github库中进行修改后,点击new pull request 申请对源代码的merge(需要经过原项目组的审查)
Git 的优点
- 跟踪代码的版本记录,如记录代码做的改变,修改的时间等。
- 在不同人之间同步代码(通过pull,push,clone)
- 测试代码但不会丢失原来的版本
- 返回到之前任意一版的代码