git学习(git,github,github desktop)
1. 什么是git
git是一种分布式版本控制系统,属于软件配置管理(SCM Software Configuration Management)
- SCM是指通过执行版本控制、变更控制的规程,以及使用合适的配置管理软件来保证所有配置项的完整性和可跟踪性。
2. 版本控制(version control)
- 版本的作用:保存重要的历史记录,若出现错误便于恢复历史数据
- 版本控制软件的基本功能
- 保存和管理文件
- 提供客户端工具进行访问
- 比较不同版本文件
- 集中式版本控制
集中式需要解决文件冲突问题,即多个人同时修改一个文件,导致相互覆盖。不同的集中式版本控制软件有不同的解决方法- VSS用锁来解决,当一个用户在修改文件的时候,中央服务器上的文件被锁定,其他用户不能修改该文件
- CVS、SVN会指定不同的用户修改同一文件不同行的权限,最后将每个人对不同行的修改进行合并
- 分布式版本控制
集中式版本控制的另一大问题是过度依赖中央服务器,如果中央服务器发生损坏会对项目带来严重的负面影响。
分布式服务器有本地仓库。这样,如果中央服务器发生故障,可以用本地的数据仓库进行对其恢复,提高了数据的安全性。
3. github desktop客户端
在客户端中选择本地路径,点击创建仓库(repository),即可创建本地仓库
3.1 commit 提交
进入本地仓库的目录下,对文件进行修改,或者创建、删除文件后,客户端会将目录下的文件与本地仓库进行对比,在客户端上会显示文件的差异。
点击commit,并且填写comment描述修改的原因,然后客户端会显示No local changes,表示我们对文件的操作已经同步到了本地仓库。
重点:
- 仓库路径和本地仓库不是同一个概念!
- commit相当于将本地路径中改动提交到本地仓库
3.2 History 查看历史提交记录
在客户端中点击History,从上到下是最近到过去的文件改动记录。
3.3 版本号
对文件进行操作并提交,并不是将原有的文件覆盖,而是采用不同的版本号对不同文件进行编码。
git采用40个16进制的数字作为文件版本号,采用SHA-1计算版本号。
git版本号的作用主要有2个:
- 防止合并的时候出现文件冲突
- 可以定位仓库中的文件
- 前2位作为文件夹编号
- 后38位作为文件编号
3.4 branch 分支(多人协作)
分支相当于仓库的一个副本,在多人协作时每个人只对自己的那个分支进行操作,最后对分支进行合并(如果不同人对同一文件可能对产生冲突,需要在合并的时候解决)
在下面的图示中,
- 王五是项目经理,负责管理仓库的main分支
- 张三开发user模块功能
- 李四开发order模块功能
两人分别在自己的分支上进行commit。张三和李四的branch是基于王五管理的main分支创建的
创建完成后有三个分支branch
对不同的分支进行操作,需要在客户端上选择相应的分支,点击show in explorer,跳转到本地路径,在本地进行文件操作,最后在客户端commit到相应的分支。
3.5 merge 分支合并
选择不同人开发的分支,合并到main分支(choose branch to merge into main)
- 若多个分支修改了相同文件,合并的时候会出现文件冲突(file conflict),需要人为地进行冲突处理,决定冲突文件应该如何处理。
- commit的时候可以填写comment,为了记录merge的目的,我们右键点击create tag,记录merge操作的目的。
3.6 远程仓库
- 下载到本地:
在github desktop客户端上clone repository即可将github网站上的远程仓库下载到本地 - push origin
对本地仓库修改完成后,在客户端点击push origin即可将本地仓库同步到网站上的远程仓库。
3.7 README和IGNORE
- README文件
对项目进行介绍、描述,方便使用者快速了解项目的功能、结构等 - IGNORE文件
一些本地文件不需要提交到仓库中,将不需要提交的文件或文件类型添加到IGNORE中,这样客户端就不会识别到指定忽略的文件,因此这些文件也不会提交到仓库(repository)中。
4. 在IDEA中集成github(需要开启全局代理)
打开IDEA,选中菜单栏中的
VCS--share project on github--push
修改文件后,右击打开菜单
- "git--commit file"将文件上传到本地仓库
- "git--commit file and push"将文件上传到本地仓库,同时上传到github的仓库中
- "git--pull" 将远程仓库的文件同步到本地仓库
5. 版本号
5.1 关于文件操作的版本号
# 在git bash中通过版本号查看文件信息
git cat-file -p 40位版本号
git中有多个版本号,分别对应着文件的提交信息、文件状态、文件内容等信息
上图中操作的序列是从下至上的,最上面的是最新的操作
利用git cat-file -p 版本号
,输入不同的版本号,可以查看不同的信息
- 输入提交信息的版本号,可以查看该次commit的信息,如作者是谁,提交的comment是什么等
- 输入文件状态的版本号,可以查看仓库中各个文件的权限
- 输入文件内容的版本号,可以查看文件中真正的内容
5.2 关于分支操作的版本号
HEAD指向当前所在的分支,分支指向该分支上最近操作的文件
git的底层实现是指针,从而能够避免出现多个副本,主要是两个指针
- HEAD指针指向当前分支
- 分支如master,hotfix指向当前所处的commit版本
6. 常用Git命令
在git bash中可以使用linux的命令,因为它们都是linus开发的,按Tab
键可以进行补全
cat your_filename
可以在命令行查看文件
6.0 简易图示
本地有三个分区:工作目录,暂存区,本地仓库(存储区域)
注意:
- 当本地仓库为空时,用
git clone
从远端克隆到本地;当远端仓库不存在时,用git publish
将本地仓库发布到云端 - 若不为空,则用
git pull
拉取远端仓库有,用git push
将本地仓库有推送到远端
6.1 初始化本地新仓库
- 新建一个文件夹
- 在git bash中输入如下命令,将这个空文件夹初始化为一个本地空仓库
git init
- 初始化完成后,该文件夹中会出现一个.git文件夹
6.2 克隆远程仓库
- 选择本地仓库需要放置的位置
- 得到远程仓库的url,在bash中输入如下指令:
git clone remote_repository_url
6.3 查看本地仓库状态
git status
显示的内容
- 当前所在的分支
- 当前提交commit的次数
- 是否有内容需要提交
例如:我用vim创建了一个新的文件hello.txt,再用git status
查看,会显示如下状况
hello.txt是红色的,标志着它在工作目录下,但还没有放到暂存区,需要用git add
指令上传到暂存区
6.4 添加到暂存区
- 将工作目录下的文件添加到暂存区
git add your_filename
将文件添加到暂存区之后,使用git status
查看到的文件是绿色的
- 会出现warning,下次git touch该文件是会把LF替换为CRLF
- 因为Windows中的换行符是CRLF,Linux中的换行符是LF
- 将暂存区中的文件删除(工作目录下的文件还是存在的)
git rm --cached your_filename
6.5 将暂存区中的文件提交本地库
git commit -m "日志信息" your_filename
# 查看日志信息
git reflog
# 查看详细日志
git log
6.6 修改文件
在工作目录下修改文件后,
使用git status
查看,被修改文件会变成红色,显示modified
需要git add your_filename
添加暂存区,
git commit -m "your_coment" your_filename
上传本地库
6.7 版本穿梭
开发中有时需要回退到之前的文件版本
此时,可以通过git reflog
查看文件的(精简)版本号
然后使用如下命令,穿梭到指定版本的文件
git reset --hard 文件版本号
6.8 分支 branch
git branch brach_name #创建分支
git branch -v #查看分支
git checkout branch_name #切换分支
git merge branch_name #把指定分支合并到当前分支上
冲突合并
产生原因:合并分支时,两个分支在同一个文件的同一个位置有两套不同的修改,git无法替我们决定使用哪一个,需要人为决定新代码的内容。
当同一个文件在两个分支都被修改时,git在合并时会显示conflict,需要我们手动去处理冲突文件
解决冲突文件的步骤:
- 处理人为冲突文件
git add conflict_file
保存到暂存区git commit -m "merge"
提交到git仓库
注意:
- 合并时的commit不要带文件名!!!
- 处理完冲突并合并到master分支,只会修改master分支,不会修改hotfix分支
6.9 团队协作
6.9.0 图示 (图源尚硅谷)
- 团队内协作
- 跨团队协作
6.9.1 为远程仓库创建别名
git remote add nick_name remote_repo_url # 为远程仓库链接设置别名
git remote -v #查看远程仓库
6.9.2 push
将本地的分支推送到远程仓库上
git push nick_name_of_the_remote_repo local_branch_name
6.9.3 pull
将远程的仓库拉取到本地库
git pull nick_name_of_the_remote_repo local_branch_name
6.9.4 clone
在一个空文件夹下面进行clone操作
git clone remote_repo_url
clone
操作完成的3件事
- 拉取代码
- 初始化本地仓库
- 创建别名(默认是origin)