Git 是一个 免费、开源的分布式版本控制系统,可以快速处理从小到大的项目。 ,跟分布式对应的还有一个 集中式版本控制系统 。
版本控制是能够记录文件内容变化,以便查询特定版本修改情况的系统。
最重要的是它能记录文件修改历史纪录,使得用户能看到版本变化,而且还能做到版本切换。就是把过去记录到的版本切换回去。
Git 有三个分区:
代码托管中心是基于网络服务器的远程代码库,一般称为远程库。
首先来到官网:https://git-scm.com/
进入GitBash 输入 git --version
就会出现当前你安装的 Git 的版本信息。嫌字体小可以 CTRL滚轮拉大
命令名称 | 作用 |
---|---|
git config --global user.name 自定义的用户名 | 设置用户签名 |
git config --global user.email 自定义用户邮箱 | 设置用户邮箱 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 将文件添加到暂存区 |
git commit -m 日志信息文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
命令能通过 双击Tab 键补全
cat ~/.gitconfig
可以查看已经存在的Git配置,这个文件就在当前系统用户目录下的 .gitconfig 文件里记录着设置用户名和邮箱只是为了确定当前操作者的身份,在每一个提交版本中都可以看见这个身份信息,确认提交是谁做的,git 不会去验证是否存在这个邮箱,如果不设置就在后面无法提交代码。这里设置的用户名邮箱跟github上登陆的没一点关系。
先创建一个空目录【要提前规划好目录】,然后新打开一个 GitBash 窗口,这样git就创建在那个目录里面了。
输入 git init ,就会提示你当前已经在这个目录下创建了一个空的仓库 当前目录下的 .git 目录,但是这个目录默认隐藏看不见,可以这么做
或者在 GitBash 窗口中使用 linux 命令 ll -a
查看当前目录下所有文件,就能看见 .git 文件夹,也可以 cd /.git
进入目录, 然后 ll
查看目录内的文件。但是看就行了别它。而且也能发现Linux 中的命令都能在git里面用,他俩都是一个爹做的
git status
后,会返回一些信息,第一次空的目录里面,有三行内容,第一行是说当前在哪个分支里面,第二行说有没有提交记录,第三行是说目录里面有没有产生文件记录,空的就是没有vim hello.txt
,然后在里面写点东西多复制【退出编辑并yy
复制 p粘贴】几行。:wq
退出git status
就会发现他最后一行就提示你出现了未追踪的文件后面是刚才创建的那个文件名不过冒红【当前文件在工作区】,这个时候他就提示你通过 git add
命令提交文件至暂存区git add hello.txt
把文件添加到暂存区后,会提示你说【这里是一个警告,狗屁用没有】会用 LF 替换 CRLF 【在安装的时候软件问过】,还会提示你这个文件已经存在工作目录了,再输入 git status
就会出现一个提示说已经在监控这个文件了,而且在 暂存区的文件可以被删除,所以他就提示你用 git rm --cached 文件名
能把这个文件删除了。当然只是在暂存区删除,工作区的文件还存在。git rm --cached hello.txt
再 git status
再 git add hello.txt
多体验一下变化首先 git conmmit -m "first commit" hello.txt
提交本地库。就会返回一些日志报文
通知你一下 CRLF 被替换成 LF 了
warning: LF will be replaced by CRLF in test.txt.
这个文件在你的工作目录存在了
The file will have its original line endings in your working directory
主分支提交了一个文件,7位字符编码就是提交文件的版本号,后面跟著提交时写的日志信息
[master (root-commit) 0b1dd9b] first submit
一个文件变化,十行记录插入
1 file changed, 10 insertions(+)
创建了一个多少字节的文件
create mode 100644 test.txt
然后再输入 git status
就会看见一直提示你的没有提交的信息消失了代替的是
nothing to commit, working tree clean
说你的工作树是干净的,没东西需要提交了可以通过 git reflog
查看引用日志信息
0b1dd9b (HEAD -> master) HEAD@{0}: commit (initial): first submit
这就是之前提交的那个记录的版本号,指针指向 master 分支,最后那个就是第一次提交的版本信息
也可以通过 git log
查看详细日志信息
提交的内容的完整版本号,前面那个只是截取了前七位
commit 0b1dd9b55219863527d66218e7066d94f059a020 (HEAD -> master)
之前起的用户名和邮箱,还有就是时间日期、提交时的日志信息
Author: xyk
Date: Wed Mar 9 10:04:07 2022 +0800
first submit
先对 hello.txt 文件进行编辑修改 vim hello.txt
随便做点修改
再输入 git status
查看本地仓库状态就会出现一个冒红,说是出现了不受控制的修改,是因为只是在工作区修改了,没有提交到暂存区。你可以通过提交命令或者回撤命令 git restore
放弃修改
git add
提交一下,然后再查看状态 git status
,会提示你有提交变换,可以通过撤回命令 git restore
放弃提交的修改
git commit -m "日志信息" 文件名
提交至本地仓库,
warning: LF will be replaced by CRLF in test.txt.
The file will have its original line endings in your working directory
生成了另一个文件版本号和日志信息
[master 7d03c47] second commit
git无法表达修改,所以他会把被修改的那一行删除,把修改的那一行插入。就有一行插入,一行删除的记录
1 file changed, 1 insertion(+), 1 deletion(-)
git reflog
查看版本
可以看见指针指向当前版本,第二次提交
7d03c47 (HEAD -> master) HEAD@{0}: commit: second commit
0b1dd9b HEAD@{1}: commit (initial): first submit
git 版本管理是通过 指针 管理,不通过文件副本的方式,所以工作目录中只有一个文件。
版本穿梭
git reflog
查出文件历史修改信息
使用 git reset --hard 版本号
将版本切换成你想切换回去的版本
git reflog
再次查看历史修改信息
$ git reflog
先是指针指向 7d03c47 这个版本号的修改
7d03c47 (HEAD -> master) HEAD@{0}: commit: second commit
0b1dd9b HEAD@{1}: commit (initial): first submit
xyk@xyk MINGW64 /d/git/Git-Space/git-demo (master)
$ git reset --hard 0b1dd9b
修改后告诉你 版本号已经指向了 0b1dd9b
HEAD is now at 0b1dd9b first submit
xyk@xyk MINGW64 /d/git/Git-Space/git-demo (master)
$ git reflog
再次查看就能看见指针已经指向了 0b1dd9b 版本,git还会提示你 指针移动至 0b1dd9b 版本
0b1dd9b (HEAD -> master) HEAD@{0}: reset: moving to 0b1dd9b
7d03c47 HEAD@{1}: commit: second commit
0b1dd9b (HEAD -> master) HEAD@{2}: commit (initial): first submit
进入 .git 目录,HEAD 文件就是记录着当前工作在哪一个分支
0b1dd9b55219863527d66218e7066d94f059a020
,前七位就是刚才切换的版本号同时外面的文件 hello.txt 也会回到之前未修改的内容
Git的版本穿梭其实就是控制指针HEAD,选定分支,再控制指向版本号。只是分支指向版本的指针变化,指向那个那个版本就变
分支就是,在版本控制过程中,同时推进多个任务,为每个任务就能创建任务的单独分支。使用分支就意味着把自己的开发工作从主线中分离出来,不会影响主线的功能,在有需要的时候将分支的代码提交给主线进行主线程序的版本迭代。分支可以理解为程序的副本,你只是在操作副本进行功能添加修改等操作。实际上也是通过指针实现的。
命令 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
首先 git branch hot-fix
创建一个热修复分支,会没有什么提示
git branch -v
查看所有分支,就会看见两个分支
git checkout hot-fix
切换到 hot-fix 分支上
在热修复分支上修改 hello.txt 文件,并查看 git status
当前分支是 hot-fix
On branch hot-fix
发现了不受监控的修改
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)
modified: test.txt
git add hello.txt
添加到当前分支的暂存区
git commit hello.txt -m "hot-fix first commit" hello.txt
提交到 hot-fix 分支仓库,会生成一个版本号,再 git status
分支名、版本号、提交时的版本信息
[hot-fix d518204] hot-fix first commit
我做了两行修改,就有两行插入、两行删除
1 file changed, 2 insertions(+), 2 deletions(-)
再去文件夹中看 hello.txt 内容变了,HEAD 文件内容也变了,refs->heders 里面多了一个文件hot-fix,文件内容是修改后的文件的版本号
在 hot-fix 分支上 cat hello.txt
,再切换到master分支上
在master分支上 cat hello.txt
是不一样的。一个是已经修改提交过的版本,一个是之前的那个版本
这个命令使用时,是把命令里面的分支内文件修改内容合并到当前所在的分支的文件中,分支不会消失
切换回master分支
使用命令 git merge 分支名
把hot-fix分支合并到master分支上
正在用hot-fix的文件提交结果代替主分支上的文件提交结果,后面代替前面
Updating 0b1dd9b..d518204
修改的文件名,修改的总记录数,两行删除两行插入
Fast-forward
test.txt | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
cat hello.txt
就会发现内容变成了在 hot-fix 分支上修改提交的结果
这是正常合并
产生分支的原因:存在两个分支对于同一个文件做了两个不同的修改方案,工具无法替我们决定使用哪一种修改的时候就由人为确定使用哪一个版本的修改。
首先在主分支上修改 hello.txt 文件,然后 git add hello.txt
、git commit -m "master commit" hello.txt
后
切换分支 git checkout hot-fix
,再同样对 hello.txt 文件修改,之后,再 git add hello.txt
、git commit -m "hot-fix commit" hello.txt
后
切换到 master 分支 git checkout master
,进行分支合并 git merge hotfix
就会出现错误
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
说是合并内容冲突,不能合并
而且工作空间后面会出现 (master|MERGING)
分支名和正在合并,表示分支合并还没做好。
而且 git status
会发现
说你有未融合的分支
You have unmerged paths.
在提交时出现问题
(fix conflicts and run "git commit")
使用 git merge --abort 命令停下合并
(use "git merge --abort" to abort the merge)
未合并的分支的原因是因为 都修改了 test.txt
Unmerged paths:
(use "git add ..." to mark resolution)
both modified: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
这时 cat hello.txt
会发现
<<<<<<< HEAD
hello
hello heihei
=======
hello haha
hello
>>>>>>> hot-fix
<<<<到=====里面的是当前分支做的修改提交,=====到>>>里面是hot-fix分支做的提交
那么就能 直接手动修改文件内容,自己决定要留那一部分,vim hello.txt
,把多余的符号删了,就像修改文本一样,留下想要的修改,然后 Esc -> :wq
然后 git add hello.txt
、git commit "merge commit" hello.txt
.完成手动合并提交
其实就是git把你两次的修改给你放那里,你愿意怎么改就改不改也行,也能提交,改了就算是合并了,手动提交,也是提交
但是呢,他会报错说是 fatal: cannot do a partial commit during a merge.
不能在合并期间提交,所以需要需改一下提交的命令 git coomit -m "merge commit"
后面不跟文件名,就能成
然后就合并好了
Git是一个分布式的版本控制系统
其实版本控制都是在本地做,功能开发也是在本地
在使用版本控制系统控制实际程序工作时,这个实际项目不仅有实现功能的文件,还有一些多余的编辑开发软件的标识后缀【比如是xxx.iml】文件,而又不想-管这种文件,就能通过这个文件的内容设置忽略管理项目文件中指定后缀的文件,不管这些 ,忽略掉的好处就是能够屏蔽掉IDE开发工具的差异化。
首先需要在[原则上说是在那里创建都行]用户->用户名,目录下面创建一个名字叫 xxxxx.ignore【建议名字记就叫 git.ignore】
文件内容
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see
http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
接下来在 .gitconfig
文件中添加如下配置
[core]
excludesfile = C:xxx/git.ignore 文件的路径
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
做完了上面的步骤后,打开 IDEA ,来到 settings -> version control -> Git,配置 Path to Git
,找到git安装目录下的 bin->里面的 git.exe,选中然后一路确定
配置好了上面的,右键随便一个文件,但是看不见 git 有关的选项。
VCS->create git repository
,默认选定的是当前项目目录。git add
,添加到暂存区git status
,查看当前路径下文件状态,提交暂存区文件名就会变绿在对 IDEA 文件做了修改后,文件名会变成蓝色,这代表当前文件曾经被git追踪过版本。对这样的文件可以直接提交版本,也可以先提交暂存区,再说要不要提交的事情,毕竟,提交后版本就不能删除了。暂存区的还能后悔拿后面的覆盖掉
先对随便一个 文件做一点修改,提交一次,在修改,在提交一次。多来几次好看效果
然后想要把进行版本穿梭就直接看底下那一栏,有一个 Git 选项【也可能是version control,IDEA版本不一样】 ,然后点这个选 Log 选项
想要切换版本,就把想切换的版本右键 checkout 版本号【可能会有两个选项】,然后就能看见代码变成提交这个版本的内容了,而且指针指向了这个版本
merge into current
合并。git 官方的代码托管中心
远程仓库操作
命令名 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程仓库http地址 | 给远程仓库起别名 |
git push 别名【或者http地址】 分支 | 把本地分支的内容推送给远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库别名 远程分支别名 | 将远程库对于分支的最新内容拉下来直接合并 |
打开本地git
git remote -v
查看所有远程地址,结果是没有git remote add 别名 远程地址
把刚才创建的远程仓库地址添加进来git remote -v
所有远程地址,结果有两条,说这个远程仓库能push用也能pull和clone用git pull 别名或http地址 本地分支名
推送本地内容到github仓库中,这个过程受网络影响,多试几次
之后就会弹出一个窗口问你要登陆github,直接用浏览器打开
就会出现页面让你授权git凭证,点击 Authorize ,出现 Authorize successed就是成功授权了
然后这个页面就能关了,等待分支文件上传完成后,刷新页面,就能在远程仓库看见上传的项目了
Enumerating objects: 15, done.
Counting objects: 100% (15/15), done.
Delta compression using up to 8 threads
Compressing objects: 100% (10/10), done.
Writing objects: 100% (15/15), 1.08 KiB | 91.00 KiB/s, done.
Total 15 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), done.
To https://github.com/StringNameQinDie/git-demo.git
* [new branch] master -> master
先打开远程仓库
在本地git上 git pull git-demo1[别名] master[分支名]
进行拉取
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), 660 bytes | 60.00 KiB/s, done.
From https://github.com/StringNameQinDie/git-demo
* branch master -> FETCH_HEAD
d5d03e0..063b007 master -> git-demo1/master
Updating d5d03e0..063b007
Fast-forward
test.txt | 1 +
1 file changed, 1 insertion(+)
报文记录了文件修改数、修改记录
可以查看一下本地库状态,发现是干净的,说明拉取会直接自动帮你提交至本地库,查看文件是否被修改,那么文件已经修改了。要随时使本地库跟远程仓库的版本一样
第三方想要对远程仓库的内容进行 clone ,创建一个空目录模拟
在空目录里面 打开一个 GitBash ,
git clone 远程仓库HTTP链接
,直接就拉取好了git remote -v
会发现别名也被自定义好了说明在进行克隆代码时不需要登陆,而且会自动初始化仓库,创建远程仓库的同样的目录结构,创建了.git文件夹,会自动创建别名
$ git clone https://github.com/StringNameQinDie/git-demo.git
Cloning into 'git-demo'...
remote: Enumerating objects: 18, done.
remote: Counting objects: 100% (18/18), done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 18 (delta 4), reused 14 (delta 3), pack-reused 0
Receiving objects: 100% (18/18), done.
Resolving deltas: 100% (4/4), done.
克隆的时候老实的右键粘贴,否则就会说 https 协议不支持咋的,不支持就重新输入命令复制粘贴
如果团队内的成员需要push分支去远程仓库,则需要这么操作【用两个账号模拟的】
git push 远程仓库地址 分支名
将修改后的内容推送至团队仓库如果团队内部不能开发出来功能或者想向开源仓库提供帮助或者创意,就算是跨团队协作了,第三方既不是队友,也不是自己。怎么推送代码给你。
仓库主人的昵称/仓库名
就能精准找到仓库,因为昵称是唯一的来到远程仓库界面,code 按钮的SSH 选项有警告不能用,说你的账号里面没有任何widows的SSH密钥,需要添加到帐号里。
首先,来到电脑的 用户->用户名 下的目录,在那里GitBash
然后 ssh-keygen -t rsa -C 描述内容
,在这个目录下生成 .ssh 密钥目录,命令中 ssh-keygen 是生成ssh目录的命令,-t 是指使用哪种算法,rsa 是一种加密算法协议 ,-C 是一种描述符,后面跟的一般是用户名。
输入命令后,按三下回车,就加密好了。
查看当前目录,就能看见 .ssh 目录
cd .ssh 进入目录,查看里面的内容,id_rsa 文件保存着私钥,id_rsa.pub 是公钥
在命令行中进入 .ssh 目录,cat id_rsa.pub 查看公钥内容,并复制
然后来到github头像->settings->SSH and GPG keys 里面,创建一个新的SSH公钥
起一个名称,然后把复制的公钥内容粘贴到下面的框子里。
确定后,出现
就是成了
最后在本地仓库做一些修改提交后,通过仓库的 SSH 地址进行pull和push操作,测试是否成功
pull 的时候问你要不要保存这个SSH连接,输入yes
如果中间出现了迷惑性问题就把命令再重新打一遍执行
settings -> version control -> github【新版本默认安装了这个插件,没有的话就去plugins里面下载一个重启IDEA】
里面,然后点击加号
logi n via GitHub
就会跳转网页认证,直接能认证绑定好。老版没有页面认定,光靠网络质量,可能一万次才能登上去log in with token
,会出现一个叫你填写token的,然后来到GitHub,登录号账号,来到 https://github.com/settings/tokens
里面,生成一个token,
GitHub -> share project on GitHub
点击后,先问你是不是要提交到刚才绑定的账号中在绑定好GitHub账号后,先对程序内容做一点修改,然后提交本地仓库,可以进行push操作,push 工程去远程仓库可以
右键项目 -> Git -> push
但是在push项目时,默认是使用的https协议,比较慢,既然开通了 SSH免密登录 协议,就能先去 仓库路径下复制SSH路径,在push界面点击push的 define remote
,定义一个新的路径,自己随便取一个名字,然后把复制来的路径粘过去,选定自己创建的ssh方式的push方式,然后push。IDEA出现everythingupdate就是好了,可以去GitHub刷新查看
【中间出了一个小问题,就是忘了这个账号没有ssh密钥,第一次失败了。然后就先去 user->用户名->.ssh
目录下gitbash【ssh-keygen -t rsa -C 描述内容
,问你要不要重写,输入y,然后cat那个ras.pub,复制】创建一个ssh密钥,然后再去账号里面new一个sshkey,把密钥内容复制过来。然后再去IDEA里面新创建一个push用的ssh链接,拿这个就能成功。如果要管理之前的没用的链接,去idea最上面的Git->manage remotes 里面就能看见之前创建的全部连接,没用的删了】
警告:一般情况下,要保证本地版本比远程仓库版本高,如果不能保证就先pull远程仓库的版本,在升级后再push到远程仓库,否则push操作会被拒绝。就是说push版本要比远程仓库高,如果不确定就先pull
还有就是pull的时候别改动本地代码还提交了,那样就会面临代码合并问题,要自己手动合并。不修改是IDEA帮你自动合并
pull操作就是自己去GitHub里面在线编辑一个随便多一点什么出来,保存一下。然后IDEApull【要么就是右键git->pull,要么就顶部导航git->pull】,pull的时候默认选的是从刚才的ssh路径的master分支,如果不是自己改一下。pull好了后就能看见文件内容变了,日志也输出了。
如果现在是别的电脑,或者自己电脑把这个项目文件夹删掉。打开IDEA默认会打开上次打开的文件,因为删了就打不开了,会出现一个让你选一个的界面,有一个按钮 Get from VCS
,点这个,再点 GitHub ,里面就有你绑定账号的仓库,你选你想clone的那个项目,底下会自己给你生成项目在磁盘路径,然后clone,就又能把项目clone到电脑上了。【或者你随便打开一个项目,再点右键或者最上面的导航栏Git->clone,选你想clone的仓库,一样的】,可能会因为网不行,出点问题,多来几次。我来了4次
来到想删除的仓库,点击settings,往下翻,一直到最下面就有一个deletexxxx 的选项,你点他就叫你输入仓库路径确认你输入后,确定就能删除了
gitee是一个基于 Git 的开源分布式版本控制平台,他的服务器在国内,速度快,用的方法跟GitHub差不多,而且还是中文的
官网地址:https://gitee,com
首先注册一个gitee账号,建议用邮箱,爱绑定手机号就绑定,也能不用绑定
创建好账号后,登陆进去会来到个人页面
GitHub 可以在IDEA中操作是通过插件,那么gitee也有对应的插件
如果你懒得建gitee仓库,可以直接通过IDEA gitee 插件做到往GitHub分享项目一样的事
share project on gitee
如果你想先在gitee里面创建一个仓库,后把你的项目push到这个仓库中
Git->push
或者 右上角箭头 push,或者CTRL+shift+kdefined remote
设置提交路径为你新创建的那个仓库的 https 地址【https也快,要用ssh自己去设置ssh密钥】,然后push在仓库里面把项目在线编辑一下,gitee在线编辑的时候会自动补上提交日志,你不满意能删了自己写,然后保存
git->pull
注意:gitee push的时候,一样要本地版本比远程仓库版本要高,不然就会被拒绝push,工作的时候不能确定版本时先拉取远程仓库的,再在本地修改、提交本地仓库、push远程仓库。
而且pull的时候本地代码尽量别动,否还会面临合并失败手动合并的问题,一般是IDEA自动合并,都改了IDEA就不知道选哪个修改的,抛弃那个
这个速度很快
如果有GitHub的仓库需要使用但是操作又不方便,gitee就能直接把GitHub的整个仓库搬过来