GIT从入门到入土(IDEA集成)
一、源起代码,对于软件公司而言是最为宝贵的资产。如何保管代码才是是最高效的呢?假设我们不使用任何工具,各自为政,那么将会至少存在以下几个问题:团队成员因为硬盘损坏或者离职等原因导致代码丢失,则该成员的代码丢失团队成员无法得到其他成员的代码。需要定期花时间将自己的代码与其他成员合并(两两合并),以便于得到完整的代码,项目一旦复杂,这个工作量极大如果项目开发过程中,发觉编码思路出错,需要将代码回退到三
一、源起
代码,对于软件公司而言是最为宝贵的资产。如何保管代码才是是最高效的呢?
假设我们不使用任何工具,各自为政,那么将会至少存在以下几个问题:
- 团队成员因为硬盘损坏或者离职等原因导致代码丢失,则该成员的代码丢失
- 团队成员无法得到其他成员的代码。需要定期花时间将自己的代码与其他成员合并(两两合并),以便于得到完整的代码,项目一旦复杂,这个工作量极大
- 如果项目开发过程中,发觉编码思路出错,需要将代码回退到三天前的状态,则需要全部重写
- 项目上线后,发觉存在一个低级bug,需要确认这个bug谁写的(然后…)
这里涉及到的都是代码管理的问题。而且只是真实世界代码管理问题之中很少很少的一部分。
解决这类问题的专业工具,就是今天要介绍的代码管理工具,或者称为版本管理工具(VCS Version Control System)。
VCS 中每次将代码更改提交给VCS管理时,就会产生一个版本(Version),因此可以追踪到单个文件的更改。一般的VCS系统都存在一个服务器,可以将本地代码提交到远端服务器,并支持自动的代码合并,因此团队成员可以轻松地共享代码,合并代码的成本也大大降低。
市面上的VCS软件非常多,但群雄逐鹿的年代已经过去了。Git 就是现今最为流行和最为强大的版本管理系统。他的作者就是鼎鼎大名的linux内核作者linus torvalds。是大佬云集的linux社区用来管理linux内核代码的版本管理工具,看血统也知道必然强大。
二、Git的安装
windows
访问git官网(git-scm.com/) 下载安装包,之后点击下一步到底安装。安装完成后,git提供了一个git-bash,是在windows下模拟的linux终端,可以使用基础的linux命令。
linux
使用包管理器直接下载安装。比如centos下 yum install git
mac
建议使用homebrew安装, brew install git
三、Git基本概念
我们来以Git为例,讲解下VCS常见的一些概念。
Git-Server 及 Git Remote
Git是C/S架构,意味着Git也存在一个服务器,一个本地客户端。一个Git服务器(git-server)可以托管多个git代码仓库(git-repository)。意味着,你可以在同一个git服务器上,为项目A创建一个代码仓库,也可以为项目B创建一个代码仓库,两个代码仓库独立管理,互不影响。每个在服务器上的代码仓库相较于本地代码仓库而言称为remote,每个本地客户端可以存在多个remote。也就是说,你可以将同一个项目的代码推送到多个remote。比如推送到国外的github,同时推送到国内的gitee.
git服务器可以自建(常用工具gitlab,gogs),也可以使用托管服务网站。最著名的就是github.com,但因为众所周知的原因速度稍慢。国内的主要有码云(gitee.com),阿里code等。
Git-Client 及 本地代码仓库
我们的代码在自己电脑上,要与git服务器交互,显然需要一个客户端,称为git-client。最早git是linux的一个命令行程序(毕竟人家是linux之父写的),所以Git-client在linux下就是git命令。随着技术发展,现在也有windows版本,也出现了一些GUI工具(最著名的有SourceTree)等。
Git本地代码仓库,是git远程仓库的一个本地副本。通常的表现形式是一个名为 .git
的文件夹。它支持本地提交,并支持跟远程仓库进行同步。
Git会在本地的每次提交会产生一个版本,git会分配一个独立的提交ID,提交包含了文件的修改内容、提交的说明信息、作者信息等。git可以在不联网的情况下浏览提交记录,包括本地提交以及已经同步过的远端提交记录。也可以单独查看某个文件的修改信息。git支持也支持回滚到某个特定的版本,方便撤销代码更改。当提交被推送到远端时,这些提交记录也会被提交。
git对文件的管理是需要主动添加的。一旦添加后,git会自动监控文件修改,并根据是否提交来更新文件状态。
Git分支
Git的一个重要的作用是支持并行开发,比如 A和B独立开发两个不相关的功能,可以同时开发,并且在合适的时间合并代码。这项支持的特性称为Git分支,是Git一项非常重要的特性。后续我们在其他文章中单独来讨论。
四、Git的使用
4.1 创建远端仓库
下面来讲解git的用法,首先我们需要有一个git的远端仓库。个人学习不建议自建,建议使用gitee。
- 首先访问 https://gitee.com/signup?from=homepage 注册gitee账号
- 然后点击头像旁的+ 号 创建仓库
- 如果是多人协作,可以在仓库管理界面中添加人员,操作如下
将链接或者二维码发给邀请的对象即可。
4.2 本地仓库操作
下面 我们来讲解本地仓库的几个基本的操作
- 克隆:clone,从远程下载一个代码仓库的操作,在git称为clone克隆操作,这个操作不单是下载了仓库中的代码文件,也包括了提交记录,分支等等附属信息。克隆完成后,本地得到的是一个完整的仓库
- 添加:add, 将一个文件添加到git管理范围中。
- 提交:commit,这个提交是本地提交,在本地仓库中创建了一次提交,产生了一个版本,并且新增了提交记录。不需要联网。
- 推送:push,将本地代码仓库的提交信息及代码更改推送给远程仓库,需要联网
- 拉取:pull 从远程仓库下载代码更改及提交信息,需要联网
具体操作步骤:
- 打开一个git-bash终端,首先配置环境
$ git config --global user.name "你的名字或昵称,用户名"
$ git config --global user.email "你的邮箱,与【设置-多邮箱管理】中的“提交邮箱”保持一致"
- 使用 git clone 命令克隆一个远程仓库
$ git clone https://gitee.com/somename/somerepo.git
Cloning into 'somerepo'...
remote: Enumerating objects: 273, done.
remote: Counting objects: 100% (273/273), done.
remote: Compressing objects: 100% (270/270), done.
remote: Total 273 (delta 102), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (273/273), 117.85 MiB | 3.75 MiB/s, done.
Resolving deltas: 100% (102/102), done.
Updating files: 100% (79/79), done.
仓库地址在gitee仓库页面获取
- 切换到clone完成的项目目录下,在文件夹中添加文件,并使用git add 将文件添加到git管理中
# 切换到项目文件夹下
$ cd somerepo/
# 使用vi创建一个文本文件
$ vi somecode.txt
# 查看当前目录下的文件状态,可见是Untracked files
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
somecode.txt
nothing added to commit but untracked files present (use "git add" to track)
# 使用git add将文件加入到git管理范围内
$ git add somecode.txt
warning: LF will be replaced by CRLF in somecode.txt.
The file will have its original line endings in your working directory
# 此时文件状态变为 new file
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: somecode.txt
- git status 查看工作区状态
- git commit 提交到本地的代码仓库
git commit -m 提交消息(说明本次提交的作用)
$ git commit -m '新增重要代码'
[master bb5a735] 新增重要代码
1 file changed, 1 insertion(+)
create mode 100644 somecode.txt
- git push 推到远端,这一步可能会弹出验证框,需要你填入用户名,密码,则按照注册gitee时的用户名密码填写
$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 314 bytes | 157.00 KiB/s, done.
Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/somename/somerepo.git
afbb494..bb5a735 master -> master
- git log 查看日志记录,后面跟文件路径即可查看某个文件的变更记录
$ git log
commit bb5a7350d504b5e26fc6d1932e2165cc31aedbff (HEAD -> master, origin/master, origin/HEAD)
Author: xxx <xx.xxx@163.com>
Date: Thu Jul 22 16:54:45 2021 +0800
新增重要代码
- 在gitee仓库管理页面,直接新增一个文件,随便填一些内容,便于模拟拉取
- git pull 拉取远端的修改
$ git pull
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 268 bytes | 15.00 KiB/s, done.
From https://gitee.com/somename/somerepo.git
bb5a735..fd0f532 master -> origin/master
Updating bb5a735..fd0f532
Fast-forward
abc.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 abc.txt
4.3 解决冲突
冲突的产生是因为两个客户端同时修改了同一个文件的同一个位置,git无法自动合并,因此爆出冲突。
解决冲突的原则:先商量,再操作,严禁不商量直接覆盖别人的代码
模拟方式:同时在本地和gitee仓库管理页修改somecode.txt 的同一行
1)修改gitee仓库中的somecode.txt,提交编辑(无须推送,立即就应用到代码仓库里了)
- 点击文件,进入文件界面,选择编辑文件
- 内容改为 java123
2)提交本地代码,并push,会直接报错
# 修改同一文件,内容改为 java456
$ vi somecode.txt
# 再次添加修改
$ git add somecode.txt
warning: LF will be replaced by CRLF in somecode.txt.
The file will have its original line endings in your working directory
# 提交
$ git commit -m 制造冲突
[master 61fca79] 鍒堕€犲啿绐? 1 file changed, 1 insertion(+), 1 deletion(-)
# 推送,与远端冲突,无法推送,要求先拉取(pull)
$ git push
To https://gitee.com/maizdotme/class56phrase3.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'https://gitee.com/maizdotme/class56phrase3.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
# 拉取后报文件冲突
$ git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 261 bytes | 16.00 KiB/s, done.
From https://gitee.com/maizdotme/class56phrase3
e9d1c58..9ceecd7 master -> origin/master
Auto-merging somecode.txt
CONFLICT (content): Merge conflict in somecode.txt
Automatic merge failed; fix conflicts and then commit the result.
3)解决冲突
冲突后的文件内容改为:
<<<<<<< HEAD
java456
=======
java123
>>>>>>> 9ceecd77ce954380e3f4a75e0aa4a9df6b67ce4f
=======
之上的内容为本地内容 ,之下的是远端服务器上的
手工修改文件内容,之后再add、commit、push即可
# 修改内容为 java123456
$ vi somecode.txt
$ git add somecode.txt
$ git commit -m 合并冲突
[master 0415e1e] 合并冲突
# 推送成功
$ git push
Enumerating objects: 10, done.
Counting objects: 100% (10/10), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 552 bytes | 184.00 KiB/s, done.
Total 6 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.0]
To https://gitee.com/maizdotme/class56phrase3.git
9ceecd7..0415e1e master -> master
五、IDE集成
以上介绍了git的基本操作。但通常我们的开发是在IDE中进行的。如何在IDE中使用GIT呢?
这里以idea为例介绍一般IDE中的集成用法。
idea可以自动识别git项目,因此当你将一个git项目导入idea时,idea就会自动添加git支持。
根据个人经验,如果想在idea中使用git管理项目。建议按如下步骤操作:
- 在云端创建git仓库
- clone到本地
- 将项目代码放到该代码仓库中 或者 创建项目时将项目代码位置指向该代码仓库
- 导入项目到idea中,idea会自动识别
常见操作支持:
clone
选择菜单栏VCS > Get from version control
填入git仓库地址,选择文件夹路径
结束后会弹出询问框,是否打开新项目
add
idea会在新建文件之后询问是否加入到git,也可以勾选记住选项
这里需要提一下 .gitignore
文件,这个文件可以放置在项目的根目录下,列出git需要忽略的文件,比如,maven项目的target文件夹, .idea
文件夹,idea的 .iml
文件等。git每次提交时会自动忽略这些文件。建议使用上。
commit
使用快捷键 ctrl+k
push
使用快捷键 ctrl+shift+k
pull
使用快捷键 ctrl+t
log
idea识别出git项目后会提供git日志查看界面
解决冲突
当出现冲突时,选择点击冲突文件即可进入以下的冲突解决界面,点击④和⑤处的加入到结果或者取消
其他
另外,还有两个地方是跟git有关的,这两个地方就可以完成所有的git相关的功能了
一个是在项目上右击选择Git菜单
另一个 是在顶部菜单 VCS
菜单下
六、总结
本文主要是介绍VCS的概念,及Git的基本使用。内容比较粗浅,旨在帮助大家快速了解到Git的基本概念及基本使用。细节有不清晰的地方,可以提出探讨。
无论你在学习上有任何问题,重庆蜗牛学院欢迎你前来咨询,联系QQ:296799112
资源:
- Git官方的开源书籍 《Pro Git》在线中文版 https://git-scm.com/book/zh/v2
- 廖雪峰的GIT教程 https://www.liaoxuefeng.com/wiki/896043488029600
- backlog的有趣GIT教程 https://backlog.com/git-tutorial/cn/
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)