前言
Git是一个版本控制系统,它的作用是跟踪和管理软件开发项目中的代码变化。它可以记录每个文件的修改历史、分支和合并操作,以及协同开发团队之间的代码合作。通过Git,开发人员可以轻松地回滚到之前的代码版本,合并不同的代码分支,并且在多人协作开发时更好地管理代码变化。
一、Git的安装
打开git官网地址:https://git-scm.com/进行下载,下载后一路默认next安装就好了,这里推荐一篇超详细的安装教程http://t.csdn.cn/7SoV9,作者写的贼详细,疯狂点赞!!
二、 Git工作机制
1.本地仓库(Repository):Git使用本地仓库来存储项目的所有版本和历史记录。每个项目都有一个对应的本地的代码仓库。
2. 工作区(Working Directory):工作区是指你当前正在编辑和修改的项目文件所在的目录。
3. 暂存区(Staging Area):在你对项目文件进行修改后,Git会将这些修改添加到暂存区。暂存区相当于一个缓冲区,用于暂存你的修改。
4. 提交(Commit):当你准备好将修改保存到代码仓库时,你需要执行提交操作。提交会将暂存区中的修改保存到代码仓库,并生成一个唯一的提交ID。
5. 分支(Branch):Git支持创建多个分支,每个分支可以独立进行开发。分支可以用来开发新功能、修复问题等。主分支一般是默认的开发分支,通常称为"master"。
6. 合并(Merge):当一个分支的开发完成后,你可以将其合并到主分支或其他分支上。合并会将两个或多个分支的修改合并到一起。
7. 远程仓库(Remote Repository):远程仓库是指存储在网络上的代码仓库,如GitHub、GitLab等。你可以将本地仓库中的修改推送到远程仓库,或者从远程仓库拉取最新的修改。
三、Git常用命令
1.设置用户签名
签名的作用就是用来标识用户,以区分不同的开发人员,可以使用以下命令来设置用户签名
git config --global user.email “you@example.com”
git config --global user.name “Your Name”邮箱(随便写,符合邮箱格式就行)和名字自定义就好了
找到,gitconfig,点击打开,将会看到我们刚刚设置的邮箱和名字
2.初始化本地仓库
执行
git init
这将在当前目录下创建一个新的Git仓库。Git会在该目录中添加一个隐藏的 .git 文件夹,用于跟踪和管理版本控制的相关信息。完成后,就可以开始在该仓库中进行代码的版本控制了。
进入项目,执行git init
命令给git授权管理项目
可以看到在项目文件夹下生成了一个.git文件夹,前提是要把文件夹上的“隐藏的项目”这个选项勾上
或者你可以通过终端命令查看是否生成了.git文件夹
.git文件已经有了,此时我们就可以使用git的功能去做project文件夹下的项目版本管理
3、将文件复制添加到暂存区
我这里做一个演示,首先在project文件夹下创建一个first.txt的文件,然后使用命令git add first.txt
将first文件添加到git的暂存区
可以看到在上面图片中有一行警告,这是 因为我的Windows操作系统和Git配置不兼容所致。在Windows系统中,换行符是CRLF,而git默认使用的换行符是LF。所以在提交代码时就会出现这个警告信息。当然你可以通过以下命令行解决这个警告
git config --global core.autocrlf input
:在检出代码时不自动转换行尾,在提交代码时自动将行尾转换为LF。
(1)那如何得知文件是否被放入暂存区呢?我们可以通过git status
来查看git暂存区的状态
(2)接下来我在project项目中我再添加一个文件夹,里边再加个1.css文件,那我又该如何将这多个文件一起添加到暂存区呢?
从上图可以看到,我们可以通过
git add .
命令将project整个项目下的文件添加到暂存区中,当然我们还可以通过用git add --all
来将整个项目下的文件添加到暂存区中,如果只希望将某个文件夹添加到暂存区中,可以使用git add 文件夹名/
来进行添加,当提交的某个文件发生修改了,这些命令行会自动区分修改的文件然后进行上传,在这里我修改一下first.txt文件内容,重新执行命令行
(3)文件可以被复制添加到暂存区,那我们又该如何将文件从暂存区去掉呢?
如上图所示,我们可以通过
git rm --cached
加上已在暂存区的文件名,就可以将暂存区的文件去掉
4、提交到本地仓库(历史区)
(1) 文件存入暂存区后,下一步则会将文件提交至本地仓库,使用git commit -m "xxxx"
命令行则可以实现将暂存区文件提交到历史区,-m选项表示为提交添加注释,方便日后查看和理解
可以查看暂存区的文件,发现暂存区为空,文件添加到本地仓库成功!
(2) 还有一种情况就是当我输入git commit
直接回车时,git会自动跳转到vim编辑器里,如果强行esc键 输入:wq
退出vim的话,提交就会被终止
这种情况我们应该在vim中添加项目注释,先insert键
才能进行输入,之后按esc键
,输入:wq
,回车退出,提交完成
(3)通过git log
命令行查看 Git 仓库中提交历史。它可以显示项目中的所有提交记录,包括提交的作者、提交时间、提交信息等,对于团队协作开发非常有用,因为它可以帮助开发者了解项目中的代码变更情况,找到出现问题的代码。此外,git log 命令还可以用来跟踪项目的开发进度和历史记录。
5、版本回退
(1)git reset --hard
在进行代码演示前,先了解一下git回退版本的实质,是因为内部有个指向当前版本的HEAD指针,在git中有个默认的master主分支
,当只有一个master主分支时,head指针指向master,而master则指向当前版本,如果你当前在master分支上并且创建了一个新的分支test,那么HEAD指针就会从master分支移动到test分支。
那么,版本回退实质就是将head指针指向前面的版本,那如何实现指针回退移动呢?下面用例子来进行演示
(1)首先我对project文件夹下的first.text文件内容进行了三次改写,每改写一次提交一次到仓库,‘git’是初始内容
(2)此时head指针指向了提交的第四个版本,如果你对版本4不满意想回退到版本3,则执行git reset --hard HEAD^
命令行,回退到上一个版本,此时git就将head指针指向了版本3,实现了版本回退
(3)当然,如果你想一次性回退到n个版本,执行git reset --HARD~n
即可,这里就是将指针指向了原始版本
通过git log
可以查看到head的指针指向由版本3指向了最原始的版本
(4)当你回退到原始版本,仔细一想还是觉得版本3好,那怎么办?我知道善变的你很急,但你先别急!我们可以通过git reflog
命令行查看所有修改历史
这里能过清晰地看到我之前对head指针的操作,现在我们通过
git reset --hard
加上历史操作前面的橙色的唯一标识符,也就是哈希值,将指针指向对应的哈希值
经过此番操作,head指针又指向了版本3,我们又从原始版本回到了版本3
(2)git reset --soft
首先我对first.txt再进行一次修改并提交
接下来使用git reset --soft
命令进行版本回退
这里看起来和用hard的结果一样,但这里还是有区别的,hard,git是直接回退到工作区中,文件内容会变成上一个版本的内容,而soft是回退到暂存区,文件内容还是没执行版本回退命令行时的提交的文件内容而不是现在head指针指向的版本内容
将文件回退到暂存区有两个好处,第一是可以直接执行git commit -m
将文件重新写上注释,而不必重新添加文件到暂存区,然后再提交;第二点是文件的合并,这里我举个例子演示一下,现在我们创建一个A文件,假设里边是A功能的开发代码,现在A功能已经开发完成,我对A文件进行了提交,后面甲方要求需要在A功能里添加一个Aplus功能,那我们就要完成Aplus功能的添加,之后再进行提交,日后方便管理
过了一段时间,系统崩了,后面发现是已提交的Aplus功能需要优化一下,如果我们采取hard返回上一个版本,则要重新写Aplus功能然后再进行优化,最后提交,而且在历史记录中也会出现添加Aplus功能和优化Aplus功能两条记录,这种情况我们可以用git reset --soft HEAD^
将A.txt撤回到暂存区,然后对其进行优化并提交
从上面图可以看到,没有添加Aplus功能的记录,A.txt被撤回到了暂存区,接下来对Aplus功能优化
此时可以看到,并没有Aplus被优化的记录,而是在优化完成后新生成的文件从工作区添加到暂存区与被git reset --soft HEAD^
命令撤回到暂存区的未被优化的A.txt文件合并,最后一并提交到仓库
(3)git revert
git revert 是一个撤销某个 commit 的命令,它会创建一个新的 commit 来覆盖之前的提交,需要重新写注释,最后会生成新的提交记录。
回车进入vim编译器,需重写注释
生成一个新的提交记录,git revert并不会覆盖之前的提交记录,而reset是直接更新指针指向的历史记录,会覆盖之前的提交记录和文件变更
版本回退的内容比较多这里写个小总结吧!
小结
- 回退到上一个版本:git reset --hard HEAD^
- 回退到前n个版本:git reset --hard~n,将当前分支的 HEAD 指针向上移动 n 步,同时将工作区和暂存区的内容恢复到该版本的状态
- 回退到指定版本:git reset --hard 哈希值,哈希值可以通过
git log
查找,每个提交的前六个数即可,当然你也可以通过git reflog
来获取,这个相对杂乱
- git reset --soft HEAD^,将最新提交的文件撤回暂存区。可以对其里面的文件进行修改,git会在工作区生成新的文件,然后将新文件通过add添加到暂存区与修改前的文件合并然后一起再提交到仓库
- git revert 是一个撤销某个 commit 的命令,它会创建一个新的 commit 来覆盖之前的提交。
四、Git分支
1、什么是Git分支
git
分支,就是我们把整个文件夹分成一个一个独立的区域,比如我在主分支上开发A功能时,需要添加B功能时,这时我们就可以创建B分支,在B分支下进行开发,AB互不干扰,每个功能都是一个独立的功能分支。
*注意:*git在初始化的时候,会自动生成一个主分支,默认情况下是master主分支,当然你也可以通过
git init --initial-branch=<branch_name>来设置自己喜欢的主分支名字
又或者是当你完成开发时将代码打包提交到仓库中交给测试人员进行测试,你在主分支上就不能再对代码进行操作了,否则测试那边就乱套了,但又需要增加个功能怎么办,让测试人员等你添加完功能再测试?还是你等测试人员测试完再加新功能?这都不是节省时间的好方法,这种情况我们就可以新创建另外一条分支,使得HEAD指针指向新增的分支,我们在新的分支上对代码进行迭代,测试人员测试在master主分支上进行测试,当我们完成了代码更新,再将最新的版本与master主分支进行合并,这样就可以做到开发和测试同时进行,互不影响
2、创建新分支相关操作
(1)开辟一个分支使用git branch分支名称
(2)查看当前分支使用使用git branch
(3)切换分支 git checkout 分支名称
此时指针指向master主分支,那如何切换到new_fenzhi这个分支呢?我们可以使用git checkout 分支名称
进行切换,此时指针指向新分支
需要注意的是此时分别存在了两个工作区,一个是主分支的,另外一个是新分支的,这里我进行一个演示
<1> 在master上提交一个文件
<2> 创建新分支,也提交一个文件,在新分支上访问历史记录,可以看到主分支上的提交记录
<3> 切回master分支,访问历史记录,发现不存在“新分支上的功能开发.txt”文件的提交记录,而此时在分支文件夹下也没有“新分支上的功能开发.txt”文件的存在
(4)合并分支使用git merge 合并的分支名
经过上面的操作,我们可以知道,在master主分支上提交了一个“主分支上的功能开发.txt”文件,在new_fenzhi分支上提交了一个“新分支上的功能开发.txt”,那我们如何将他们合并在一起呢?
在主分支上直接执行
git merge 合并的分支名
执行完之后,可以发现在项目文件夹“分支”下多了一个“新分支上的功能开发.txt”
再查看记录,发现指针同时指向了master主分支和new_fenzhi分支,这说明这两个分支合并成功了
(4)删除分支使用git branch -d 要删除的分支名
当合并完之后,master分支已经拥有了new_fenzhi分支的功能了,那如何删除new_fenzhi分支呢?我们可以通过git branch -d
来删除分支
git branch
进行分支查看,发现项目里只有master主分支了,new_fenzhi分支被删除了,
再查找历史记录,也会发现指针只指向了master主分支
3、分支合并冲突问题
分支合并冲突是指在对两个或多个分支进行合并时,发现这些分支都有对同一个文件进行了修改,且修改的内容存在冲突,无法自动合并。这时就需要手动解决冲突。
下面进行一个场景演示:
(1)在git中,有两个分支,一个默认的master主分支,还有一个login子分支
(2)在master中我提交了一些功能代码和一份代码文件util.txt
(3)然后切换到子分支上,对其他功能进行开发,开发过程中,需要对util.txt文件中添加新功能,添加完毕进行提交,提交完成之后继续在login分支上开发功能
(4)突然,你发现你master主分支上的功能有bug,需要对util文件上的代码进行更改,这时你需要切换回master主分支上,对util.txt文件进行修改,然后提交
(5)这时你想将master上util修改的内容和子分支login上util新增的功能合并到一个文件中,执行合并指令,发现合并失败
(6)这里合并失败的原因是因为主分支和子分支对同个文件进行了修改,经过主分支修改bug生成了一个版本,子分支添加功能又生成一个版本,两个版本的util文件形成了冲突,不知道要谁来覆盖谁,这时我们需要自己手动解决
这个是用vscode中打开的
解决合并失败这个问题,我们只需要点击保留双方更改
这个选项,或者在记事本中手动删掉标识字符,留下自己想要的
之后进行提交操作,查看util文件,发现合并冲突问题解决,合并成功了!!
五、GitHub远程库
为了方便团队的协作,我们可以将本地库的代码文件托管在远程服务器上的代码仓库,这样可以方便地进行代码协作和版本管理,而GitHub远程库是指GitHub网站上托管的远程代码仓库,用户可以在本地开发代码,并将代码推送到远程库中,其他开发者也可以从远程库中拉取代码进行协作开发。那么我们该如何在GitHub上进行代码管理?
1、首先我们需要在GitHub官网(https://github.com/)注册一个账号,登录账号,创建自己的远程仓库
点击New repository,开始创建仓库
点击Create repository,仓库创建成功,会生成一个远程仓库地址
2、将本地仓库连接到远程仓库
通过命令
git remote add origin https://github.com/HaoZai6/First_Repository.git
将本地Git仓库中添加一个名为"origin"(可自定义)的远程仓库,名字代表着地址,后续对远程仓库地址进行其他操作时,可以省略后面的一大串地址,运行完指令之后,本地仓库就可以对远程仓库进行互动。
3、可以使用
git remote -v
命令来查看当前所有的远程仓库及其对应的地址。
4、可以使用
git remote remove <remote_name>
指令来删除远程仓库,<remote_name>
代表要被删除的仓库名
5、
git push <remote> <local branch>:<remote branch>
其中,<remote>
代表远程仓库的名称,<local branch>
代表本地分支的名称,<remote branch>
代表远程分支的名称。
这将把本地 master 分支的修改推送到名为 origin 的远程仓库的 master 分支上,回车第一次会跳出登录界面,登录即可
再回到git终端,可以看到,本地文件已经上传成功了
再去GitHub查看仓库,会发现本地的文件已经成功上传到远程仓库了
6、通过
git branch -r
查看远程分支
又或者通过查看所有分支,来查看远程分支
7、通过
git pull
从远程仓库拉取最新的代码,并将其与本地仓库合并。简单来说,它是git fetch和git merge两个命令的结合。
- 从远程仓库中获取最新的代码,使用git fetch命令。
- 将获取的代码与当前分支合并,使用git merge命令。
git pull <remote> <branch>
,这里的 <remote>
是远程代码库的名称,<branch>
是要从中更新的分支的名称。如果您省略分支名称,则使用默认的分支。例如,要从名为 origin 的远程代码库和 master 分支更新本地代码库,您可以运行:git pull origin master
需要注意的是,如果在拉取代码时,本地仓库和远程仓库都对同一个文件进行了修改,就会产生冲突。此时git pull会提示你解决冲突,或者使用其他工具解决冲突。
git pull会将远程仓库中最新的代码直接合并到你当前所在的分支中,因此在执行该命令之前,建议先保存当前的工作进度。如果需要从远程仓库拉取代码,但不想直接合并到当前分支中,可以考虑使用git fetch和git merge两个命令分别执行。
8、
git clone [repository URL]
用于在本地计算机上创建远程仓库的副本,下载位于远程服务器上的代码仓库的副本,包括其所有文件、分支和历史记录。一旦你克隆了该仓库,就可以修改代码并将这些更改推送回远程服务器。下面做个演示:
(1)在前面,我们已经在GitHub中创建了仓库并上传了文件,现在需要将这些文件下载到另外一个本地仓库中
(2)创建新的本地仓库,并使用git clone
命令将远程仓库中的文件下载到本地仓库
总结
- git的安装http://t.csdn.cn/7SoV9;
- git的工作机制;
- 设置用户签名;
- 初始化本地仓库;
- 将文件复制添加到暂存区;
- 将文件从暂存区提交到历史区;
- 查看 Git 仓库中文件提交历史信息;
- 版本穿梭;
- 多分支;
- 合并冲突问题的解决
- 本地仓库与远程仓库的连接及相关操作