GIT,全称是分布式版本控制系统,git通常在编程中会用到,并且git支持分布式部署,可以有效、高速的处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。
本地式 VS 集中式 VS 分布式
安装包素材:链接
也可以去官网下载你想要的版本
Git官网
点击图标进行安装
点击下一步
选择安装路径 —》点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击下一步
点击安装 —》进行安装
安装完成
Git汉化分为两部分:汉化Git Bash和汉化Git GUI。
Git Bash的汉化很简单,只需要在命令行界面点击右键-选择option-Windows-然后在里面将language设置成中文就可以了
Git GUI,想要设置成中文就显得没那么容易了。打开设置里面,全是密密麻麻的的英文,而且找了半天也没找到对应的语言设置,那么到底应该怎么设置Git GUI的中文显示呢?
其实Git GUI本身是真的没有这个语言设置选项的,所幸的是网上已有网友针对其开发出了对应的汉化包,我们只需要下载安装即可,具体可见https://github.com/stayor/git-gui-zh。
下载下来之后,将其放到安装目录下:/mingw64/share/git-gui/lib/msgs/zh_cn.msg,有可能Git的安装路径下面没有msgs这个文件夹,那么需要自己创建之后再将这个汉化包来放进去。这样就算是汉化完了。
未设置前
设置后,重新打开软件,你就会发现软件界面已经变成了熟悉的中文了。
只要学会如下Git的十个命令,在日常的开发工作中基本可以应付了。在后面的学习中进行详细了解。
从两方面来了解Git是怎么运作的,第一个我们先认识一下Git的几个重要的区域,第二个是Git具体是怎么工作的。
首先我们来回顾下,我们在1中讲过,Git是一个分布式的版本控制系统,在这个分布式的版本控制系统中,它会有一个远程的服务器Server Computer,然后会有多个分布式的客户端Computer A与Computer B等,在分布式的客户端中如何想使用远程服务器中的最新代码,它就需要从远程的仓库里去拉取最新代码。在拉取最新代码到本地仓库后,它自己就能形成一个版本控制系统。这个版本控制系统除了可以跟远程仓库进行交互以外,也可以与其他的分布式客户端共享版本信息。然后即使再跟远程仓库断开连接的情况下,它也能够正常运转,因为它自身也是一个版本控制系统。
那么我们是如何将分布式客户端里的文件推送到远程的仓库中并自动生成版本号呢?首先我们来了解下几个重要的区域
工作区是指你当前正在工作的项目目录,其中包含了项目的源代码、资源文件和其他相关文件。工作区是你进行开发、修改和测试代码的地方。
暂存区是Git版本控制系统中的一个概念,它是连接工作区和本地仓库的缓冲区域。在对工作区的修改进行提交之前,你可以使用 git add
命令将修改的文件添加到暂存区。暂存区允许你对即将提交的文件进行选择性的添加和修改,为你提供对提交更加精细的控制。
本地仓库是存储Git项目的完整历史记录和版本信息的地方。当你在项目目录使用 git init
命令时,Git会在你的项目目录中创建一个本地仓库,并开始记录项目的所有更改和提交历史。本地仓库只能被本地访问和管理,并且可以在本地进行回滚、分支管理等操作。
远程仓库是位于网络上的一个Git仓库,用于远程团队成员之间的代码共享和版本控制。一个远程仓库可以托管在代码托管服务(如GitHub、GitLab等)或者自建的私有服务器上。通过与远程仓库进行交互,你可以将本地的变更推送到远程仓库、获取最新的变更、与其他开发者协同工作等。
简而言之,工作区是你当前正在进行开发的目录,暂存区是用于临时存放即将提交的文件的缓冲区域,本地仓库是存储Git项目完整历史记录和版本信息的地方,远程仓库是位于网络上用于代码共享和协同开发的Git仓库。它们在不同的层级上承担着不同的角色和功能,协同工作来提供版本控制和团队协作的能力。
首先刚开始的情况下,你的本地电脑上面肯定是没有代码的,这时候你需要从远程服务器上去拉取代码到你本地,这时候我们可以使用Git的Clone
命令——实现在本地IDE工具中没有代码的情况下,从远程仓库中克隆一整个仓库的所有信息到你的本地仓库里面来。
如果在本地的IDE工具中已经有远程仓库中的代码,其他人又往远程仓库中推送了更新的代码,如果你要去拉取别人推送的更新代码下来,你要怎么做呢?你可以使用Fetch
命令(即Fetch命令是在本地有远程仓库里的代码情况下,再从远程仓库中拉取最新代码)。
(从远程仓库中去拉取数据到本地,第一次是Clone
,之后全部都使用Fetch
命令。)
我们刚刚说的Clone
与Fetch
命令都是远程仓库到本地仓库,但是我们实际上写代码的区间是在工作区,所以还需要将保存到本地仓库中的代码拉取到工作区,这时我们可以使用Merge
命令从本地仓库把代码拉取到本地工作区。
我们在第一次使用Clone
命令在本地没有代码的情况下,将远程仓库里的代码克隆到本地后,要想再从远程仓库获取最新代码就必须使用**Fetch
命令提取到本发仓库,再使用**Merge
命令从本地仓库拉取代码到工作区,这种操作会有一点麻烦,所以我们有一个简化的命令叫Pull
。
Pull
的功能是从远程仓库中直接Merge
代码到本地仓库,并且自动Merge
代码到工作区。所以Pull
命令是Fetch
命令与Merge
命令之和。 Pull = Fetch + Merge
如果你当前分支与远程分支之间没有冲突,git pull
将会自动执行合并操作,并将远程更新应用到你的本地分支。
如果存在冲突,git pull
将会提示你解决冲突。你需要手动解决冲突,并提交解决后的文件,然后才能完成合并操作。
需要注意的是,git pull
默认以 fast-forward(快进) 模式合并远程分支,这意味着只有当远程分支的提交历史可以直接连接到本地分支的提交历史时,才会执行快进合并。如果你希望强制执行合并操作,可以使用 git pull --no-ff
命令。
假设你自己有个多分支需要去切换,比如要修改bug,我们就创建一个新分支用于修改bug,在修改完bug后将这个分支再合并到master主分支上面来。这个时候就需要使用Checkout
命令实现分支间的切换。
Add
命令是将工作区的代码添加到暂存区。
再通过Commit
命令将保存到暂存区的代码提交到工作仓库,这样本地仓库中就保存到了提交过来的代码版本信息。
然后未来如果我们在写代码的过程中写错了,我们也可以从本地仓库中重新拉取之前写过的代码合并回去(把旧版本合回去),这样就可以使我们避免一些损失、消耗。
在提交到本地仓库的代码版本信息确认无误后,我们就可以使用Push
命令将本地仓库保存的代码推送到远程仓库中。
"commit and push"是一个按扭,在保存到工作区的代码在使用add添加到暂存区后,我们可以点击 “commit and push” 这个按扭,直接将保存在暂存区的代码推送到远程仓库
点击 + 号 —》新建仓库 —》选择对应的语言 —》点击创建
代码仓库(这个就是建成之后的效果)
用于编辑工具访问我们Git上面的项目
点击主页 —》私人令牌 —》生成新令牌 进行token令牌生成
添加描述 —》添加权限 —》点击提交 —》进行密码验证
注意: 私人令牌记得找个地方保存下来,不然每次需要使用的时候都需要重新生成。
点击复制 —》 勾选 —》然后点击确认并关闭
然后打开Idea,进入设置。右击文件 —》设置
打开版本控制 —》Git —》修改Git安装路径 —》点击测试(显示版本号就证明配置成功了) —>点击确定
打开版本控制,可以看到现在我们的列表里面还没有Gitee
打开插件搜索 Gitee —》安装 —》应用
现在可以看到我们的版本控制里面有Gitee了
打开版本控制 —》Gitee —》点击 + 号或者添加账户 —》添加Token令牌进行验证(也可以使用账号密码登录Gitee账号,第一个选项就是通过账号密码登录)
然后将我们刚才生成的Token添加进去 — 》再点击添加账号
可以看到账号已经添加成功了
然后就可以对我们Gitee上面的项目进行版本控制了
打开Gitee —》点击(克隆/下载)
然后点击HTTPS —》进行代码地址复制
点击文件 —》新建 —》来自版本控制的项目 —》进行Gitee上面的项目导入
将复制的代码地址放入到URL框中 —》 点击克隆 —》进行代码克隆
第一次是clone我们的远程仓库中的代码,什么都没有,然后我们就可以进行框架的搭建,进行项目的编写了
输入文件名称 —》编写文件内容 —》输入提交信息 —》 点击提交
这种操作不是很方便,需要提取再进行合并(这个操作是用于将代码仓库中最新的代码合并到工作区)
在Git中,git fetch
是用于从远程仓库获取最新的提交和分支信息的命令。它不会自动合并或修改你的本地分支,而仅仅将最新的远程变更下载到本地。
在Git中,git merge
是将一个分支的变更合并到另一个分支的操作。
可以看到我们的工作区已经将最新变更给合并了
1. 第一步
查看目前代码的修改状态 (git status)
2. 第二步
暂存需要提交的文件(git add “文件名”)
3. 第三步
提交已暂存的文件(git commit -m “提交日志内容”) 注意:这个内容必须填写,不然提交不了
先将更新的文件添加到暂存区 —》然后提交到本地仓库
点击要提交的最新文件 —》提交的消息 —》提交
提交成功,没报错就是成功了
4. 第四步
git pull
在提交项目之前必须先对项目进行更新,此项特别重要,如果不进行更新,别人有项目提交到服务器上,那么你的项目将会提交不上去,使用git解决冲突会比较麻烦,即使你解决了冲突,但是有时候不注意会冲掉别人写的代码,不像svn
使用那么简单,所以推送自己项目前必须进行更新(特别重要);
如图1:选择Pull
进行更新代码操作;
拉取成功,没报错就是成功了
1. 第一步
git push -u origin master
在拉取项目的时候我们已经将最新的代码拉取到本地仓库了,可以直接进行推送了。
选择要推送的分支 —》点击推送
推送成功
至此本地库的代码就成功的提交到远程库,可以在远程库查看更新的代码。
冲突是指当你在提交或者更新代码时被合并的文件与当前文件不一致。
更新代码
提交代码
多个分支代码合并到一个分支时
多个分支向同一个远端分支推送代码时
git的合并中产生冲突的具体情况:
<1>两个开发者(分支中)修改了同一个文件(不管什么地方)
<2>两个开发者(分支中)修改了同一个文件的名称
注意:两个分支中分别修改了不同文件中的部分,不会产生冲突,可以直接将两部分合并。
总结:上面各种情况的本质都是,当前文件与合并文件不一致,因此不论哪种情况其解决冲突的方法是一样的。
双击Hello文件 —》进入文件内部
点击编辑 —》模拟代码冲突场景
新增两行代码用于模拟冲突问题
提交信息
选择分支 —》点击提交
可以看到是刚刚提交的
git add
—》git commit '提交的信息'
提交到本地仓库成功
先将.idea和out文件删除,因为我们并没有将它们进行版本控制,它只是我们本地的配置,有可能会报拉取上面的错误,如下所示
选择分支 —》拉取
进行合并,有三种情况:
一般都是通过跟团队另一个更改本文件的小伙伴一起沟通进行手动合并,以免误删别人代码。
一般解决冲突我们都是选择merge
4. 关于冲突的个人心得
多人协作开发的时候,如果出现了你没有改过的文件跟你冲突了,一定要去找到当事者,说清楚是如何冲突的;
然后协商解决,千万不要擅自拉别的分支去试图解决冲突,或找文件覆盖,更或者以自己的文件为准.
同时记住,解决了之后,要add
和 commit
最后push
.为保证万无一失,最后在冲突都解决之后,重启项目;
保证至少不会有立即奔溃的现象发生.然后才去提交,push
.
提交的时候,一定要保持清醒,先搞清楚自己要提交的文件之间的关系,然后再提交,这样才不会有文件缺失的问题,造成奔溃.
如果任务比较多,又开了多个分支,分别进行开发,再次强调,一定要清楚自己在各个分支上做了什么,自己要提交的是什么.最好是能做个详细的笔记,没有把握宁愿不要去提交到生产服务器.
提交代码的时候不要走神,因为这是一个神圣的时刻!
至此我们的Git的使用就完成
git init
git clone <repository-url> <自定义名称>
可以看到是需要凭证认证的,这是我们自己设置的,只有通过凭证认证才可以进行后续的操作
进行认证之后才能对远程仓库进行操作
可以看到文件夹下面多了一个文件夹(Git_Test)这个就是我们刚才创建的,点进去查看就是我们Git仓库上面的代码,接下来我们就可以对他进行版本控制了。
在 Git_Test 文件夹中重新打开Git工具(根据自己的文件夹路径显示进行对应操作)
输入 vim Hello.java
对 Hello.java这个类进行编辑,按i、o
可以进行编辑
按退出键(Esc)后 输入 :wq(保存并退出)
将文件添加到暂存区
git add .
主要用于添加当前目录下的修改和新添加的文件到暂存区,而不包括删除的文件。
git add --all
或 git add -A
则会添加当前目录及其子目录下的所有修改、新增和删除的文件到暂存区。使用哪种命令取决于你想要达到的效果和需要添加到暂存区的文件类型。
参数可以是单个文件的路径,也可以是使用通配符指定的多个文件,多个文件使用空格隔开
将代码添加到Git仓库的暂存区: git add <file>
添加所有文件: git add . (add后面有个点) 或 git add -A 或 git add --all
vim Test.txt
对 Test.txt这个文件进行编辑 ,按i、o
可以进行编辑按退出键(Esc)后 输入 :wq(保存并退出)
git status
查看提交状态Changes to be committed: 表示在工作区和暂存区都存在的file
Untracked files: 表示在工作区才有的文件,没有添加到暂存区
语法: git commit [-m <message>] [--amend] [--no-edit] [--allow-empty]
-m
:指定提交的消息。消息应该是有意义的、明确描述本次提交所做更改的简短文本。例如:git commit -m "Fix a bug"
。--amend
:用于修正最后一次提交。通过该选项可以修改上一次提交的消息或者添加/移除文件到上一次提交中,不会生成新的commit-id,通常用于上一次提交版本进行修改,进行合并。--no-edit
:用于在修改最后一次提交时,保持原提交的消息不变而不打开文本编辑器。--allow-empty
:允许创建一个空的提交,即没有实际更改内容的提交。这在某些情况下可能会有用。-am
: 提交跟踪过的文件,相当于直接跳过add环节,-am = add + commit
注意:这个内容必须填写,不然提交不了,在执行 git commit
前,需要确保已使用 git add
命令将要提交的文件添加到暂存区中。否则,git commit
将无法成功进行提交。
进行代码提交到本地仓库
可以看到生成了 commit-id 证明提交成功了
由于我们克隆下来的是最新的版本,这里我们就不需要拉取了,不过还是演示一下吧
注意:每次进行代码推送的时候我们都要拉取最新的代码进行推送,不然版本不一致会出现很多问题
远程仓库代码拉取命令: git pull
输入 git pull
进行最新版本代码拉取
显示 Already up to date. 证明我们的版本是最新的
git push -u origin master
推送成功
创建分支命令: git branch <branch-name>
刚开始新建的分支内容与主分支是一致的
查看本地分支命令: git branch
查看远程分支命令: git branch -r
在Idea右下角,你可以看到你当前所在的分支,带着符号的就是主分支
签出分支命令: git checkout <branch_name>
推送分支到远程仓库命令: git push origin <branch_name>
选择项目Push:
推送完成后,可在远程库查看到刚推送的分支:
合并分支命令: git merge <branch-name>
先分别往两个分支里面添加一些内容,使它们的内容不同,然后更新到仓库,就可以进行分支合并了,提交到仓库我之前已经讲过了,这里就不做赘述了。
注意:如果要分支合并的话,先把分支切换到主分支上进行合并
主分支代码:
测试分支代码:
代码编写完记得提交到本地仓库,然后签出到主分支进行代码合并
点击智能合并
选择手动合并,这时候应该是你和你的小伙伴用到了同一块代码了,记得和小伙伴商量如何修改,修改之前一定要记得备份。
进行手动合并
最终结果
删除分支命令: git branch -d <branch-name>
强制删除分支命令: git branch -D <branch-name>
删除远程仓库分支命令: git push origin --delete <branch-name>
查看分支
重命名分支: git branch -m <old-branch-name> <new-branch-name>
查看分支合并状态: git branch --merged
查看已经合并到当前分支的分支: git branch --no-merged
切换分支: git checkout <branch-name> 或 Git 版本(2.23+): git switch <branch-name>
创建并切换到新分支: git checkout -b <new-branch-name> 或 Git 版本(2.23+): git switch -c <new-branch-name>
配置相关命令
git config --global user.name ""
:设置全局用户名,这个就是代码提交的用户名。git config --global user.email ""
:设置全局用户邮箱。git config --global core.editor ""
:设置全局文本编辑器,用于撰写提交说明。git config --global color.ui true
:启用全局彩色输出,使 Git 命令输出更具可读性。git config --global alias.
:设置自定义的 Git 别名,用于简化命令的使用。git config --global alias.s status
会将 git status
命令简化为 git s
。你可以使用 git config --global --list
命令来查看当前的全局配置信息。
更多命令
git init
:在当前目录初始化一个新的Git仓库。git clone
:克隆(下载)远程仓库到本地。git add
:将文件添加到暂存区,准备提交。git commit -m ""
:将暂存区中的改动提交到本地仓库,可以附带一条注释。git status
:查看当前仓库的状态,包括被修改但未提交的文件、新文件等。git log
:查看提交历史记录。git branch
:列出当前仓库的分支列表。git checkout
:切换到指定的分支。git merge
:将指定分支的改动合并到当前分支。git pull
:从远程仓库拉取最新的代码更新到本地分支。git push
:将本地分支的修改推送到远程仓库。git remote add
:将远程仓库添加到本地,并赋予一个名称。git remote -v
:查看当前仓库关联的远程仓库信息。git diff
:查看当前工作区与暂存区的差异。git diff --cached
:查看暂存区与最近一次提交的差异。git diff
:比较两个提交之间的差异。git reset
:将文件从暂存区移出,取消暂存。git reset
:将当前分支的HEAD指针移动到指定的提交。git revert
:撤销指定的提交,生成一个新的提交来反转变更。git stash
:将当前的工作区变更暂存起来,切换到干净的工作区。git stash pop
:恢复最近一次stash的变更并将其从stash堆栈中移除。git tag
:创建一个标签,用于标记重要的提交。git remote remove
:移除已关联的远程仓库。git rebase
:将当前分支的提交基点移动到指定分支的末端。git remote show
:显示指定远程仓库的详细信息,包括分支跟踪等。git fetch
:从远程仓库下载最新的代码更新,但不会自动合并到当前分支。git cherry-pick
:选择指定的提交,并将其应用到当前分支。git revert --no-commit
:撤销指定的提交,并保留撤销操作的改动,但不生成新的提交。git rebase -i
:以交互式模式重新设置基点,允许合并、修改或删除提交。git clean -n
:显示将要被删除的未被跟踪的文件,但不会真正删除它们。git bisect
:用于二分查找来定位导致问题的代码提交。git blame
:逐行显示指定文件的每一行是谁做的修改,并显示相应的提交信息。git log --graph
:以图形化方式展示提交历史。git submodule
:用于管理和操作Git仓库中的子模块。查看更多命令
git help
: 通过在命令行中输入git help
,可以获取关于Git命令的详细说明和用法。