一、介绍
今天学习了Git,为了以后更方便的管理自己的项目代码以及使用相关的开源网站(github、gitlab、码云…)。众所周知,Git是一个免费的、开源的分布式项目管理工具。开发人员在开发系统时经常使用Git管理项目代码,主要使用Git解决下面几个实际问题:
1.协同开发
2.代码还原
3.代码备份
4.追溯问题代码的责任人
二、Git常用命令总结
1.设置用户信息
#设置用户名
git config --global user.name "username"
#设置用户名
git config --global user.email "useremail"
顾名思义,上面两句命令行负责设置用户信息,命令行中双引号表示的内容为:
“username” 是你设置的用户名,
“user-email” 是你设置的用户邮箱。
2.设置常用指令别名
① 打开用户目录,创建 .bashrc 文件
touch .bashrc
② 在.bashrc文件中设置指令的简易别名
#用于输出git提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'
③ 打开gitBashrc 以下命令 ~ 表示gitBash的根目录,source是执行文件的命令
source ~/.bashrc
3.解决GitBash乱码问题
① 打开GitBash执行下面命令
git config --global core.quotepath false
② 找到{git_home}/etc/bash.bashrc 文件最后加入下面两行,{git_home}是安装Gitbash的根目录
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
4.创建本地仓库
①在本地电脑新建一个文件夹,作为本地的Git仓库。
②进入这个目录中,点击右键打开Git bash窗口。
③执行 “git init” 命令,"git init"作用是初始化当前目录作为git仓库。
git init
④创建成功后,可以在当前目录下看到 “.git” 目录。
5.Git的基础操作指令
在了解Git基础操作之前,先要了解一下Git对于文件修改存在的几个状态。
使用Git管理的文件,不同状态的文件的文件会存在不同的区域中,有以下三个区域:
工作区 :未暂存和未跟踪状态这两种状态的文件存放在工作区,开发者在工作区编写程序,编写好的程序文件可以提交到暂存区。
暂存区:处于暂存状态的文件可以提交到仓库,每次向仓库提交的是所有暂存区的文件。
仓库:已提交状态的文件保存到仓库中,所有的开发人员都可以将仓库中的文件拉取到自己的本地仓库。
5.1 控制文件的状态
1.查看修改的状态
git status
2.将工作区的文件添加到暂存区
命令形式: git add 单个文件名 | 通配符
下面命令中 “.” 表示工作区中的所有文件,也可以直接跟文件名,那个文件就是要提交的文件。
git add .
3.提交暂存区到本地仓库
git commit -m "这里的内容可作为备注,写你当前提交的文件所做的操作"
4.查看提交日志
命令行形式: git log [option]
options:
–all 显示所有分支
–pretty=oneline 将提交信息显示为一行
–abbrev-commit 使得输出的commitId更简短
–graph 以图的形式显示
在2.2小节中为上述的日志参数设置了别名为log-git,也就是说log-git等价于上述所有参数命令的组合,可以根据自己的喜好来配置相关参数。
5.版本回退
**作用:**切换仓库中提交文件的版本,目的是防止向仓库中提交错误版本的代码。例如:当前有一个开发者向仓库中提交了一个错误版本的代码,可以利用版本切换功能,将当前仓库中的代码版本切换回上次正确的提交版本。
具体流程如下:
①查看提交操作的 commitID
每次对仓库进行提交操作时,Git都会给这个操作赋一个commitID, 代表这一操作的唯一标识。执行"git-log" 或者"git log" ,可以查看提交日志。如下图所示:
查看已删除记录
如果日志记录被删除,可以使用如下命令来查看已经删除的记录。
git reglog
②版本切换命令形式
下面命令行中,“commitID” 是每一次提交操作的ID标识符,填写最近一次正确版本的commitID即可将仓库中的代码还原到上一次正确的版本。
git reset --hard commitID
6.添加文件至忽略列表
一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动
生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:
在上图中,".gitignore"文件中的内容为: .a, 表示所有后缀名为“.a”的文件都不被Git仓库管理。
注意: .gitignore文件只能解决未被追踪的文件,如果已经被git追踪的文件,需要删除其追踪状态。
.删除文件追踪状态
git rm --cached 文件名称
5.2 分支
分支的作用:分支主要用来解决协同开发的问题,可以给项目中每一个开发者创建一个分支,所有分支编写的代码最终都提交到master(一般都叫这个名称,这个分支作为仓库使用)分支中,也从master分支中拉取或抓取代码。 这样,项目中的每一个开发者都可以及时将自己的代码提交到仓库,而其他开发者可以从仓库中将更新的代码拉取到自身的本地仓库。每一个开发者都可以及时掌握项目的最新版本代码,在自己电脑上的本地仓库进行开发调试,开发完自己相应的功能,再将相应代码提交到仓库中,与其他开发者共享,达到协同开发的目的。
也可以理解成每一个开发者的电脑,都可以作为一个服务器,运行项目中所有开发者提交到仓库中的代码,这种分布式管理的好处是可以使开发者按照自己的开发进度开发,有效避免对其他开发者的影响。
1.创建本地分支
下面命令中 "branchname"是创建的分支名称,可自己起。
git branch branchname
2.查看本地分支
git branch
3.切换分支
下面命令行中,"branchname"是想要切换的分支名称
git checkout branchname
以直接切换到一个不存在的分支(创建并切换)
git checkout -b 分支名
4.合并分支
可以将一个分支上的提交合并到另一个分支,先登录合并的原分支,然后运行下面命令行,合并目标分支。
branchname 是目标分支的名称
git merge branchname
5.删除分支
①参数为 “-d”, 删除分支时,需要做各种检查
git branch -d branchname
②参数为“-D",不做任何检查,直接强制删除
git branch -D b1
6.解决分支冲突
发生冲突的场景: 两个分支同时修改同一文件同一行的内容,将两个分支合并到一起时,会发生冲突,git会将两个分支修改的内容全部保留,留给开发者决定保留那个分支修改的内容。下图是产生冲突的文件,<<<<<<<<<HEAD至========是当前分支修改的内容,=========至>>>>>>>>>dev01是分支dev01修改的内容。
解决方法:
① 删除起冲突的文件中要弃用的内容。
② 将文件重新添加至暂存区,并重新提交。
三、使用远程仓库
Git可以链接远程仓库,将开发好的代码推到远程仓库,并可随时将远程的仓库代码拉取到本地仓库,进行协同开发。
比较常用的远程仓库有:
github : https://github.com/
码云: https://gitee.com/
GitLab: https://about.gitlab.com/
本节以链接码云为例,演示链接远程仓库以及代码管理的过程。
1.创建远程仓库
在码云( https://gitee.com/signup)上创建一个远程仓库,名为"show_git_operation"。
创建好远程仓库之后,下图中的SSH是该远程仓库的地址,将其复制下来。
2.操作远程仓库
①链接远程仓库
- 第一次链接
如果是第一次链接,可以尝试配置SSH公钥,方便下次直接链接,不需要每次链接都输入码云的密码。
配置SSH公钥
I.在本地仓库执行下列命令,生成SSH公钥,如果公钥已经存在,则覆盖
ssh-keygen -t rsa
II.Gitee设置账户共公钥
在本地仓库输入以下命令,获取SSH公钥
cat ~/.ssh/id_rsa.pub
下图是公钥内容,选中即复制
将公钥复制到码云上,点击确定
在本地仓库中输入以下命令,查看是否配置成功
ssh -T git@gitee.com
-
非第一次链接
如果第一次已经配置好SSH了,直接执行以下操作链接就好。先初始化本地仓库(在上文2.1~2.4小节已经分析了如何初始化本地仓库)------》再将本地与远程仓库进行连接。链接命令如下:
git remote add origin https://gitee.com/ma-haokainb/show_git_operation.git
上面的命令行中,"git remote add"是链接远程仓库命令,"origin"是给链接的这个远程仓库起的别名。最后面是这个远程仓库的地址。
②查看连接到的远程仓库
git remote
上图显示的结果是当前本地仓库链接的两个远程仓库。
③将本地仓库中的内容推送到远程仓库
a.命令行参数解释
命令形式:git push [-f] [–set-upstream] [远端名称 [本地分支名][:远端分支名] ]
-
git push 是基本的推送命令
-
-f 表示强制覆盖,不管推送的内容有没有冲突。
-
–set-upstream 推送到远端的同时并且建立起和远端分支的关联关系(git push --set-upstream origin master),建立联系以后,再次向远程仓库推送代码,只需要直接运行"git push"命令即可将代码推送到相关的远程仓库文件。
-
如果当前分支已经和远端分支关联,可以省略分支名和远端名。(git push 将master分支推送到已关联的远端分支)
例:git push --set-upstream origin master :master
上例的命令就是将本地的master (第一个master)分支,推送到远端名为origin的远程仓库中一个master第二个master分支上,并且与之建立关联,下次推送代码只需要执行“git push"指令即可。
b.演示将本地仓库的文件推送到远程仓库
在本地仓库执行下面命令,将本地master分支中的内容,推送到远端为"origin1"的"master"仓库中,并建立关联。
git push --set-upstream origin1 master
下图显示的是本地仓库执行完该命令的结果,显示已经完成本地仓库到远程仓库的推送。
成功完成推送后,查看远程仓库内容是否更新。
上图是刚刚创建的远程仓库,可以看到本地仓库成功将本地文件推送到远程仓库中了。
④查看本地分支与远程分支的联系
git branch -vv
下图是在执行命令行后的结果,显示当前本地的master分支,与名为origin1的远程仓库中的master分支建立了关联。
⑤从远程仓库克隆
a. 命令行解释
除了将本地仓库的内容推送到远程仓库,也可以将远程仓库的内容克隆到本地。
命令形式:git clone <仓库路径> [本地目录]
注:本地目录可以省略,会自动生成一个目录。
b.演示从远程仓库克隆的过程
- 在本地新建一个目录,新建一个本地仓库,并对其初始化。
- 在码云中复制要克隆的仓库地址
- 回到本地仓库,执行下面命令
以下命令行中,“git clone”是基本命令参数,后面的地址是上一步从码云上复制的地址。
git clone https://gitee.com/ma-haokainb/show_git_operation.git
执行命令后本地仓库显示克隆成功
查看本地目录文件,已经成功克隆到远程仓库的所有文件。
⑥从远程仓库中抓取和拉取
a.命令行解释
远程分支和本地的分支一样,我们可以进行merge操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
-
抓取 命令:git fetch [remote name] [branch name]
注意:抓取指令是将仓库里的更新都抓取到本地,不会进行合并;
如果不指定远端名称和分支名,则抓取所有分支。 -
拉取 命令:git pull [remote name] [branch name]
注意:拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge;
如果不指定远端名称和分支名,则抓取所有并更新当前分支。
b.演示抓取和拉取操作
- 在gitWarehouse这个本地仓库进行一次提交并推送到远程仓库
- 在new_git本地仓库上拉取远程仓库的代码
执行以下命令,加后面的参数是因为new_git仓库中的master分支还未与远程仓库git_warehouse中的master分支建立关联,直接拉取会报错。
git pull origin master --allow-unrelated-histories
仓库显示成功拉取
⑦合并冲突
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。
A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支。
在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。
解决合并冲突与解决本地冲突类似,可以参照上面2.5.2解决分支冲突章节。
四、总结
本篇文章介绍了Git仓库的基本用法,属于Git使用的基础阶段,尽量详细介绍了每一个基础操作,方便以后使用时及时复习。至于进阶用法,今后在使用过程中会慢慢总结,以后会坚持写博客,记录自己的成长,目前还是小白水平,希望以后的文章会越来越好,也希望自己的文章能给陌生的你带来帮助,如有错误,请多多指教——2022年7月21日0点5分。