使用Git进行版本控制
对代码、文件进行版本控制是协同工作中的一大重点,目前主要有两种版本控制方法,一种是集中式控制,另一种是分布式控制。
- 集中式控制。在中央服务器中存放着文件,对文件进行修改时,需要从中央服务器中下载最新的文件,修改后再提交到中央服务器中。优点是简单直接,无所大量空间进行存储;缺点是当中央服务器中出现网络问题时,所有客户端都无法进行访问,工作停止!
- 分布式控制。每个用户的都存放着所有的文件,修改后需要在所有用户之间进行同步。优点是可以随时随地进行本地的工作;缺点是多个用户同时对文件进行修改时,同步文件信息较为麻烦(需要一个类“中央服务器”作为各个用户之间同步的中介)。Git就是一种非常优秀的分布式版本控制器。
目录
- Git安装
- Git初始化配置
- Git创建仓库
- 本地仓库
- 远程仓库
- Git工作区域和文件状态
- 工作区域
- 文件状态
- Git添加和提交文件
- 回退版本
- 查看文件差异
- Git删除文件
- 忽略文件
- 远程仓库GitHub
- 本地仓库和远程仓库关联
- Git 分支
- 解决合并冲突
- rebase
Git安装
Linux Ubuntu中可以使用命令行直接进行安装:sudo apt install git-all
安装后可以查看版本信息:git --verision
Git初始化配置
配置用户名和邮箱:git config --global user.name Wade
git config --global user.email xxx@qq.com
保存用户名和密码:git config --global crendential.helper store
查看配置信息:git config --global --list
Git创建仓库
Git有两种工作模式:
- 本地仓库。用户将仓库建立在本地目录中,使用Git进行管理
- 远程仓库。仓库建立在远程的服务器中,比较出名的为GitHub、Gitee等。
本地仓库
- 在本地合适的空目录下创建一个文件夹:
mkdir ~/git/myGitLearning
- 在这个目录下创建仓库:
cd ~/git/myGitLearning/
和git init
可以将当前文件夹作为Git仓库;或使用git init <name>
在当前目录下另新建一个文件夹作为Git仓库
- 查看当前目录下的文件:
ls -a -l
.git目录存放了Git仓库的所有数据,删除.git目录即删除该Git仓库
远程仓库
git clone xxx
,xxx为远程仓库的地址
Git工作区域和文件状态
工作区域
工作区域分为三个模块:工作区、暂存区以及本地仓库
- 工作区是我们实际操作的文件目录
- 暂存区用于临时存放即将提交的修改内容
- 本地仓库即为
git init
创建的仓库,是Git存储代码和版本信息的主要位置
文件状态
- 未跟踪:我们新创建还没有被Git管理起来的文件
- 未修改:已经被Git管理起来,但是文件内容没有改变的文件
- 已修改:已经修改但是还没有添加到暂存区的文件
空文件夹不会被纳入到版本库中
Git添加和提交文件
git status
查看仓库状态
创建文件后,仓库的状态发生变化
git add
添加到暂存区,git ls-files
查看暂存区中文件
git commit
提交暂存区文件到仓库中,会打开COMMIT_EDITMSG添加备注信息
git commit -m [message]
[message] 可以是一些备注信息。
git commit [file1] [file2] ... -m [message]
提交暂存区的指定文件到仓库区
git log
查看提交记录,可以使用--oneline
来显示简洁的提交信息
回退版本
git reset
用于撤销文件的更新
git reset --soft
,表示回退到某一个版本,并且保存工作区和暂存区的所有修改内容git reset --hard
,表示回退到某一个版本,并且丢弃工作区和暂存区的所有修改内容git reset --mixed
,表示回退到某一个版本,并且保存工作区,丢弃暂存区的所有修改内容;为默认参数
使用hard参数需要谨慎,误删之后可以通过下列方式回退:
git reflog
,查看操作的历史记录- 找到误删之前的版本号,再使用
git reset
回退到这个指定的版本
查看文件差异
-
默认参数查看工作区、暂存区之间的差异
第一行表示存在差异的文件;第二行是Git将文件内容生成的40位的哈希值,并且只显示前七位,100644是指文件权限;再往下就是修改的内容,红色是删除的内容,绿色是添加的内容 -
git diff HEAD
,版本之间的差异,HEAD指向提交的最新版本节点,HEAD~x表示HEAD之前的x个版本 -
git diff --cached
,暂存区和版本之间的差异 -
git diff xxx yyy
,比较两个特定版本xxx和yyy之间的差异 -
git diff xxx yyy filex
,比较两个特定版本xxx和yyy之间文件filex的差异内容
Git删除文件
rm
在工作区删除文件后,git add
更新暂存区git rm
可以直接删除工作区和暂存区同时删除git rm --cached <file>
可以只删除版本库中的文件- 删除后需要提交到版本库中更新
忽略文件
.gitignore
可以忽略一些不必要的文件,让我们的版本库更小
- 系统自动生成的文件,比如一些工具或者软件产生的临时文件
- 编译生成的中间文件,可执行文件等等。例如C语言生成.o文件
- 运行时生成的日志文件、缓存文件、临时文件
- 带有敏感信息的文件
.gitignore
使用前提是该文件不能是已经被添加到版本库中的文件
远程仓库GitHub
创建仓库后进行SSH密钥配置
在Ubuntu中
cd #回到用户根目录下
cd .ssh #进入.ssh文件夹
ssh-keygen -t rsa -b 4096 # -t指定为RSA协议,-b指定生成密钥大小为4096
生成密钥后得到两个文件xxx 和 xxx.pub
打开xxx.pub公钥文件,复制内容添加到到GitHub中SSH key中即可。
非第一次创建SSH密钥还需创建并添加下列五行内容到config文件中,意思是在访问Github时指定使用test这个密钥
最后git clone git@github.com:xxw016/hello_world.git
得到远程仓库
本地仓库和远程仓库关联
这里使用git pull
会直接合并远程仓库和本地仓库的分支内容,如果两个仓库的内容存在差异则合并失败;可以使用git fetch
命令来只获得远程仓库的修改而不进行合并
Git 分支
git branch
查看当前分支git branch xx
创建新的分支xxgit checkout xx
切换到分支xx,这个命令默认为切换分支;但是也可以用来恢复某个被意外修改的文件。因此Git官方提供了新的命令git switch
git merge <branch2>
目前所在分支为branch1,并将分支branch2的内容合并到branch1中- 使用
git log --graph --oneline --decorate --all
来图形化显示合并过程 - 合并后可以用
git branch -d branch2
来删除分支,如果未合并则可以用-D
来强行删除
解决合并冲突
当两个分支对同一个文件进行修改时,合并会出现冲突
git merge --abort
中断这次合并git diff
或git status
查看冲突差异信息,并手动进入目标文件修改合并的信息
rebase
图片内容参考:B站Up主GeeKHour