✨✨学会Git就靠这一篇!
这是我第一次写如此长篇的文章,优秀的文章离不开读者的支持~
如果有存在问题的地方欢迎大家在评论区留言,我会第一时间改正~
Git是一个分布式版本控制工具。
版本控制:在开发时功能需求是随时变化的,比如我们写了一个购物车退货的功能,甲方突然表示这个功能不需要了,这时有了版本控制工具就可以直接回到之前的某个版本,不需要一行一行来修改代码。
分布式:同一个项目由很多个人编写,但是张三在北京,李四在上海,王五在杭州,有了Git就可以帮助我们合并不同人写的代码,我们在任何地方都可以控制代码的版本。
GitHub与码云都是代码托管平台。
使用Git可以将代码放在本地仓库,也可以将代码放在远程仓库,GitHub就是我们存放代码的远程仓库。
GitHub因为只支持git作为唯一的版本库格式进行托管,故名GitHub。简单来说,GitHub是一个代码托管云服务网站,帮助开发者存储和管理其项目源代码,且能够追踪、记录并控制用户对其代码的修改。甚至你可以简单粗暴的把它当作一个网盘,用来存储任何东西。
码云可以看作是中文版的GitHub,由开源中国出品。
TortoiseGit的图标是一个小乌龟,是Git版本控制客户端,几乎是人尽皆知的Git图形化管理工具。如果仅仅安装了Git,我们只能用命令行来操作Git,在安装了客户端以后就可以借助图形界面使用鼠标点点点来操作Git了。
除了ToroiseGit,还有很多图形化管理工具,作为入门推荐的是一个叫做GitKraken的图形化客户端,界面漂亮,功能也很全面,对个人完全免费~
GitKraken官网:https://www.gitkraken.com/
支持平台:
Git下载:
Git官网:(https://git-scm.com/
腾讯软件中心下载:(https://pc.qq.com/search.html#!keyword=git)
软件安装:
Git的安装非常简单,全部点击“下一步”就可以了( $ _ $ )
建议安装到默认目录,很多第三方软件调用Git时会去默认安装目录寻找,这样就免去了手动配置的麻烦。
安装完成后鼠标右键会看到Git GUI Here
与Git Bash Here
。
打开资源管理器,进入一个项目文件夹,鼠标右键,点击Git Bash Here
,打开Bash命令行工具。
安装完Git之后,第一件要做的事就是设置用户名名和邮箱。每一个Git提交都会使用这些信息来区分是谁提交的代码,它们会写入到每一次提交中,不可更改:
$ git config --global user.name "student_Max"
$ git config --global user.email "[email protected]"
如果使用了--global
可选项,所有的Git提交都会使用这些信息。如果要针对特定的项目使用不同的用户名和邮件地址,可以在特定项目的文件夹下运行没有--global
的命令配置。
使用第三方GUI工具会在第一次运行时帮助你配置这些信息。
列出所有Git可以找到的配置:
$ git config --list
有三种方法查看Git命令的综合手册:
$ git help <verb>
$ git <verb> --help
获取后一类指令的使用帮助(比如config命令的使用手册):
$ git help config
输入后会弹出一个网页~
将当前的文件夹作为我们的本地仓库:
$ git init
初始化以后会在文件夹中会多出一个隐藏文件夹.git
。
先创建Git-Study文件夹作为我们的本地代码仓库,在此文件夹中按鼠标右键,打开Git Bash。
初始化仓库
$ git init
添加一个文件Hello.c,在bash中的命令与Linxu系统的命令是一样的,我们先直接通过命令行来创建一个.c
文件。
$ touch Hello.c
$ echo helloworld > Hello.c
提交至缓存区
$ git add Hello.c
提交至本地仓库,引号中填写版本的名字,这里叫做first
$ git commit -m 'first'
Git有三种状态,你的文件可能会处于其中之一:已提交(committed)、已修改(modified) 和 已暂存(staged)。
这样我们的Git项目会拥有三个阶段:工作区、暂存区和Git目录(仓库)。
在某个文件夹下使用$ git init
命令后,这个文件夹一般就叫做本地仓库,在仓库中管理我们项目的各个版本。工作区,暂存区,版本库都在这个文件夹中,或者说都在仓库中,由它们共同组成了我们的本地仓库。
缓存区在.git
隐藏目录中的index
文件,所以缓存区有时也叫做索引。
图片来源:CSDN博主vonphp:GIT(三)— 工作区、暂存区和版本库(仓库)-(重点)
查看当前状态来了解那些文件是新添加的,哪些文件已经加入了暂存区。
$ git status
先在Hello.c文件的末尾添加新的内容,此时在来查看当前的状态。在Bash中可以看到Hello.c显示为红色,告诉我们该文件处于已修改的状态,还没有放到暂存区。
添加文件至暂存区,再查看状态。
$ git add Hello.c
这时会提示我们修改的文件可以提交。执行提交命令,再查看状态。
$ git commit -m 'second'
补充:如何将工作区的所有文件一次性添加到缓存区?
点.
表示所有文件。
$ git add .
查看历史操作记录:
$ git log
结果中:
head代表当前所处的分支,master代表当前是master分支。
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$ git log
commit 0172966fe45459e5d1a7e4ced996990758a22cc1 (HEAD -> master)
Author: student_Max <706694938@qq.com>
Date: Sat Jan 22 18:22:57 2022 +0800
second
commit 4ca483bcafeac527a9849cc08d04c41e7b635668
Author: student_Max <706694938@qq.com>
Date: Sat Jan 22 16:30:04 2022 +0800
first
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$
head指针指向当前正在编辑的版本,head后加一个~
表示回退一个版本。
$ git reset head~
回退多个版本:
$ git reset head~~
$ git reset head~10
可选参数:
--hard
:回退版本库,暂存区,工作区,不只移动head指针,还会将暂存区的文件还原到工作目录。(修改过的代码会删除,要谨慎使用)--mixed
:默认参数,回退版本库,暂存区。--soft
:回退版本库。(只移动head指针,相当于撤销上一次的提交)不仅可以往回滚,还可以往前滚。
查看所有的历史提交(包括回退的):
$ git reflog
Git记录了每一次操作的版本ID号。
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$ git reflog
0172966 (HEAD -> master) HEAD@{0}: commit: second
4ca483b HEAD@{1}: commit (initial): first
使用ID号往前滚:
$ git reset --hard 0172966
对比版本之间有哪些不同。
比较工作区和暂存区:
$ git diff
先在文件中添加新内容,进行比较:
比较最新提交:
$ git diff head
比较两个历史快照:
$ git diff 0172966 4ca483b
比较某一仓库版本和暂存区:
$ git diff --cache 0172966
如果不小心删除了Hello.c,还可以从暂存区中拉回:
(手动删除只会影响工作区)
$ git checkout -- Hello.c
删除文件:
$ git rm Hello.c
rm
命令只是删除工作区和暂存区的文件(取消跟踪),再次commit,版本库中也会删除。
$ git commit -m 'del'
直接在文件夹里重命名会出错。
比如把Hello.c改为abc.c:
Git会认为我们删除了Hello.c并且新创建了abc.c文件。
正确的姿势应该是git mv 旧文件名 新文件名
:
$ git mv Hello.c abc.c
在项目中有一些文件是不需要进行版本管理的,比如IDEA项目会有很多配置文件,我们只需要管理源代码,忽略其中的配置文件。
比如工作目录中有temp.txt文件,我们想将其忽略,此时可以:
创建名为.gitignore
的文件(之前版本的Windows不能手动创建,只能通过命令解决)
$ touch .gitignore
在文件中添加要忽略的文件
$ echo *.tex >> .gitignore
星号*
是通配符,表示忽略所有以.txt
结尾的文件。
如果要忽略这个文件本身,可以:
$ echo .gitignore >> .gitignore
一般不忽略它本身,因为从远程仓库下载的代码还要用到它。
在Git的简介中我们知道Git是一个分布式版本控制工具(VCS-Version Control System),前面的基础命令主要介绍了版本管理相关的命令,接下来让我们来进一步了解Git的分布式特点中常用到的概念—分支。
假如我们的项目上线了,过了一段时间有了新的需求,为了保险起见,这时候肯定不能直接在当前项目上进行开发,所以就有必要引入分支的概念了。
在Git中用Master代表主线(主分支),也就是我们项目的正式版本,当需要添加新的功能或者有其他人想修改我们的代码时,只需要从主线版本中将代码拷贝到其他地方,形成一个分支,在这个分支上进行开发。如果分支开发的功能想要上线,也可以将分支代码与主线合并,同时这也使多人协同开发成为可能。
如果张三想要开发新的功能,李四也想开发一个新的功能,他们不需要在项目的正式版本中进行修改,而是在分支上进行独立的开发,确保代码没有问题后再与主线合并,避免了正式版本可能会出现错误的问题。
Git中每一个结点都是一个完整的项目,所以只需要多创建一个“指针”指向分支开始的位置即可。
创建一个新的分支,分支一般命名为feature-功能
,比如:
$ git branch feature-login
查看当前状态。
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$ git status
On branch master
Changes to be committed:
(use "git restore --staged ..." to unstage)
modified: Hello.c
new file: temp1.txt
Untracked files:
(use "git add ..." to include in what will be committed)
.gitignore
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$
On branch master
表明我们目前在主线(Master)上,要切换分支,可以:
$ git checkout feature-login
再看我们的状态:
On branch feature-login
说明现在分支已经从主线切换到了feature-login,head
指针也会指向我们的feature-login分支(head永远指向当前操作的版本)。
首先在feature-login分支中创建文件branch.txt
:
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (feature-login)
$ touch branch.txt
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (feature-login)
$ echo aaa > branch.txt
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (feature-login)
$ git add .
warning: LF will be replaced by CRLF in .gitignore.
The file will have its original line endings in your working directory
warning: LF will be replaced by CRLF in branch.txt.
The file will have its original line endings in your working directory
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (feature-login)
$ git commit -m 'br-first'
[feature-login 7c9ca12] br-first
4 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 .gitignore
create mode 100644 branch.txt
create mode 100644 temp1.txt
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (feature-login)
$ git status
On branch feature-login
nothing to commit, working tree clean
在文件夹中可以看到新创建的文件。
如果要合并到主分支,首先切换回主分支:
$ git checkout master
选择分支合并:
$ git merge feature-login
当在版本3处创建了两个分支,并且这两个分支都对a.txt文件的同一处进行了修改,此时合并分支1再合并分支2会发生冲突。
由于修改的是文件同一处,因此Git无法判断到底要合并哪一个版本,Git会把两个分支的修改都添加进文件中,并且提示我们需要手动进行修改。
解决冲突(Conflict):
比如我们先创建两个分支b1、b2,b1在branch.txt中添加123,b2在branch.txt中添加456,切换到主分支依次进行合并。
合并b1:
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$ git merge b1
Updating 7c9ca12..65413f9
Fast-forward
branch.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
合并b2,提示发生冲突:
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/Git-Study (master)
$ git merge b2
Auto-merging branch.txt
CONFLICT (content): Merge conflict in branch.txt
Automatic merge failed; fix conflicts and then commit the result.
打开branch.txt,可以看到Git将冲突的内容都进行了保留,需要我们手动调整。
手动修改完成后,再进行提交:
$ git add .
$ git commit -m 'xxx'
分支已经成功合并到主分支(Master)中,或者分支已经不需要的时候,可以使用git branch -d 分支名
将其删除。
删除b1分支:
$ git branch -d b1
在一个分支上经常会有很多此提交,使用 变基(rebase) 可以将多次 提交(commit) 合并为一个,让我们的版本管理更加简洁。
合并head所指向的提交以及它的前一次提交:
$ git rebase -i head~~
简书:mwangjs——git变基
https://www.jianshu.com/p/df49b3671757
GitHub是国际上最大的代码托管平台,经常被网友戏称为”GayHub“——全球最大同性交友网站。~( ̄▽ ̄)~*
GitKraken是Git的图形管理工具,它的界面非常漂亮,文章开头已经介绍过了。
关于如何使用GitKraken来执行Git的各种操作,以及如何在GitHub上托管自己的代码,这里推荐B站 奇乐编程学院 的两个视频,讲解简单明了,同时带你快速浏览Git的使用流程。
视频主要介绍了图形化工具的使用,本文主要介绍Git命令行,图形化工具在实际使用中也十分重要,搭配食用更佳哦。
Git + GitHub 10分钟完全入门
Git + GitHub 10分钟完全入门 (进阶)
Gitee可以看作是GitHub的中文版,两者学会了其中一个,另一个自然也就会了。
Gitee是开源中国(OSChina)推出的基于Git的代码托管服务:
由项目的发起人(组长)在Gitee中创建代码仓库,一般会创建两个分支:master与develop。仓库中的master主分支一般由组长进行管理,防止其他人将错误的代码提交到master主分支,develop分支开放给其他人,允许其他人将代码提交至远程仓库,最终由组长管理其他人的提交并将develop分支合并到主分支。
其他人想要参与项目的开发,可以将远程仓库 克隆(clone) 到本地,在本地进行独立的版本管理。建议先切换到develop分支,再创建新的分支进行新功能的开发,功能开发完后合并到develop分支,确认无误后 推送(push) 至远程仓库的develop分支。
创建码云(Gitee)账号,进入Gitee主页。
点击主页右上角的加号”+“,选择新建仓库。
填写仓库的基本信息,点击创建仓库。
根据提示创建git仓库并推送到gitee。
进入仓库目录,打开gitbash,按照提示输入命令。
配置用户名和邮箱:
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/git-study (master)
$ git config --global user.name "xxx"
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/git-study (master)
$ git config --global user.email "[email protected]"
如果没有仓库根据提示创建新的仓库同时创建readme.md
描述文件,如果已经创建好了仓库直接执行下面的命令。
将我们创建的仓库添加至gitee:
push -u
表示git会记录用户名和密码,只需在创建仓库时输入一次就可以了。
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/git-study (master)
$ git remote add origin https://gitee.com/......
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/git-study (master)
$ git push -u origin "master"
弹出窗口,输入gitee用户名与密码。
注意输入的是Gitee的用户名,不是姓名~
输入完成后我们创建的本地仓库会添加到Gitee中。
Mymel@DESKTOP-4QL2F94 MINGW64 ~/Documents/git-study (master)
$ git push -u origin "master"
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (5/5), 448 bytes | 448.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.2]
To https://gitee.com/guo-hanzhe/gitee-study.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
参与其他人的开发我们可以将Gitee上的仓库克隆到本地。
$ git clone https://gitee.com/.......(仓库地址)
仓库分为公有和私有两种,私有仓库只有在Gitee中被邀请的人才能访问。
在本地开发进行新功能的开发,开发完后推送至Gitee远程仓库:
切换至develop分支,并在此基础上创建新的分支feature-new
。
$ git checkout develop
$ git branch feature-new
施工ing...
先合并到本地的develop分支。
$ git checkout develop
$ git merge feature-new
Master分支一般是不允许其他人随便推送的,我们一般是推送至develop分支。
此时已经在develop分支上,直接推送就可以。
$ git push
多人协作时的冲突
这一点类似于前文中提到的合并冲突。当在我们编写本地仓库中的代码时,如果其他人在这个时候向Gitee远程仓库进行了推送,那么我们的代码就和远程仓库中的不一致了,直接推送会提示错误,这时需要我们 拉取(pull) 远程仓库中的代码,在本地解决冲突以后再来推送。
拉取(pull) 可以看作是push的逆向过程,push是将代码推送至远程仓库,pull是将远程仓库的代码合并到本地,并且如果有冲突时需要我们手动解决。
推送前先pull一下:
$ git pull
解决冲突ing
$ git push
在Gitee中有一些仓库不希望其他人随意修改的。比如小明把仓库的所有分支权限都改为了受保护,我们没办法直接将我们的代码推送给他,这时可以在Gitee中Fork他的仓库,这会将他的远程仓库复制一份到我们的Gitee账户下。
如果团队中有很多人共同参与进项目开发,只需要组长将小明的仓库Fork到自己的账户下,小组的成员们只需要克隆组长的仓库就可以了。
如果你觉得小明会采纳你对代码的修改,你还可以向他发送一个pull request,如果小明觉得你的代码对他有帮助,他会接受pull request,并将你的修改同步到他自己的仓库。
在Gitee中还提供了Issue功能,组长可以创建一个Issue用来追踪bug,指派任务,创建完后,所有组员都会接收到一个组长发布Issue的通知。
Git关联远程仓库可以使用http协议或者ssh协议。
SSH协议:
依靠密匙,也就是你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
HTTPS协议:
相比SSH协议,可以使用用户名/密码授权是一个很大的优势,这样用户就不用在使用 Git之前先在本地生产SSH密钥对,再把公钥上传到服务器。对非资深的使用者,或者系统上缺少SSH相关程序的使用者,HTTP协议的可用性是主要的优势。与SSH协议类似,HTTP协议也非常快和高效。
Gitee提供了基于SSH协议的Git服务器,在使用SSH协议访问仓库之前,需要先配置好账号/仓库的SSH公钥。
打开Git bash,使用以下命令生成sshkey:
$ ssh-keygen -t rsa -C "邮箱地址"
依据提示敲三次回车Enter
,生成sshkey。
生成sshkey后,可以在Home目录~/.ssh/id_rsa.pub
中查看你的公钥public key。
复制id_rsa.pub
中的内容。
打开Gitee的设置页面,将公钥复制进去。
点击确定,配置好SSH以后下次再 克隆(Clone) Gitee上的仓库就不需要再输入用户名和密码了。
拉取Gitee中的项目到IDEA中:
打开IDEA,创建项目时选择Get from VCS
,在URL中输入仓库地址。
如果使用Https协议,需要输入用户名和密码:
点击左下角的git,可以打开图形化工具:
对代码进行修改后,如果需要提交或者推送等操作,可以右键我们的项目目录,在下拉菜单中选择Git,里面包含了Git的各种操作。
文件名的三种颜色:
此外IDEA中可以安装Gitee插件,实现自动登录等功能。
✨创建本地仓库的三步:
$ git init
$ git add Hello.c
$ git commit -m 'first'
✨Git的三种状态:
✨Git常用命令:
git status
git log
git reset head~
git diff
git rm
git mv 旧文件名 新文件名
echo *.tex >> .gitignore
✨版本分支管理:
git branch
git checkout
git merge
git branch -d
git rebase
✨代码托管平台Gitee、GitHub:
git clone 远程仓库地址
git push
git pull
✨Git图形化界面工具:GitKraken
、TortoiseGit
…
✨使用SSH协议可以免密登录Gitee。
✨IDEA提供了图形化界面来使用Git。