一、Git的概述
Git是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。
Git 会跟踪我们对文件所做的更改,因此我们可以记录已完成的工作,并且可以在需要时恢复到特定或以前的版本。Git 还使多人协作变得更加容易,允许将多个人的更改全部合并到一个源中。
二、Git的常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m "日志信息" 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
2.1.设置用户签名
用法
git config --global user.name 用户名
git config --global user.email 邮箱
说明:"
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心) 的账号没有任何关系。"
设置完成之后会在对应的用户下存在.gitconfig文件
2.2.初始化本地库
2.2.1.基本语法
git init
执行完成之后会出现.git文件,初始化成功
2.2.查看本地库状态
git status
2.3.添加暂存区
本地修改完的文件,需要添加到暂存区才可以提交本地仓库。
git add 文件名
或者
git add .
删除暂存区内容
git restore --staged 文件名
git rm --cached 文件名 (这是比较旧的命令)
区别:
git restore 恢复我此次的修改,我此次的修改不提交
git rm 是删除文件,就是本来仓库中已经有了这个文件,但是我把他删除
git restore --staged 文件名
: 将文件从暂存区撤出,但不会撤销文件的更改(我修改了文件,已经放到暂存区了,现在我不想将这次修改放到暂存区,可以使用 这个命令)
git restore 文件名
:将在工作区中的修改丢弃(需要被追踪,也就是也就被版本控制的文件才可以使用git restore命令
比如我已经把这个文件删掉了,那么我就可以使用这个命令放弃这个删除,但是如果我已经将删掉这个文件并且提交到暂存区之后,那么我需要先执行git restore --staged 文件名之后才可以执行这个命令)
git rm --cached命令与git rm命令都可以删除git版本库中的文件,但是两者之间有一些区别。
使用git rm -f 文件名 命令会将文件从版本库中删除,并且同时删除工作区中对应的文件。而使用git rm --cached 文件名命令会将文件从版本库中删除,但是不删除工作区中的对应文件。
1.git rm 会删除工作区中的文件;
2.git rm 会同时将删除的文件添加到暂存区;
【因此 git rm 相当于 rm + git add 两个命令】
【注意】 git rm 删除的文件必须是 没有经过修改的,也就是说必须要和当前版本库的内容一致的。
3.git commit 后,版本库中的此文件记录也会被删除。
如果git rm 文件 删除的文件和上一个版本库内容不一致,那么要执行删除,则会出现报错。
这时可以使用git rm -f 文件 进行强制删除
.git rm --cached 会删除暂存区中的文件,但是会保留工作区中的文件,并将此次删除提交到暂存区;
2.因此:文件从暂存区中删除掉,即不会被提交到版本库中,也就是说此文件被取消了版本控制。
3.注意 : --cached 参数 删除的文件必须是已经被追踪的文件,即之前被版本控制的文件
向暂存区告知本文件已经删除,但工作区却偷偷保留这个文件。于是commit后仓库就不会有这个文件,是为了用户本次不想上传某些缓存文件设立。
2.4.提交本地库
git commit -m "日志信息"
2.5.历史版本
查看提交记录
git reflog
git log
git reset --hard 版本号
穿越回对应的版本号
Git 切换版本,底层其实是移动的 HEAD 指针,具体原理如下图所示。
指针指向对应的版本。
三、GIT分支操作
3.1.什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。分支可以简单理解为副本,一个分支就是个单独的副本。(分支底层其实也是指针的引用)
3.2.分支的好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败
的分支删除重新开始即可。
3.3.分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
3.3.1.查看分支
git branch -v
3.3.2.创建分支
git branch 分支名
3.3.3.切换分支
git checkout 分支名
3.3.4.合并分支
git merge 分支名
正常合并情况(没有出现冲突)
出现冲突情况进行合并
产生冲突原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替我们决定使用哪一个。必须人为决定新代码内容。"查看状态(检测到有文件有两处修改)"
这时需要手动进行合并分支
- 打开冲突文件
修改前:
修改后
保存之后添加暂存区
git add test4.txt
提交版本库
git commit -m "日志信息" (此时不能带文件名)
master、fix-bug 其实都是指向具体版本记录的指针当前所在的分支,其实是由 HEAD决定的。所以创建分支的本质就是多创建一个指针。"
HEAD 如果指向 master,那么我们现在就在 master 分支上。"HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上。"所以切换分支的本质就是移动 HEAD 指针。
3.3.5.创建并切换分支
git checkout -b 分支名 // 新建 分支,并切换到该分支上
3.3.6.删除分支
当之前创建的分支,完成了它的使命,如 Bug 修复完,分支合并以后,这个分支就不在需要了,就可以删除它。
git branch -d 分支名 // 删除 分支
四、GIT团队协作机制
4.1.团队内协作
4.2.跨团队协作
五、GitHub操作
5.1.远程仓库操作
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
5.2.创建远程仓库
使用github或者gitee
5.2.1.创建远程仓库别名
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程地址
5.2.2.添加远程仓库
如果你已经有了一个本地仓库,然后你打算将它发布到远程,供其他人协作。那么使用:
git remote add origin your_remote_git_repo // 为本地仓库添加远程仓库
5.2.3.移除当前远程仓库
git remote rm origin //先移除之前的远程仓库
5.3.推送本地分支到远程仓库
git push 别名 分支
或
git push 远程仓库地址 分支
如果出现
fatal: refusing to merge unrelated histories
致命:拒绝合并不相关的历史记录
这是因为本地仓库与远程仓库存在不同的历史记录(不是同一个仓库)
解决方法:
在你操作命令后面加 --allow-unrelated-histories
如git pull 远程仓库地址 分支名 --allow-unrelated-histories
推送远程仓库
5.4.拉取远程库到本地库
git pull 别名 分支名
或
git pull 远程仓库地址 分支名
或
git fetch 别名 master
git fetch
和 git pull
之间的区别:
-
git fetch
是仅仅获取远程仓库的更新内容,并不会自动做合并。 -
git pull
在获取远程仓库的内容后,会自动做合并,可以看成git fetch
之后git merge
。 -
注意:建议多使用
git fetch
。
5.5.克隆远程仓库到本地
git clone 远程仓库地址(克隆公开代码不需要登录)
git clone 克隆会做三件事
- 拉去远程代码
- 初始化本地仓库
- 创建别名origin
六、SSH免密登录
在对应运用命令生成.ssh密钥目录
ssh-keygen -t rsa -C 892640297@qq.com
生成.ssh文件
在gitee或者github上将公钥输入
之后就可以使用ssh进行项目的拉取以及推送。
七、自建代码托管平台-GitLab
官网地址:https://about.gitlab.com/
安装说明:https://about.gitlab.com/installation/
八、Git可能需要用到的命令
8.1.查看仓库中的具体修改
git diff // 查看版本库中所有的改动
git diff Readme.md // 查看具体文件的改动
很经常的,我们对某个文件做了修改,但过不久就忘记了。这时候就可以通过 git diff
来查看具体的修改内容。
8.2.版本回退
有了 git reflog
来查看提交的历史记录,我们就可以通过 git reset --hard
来回退到我们需要的特定版本,然后使用当时的代码进行各种操作。
java
git reset --hard HEAD^ // 回退到上一个提交版本
git reset --hard HEAD^^ // 回退到上上一个提交版本
git reset --hard 'commit_id' // 会退到 commit_id 指定的提交版本
8.3.撤销修改
撤销修改同样包括两方面的内容,由于仓库中的文件在提交之前,可能在工作区中,尚未在版本控制范围内,也可能在暂存区中。
8.3.1.丢弃工作区中文件的修改
java
git checkout -- Readme.md // 如果 Readme.md 文件在工作区,则丢弃其修改
git checkout -- . // 丢弃当前目录下所有工作区中文件的修改
注意: git checkout --
中的 --
是必须的。
8.3.2.丢弃已经进入暂存区的修改
git reset HEAD Readme.md // 将 Readme.md 恢复到 HEAD 提交版本的状态
git reset HEAD 文件名 // 将 文件 恢复到 HEAD 提交版本的状态
8.4.建立本地分支和远程分支的关联
在本地仓库中的分支和远程仓库中的分支是对应的。一般情况下,远程仓库中的分支名称和本地仓库中的分支名称是一致的。
有的时候,我们会需要指定本地分支与远程分支的关联。
git branch --set-upstream-to=origin/远程分支名 本地分支名
在zkt-git-test上的hello.txt文件中加入zkt-git-test之后,重新拉去,显示如下
git branch --set-upstream 'local_branch' origin/remote_branch
显示不再支持
--set-upstream已经过时,需要用 新的命令 --set-upstream-to
8.5.修改本地仓库对应的远程仓库地址
当远程的仓库地址发生变化时,需要修改本地仓库对应的远程仓库的地址。主要应用在[工程迁移]过程中。
git remote set-url origin 远程仓库地址
8.6.标签管理
在项目开发过程中,当一个版本发布完成时,是需要对代码打上标签,便于后续检索。获取处于其他的原因,需要对某个提交打上特定的标签。
8.6.1.创建标签
git tag -a 标签名 -m '备注信息' 'commit_id'
-a
参数指定标签名, -m
添加备注信息, 'commit_id' 指定打标签的提交(某个版本号)。
8.6.2.查看所有标签
git tag // 查看本地仓库中的所有标签
8.6.3.查看具体标签信息
git show 标签名
8.6.4.删除本地标签
如果打的标签出错,或者不在需要某个标签,则可以删除它。
git tag -d 标签名
8.6.5.推送标签到远程仓库
打完标签以后,有需要推送到远程仓库。
//推送单个标签到远程仓库
git push origin 标签名
//一次性推送所有标签到远程仓库。
git push origin --tags
8.6.6.删除远程标签
git push origin :refs/tags/标签名
git push origin --delete 标签名
git push origin :标签名
8.7.临时保存修改
在执行很多的 Git 操作的时候,是需要保持当前操作的仓库/分支处于 clean 状态,及没有未提交的修改。如 git pull, git merge 等等,如果有未提交的修改,这些将无法操作。
但是做这些事情的时候,你可能修改了比较多的代码,却又不想丢弃它。那么,你需要把这些修改临时保存起来,这就需要用到 git stash。
8.7.1.临时保存修改
临时保存修改,这样仓库就可以回到 clean 状态。
git stash // 保存本地仓库中的临时修改。
注意:可以多次的 git stash
来保存不同的临时修改。
保存之后,仓库回到clean状态,目前在工作区、暂存区的已经没有了,被暂时保存起来了。
8.7.2.查看临时保存。
当你临时保存以后,后面还是要取回来的,那它们在哪里呢?
git stash list // 显示所有临时修改
8.7.3.恢复临时保存
当我们处理完其他操作时,想要恢复临时保存的修改。
git stash apply // 恢复所有保存的临时修改
git stash pop // 恢复最近一次保存的临时修改
8.7.4.丢弃临时保存
我们后面觉得临时保存不想要了,那可以丢弃它。
git stash clear // 丢弃所有保存的临时修改