git的作用
1.代码备份
2.老旧版本回溯
3.多人协同开发
4.问题代码追责
版本控制工具:
每次的修改都认为是一个版本,就很明确,每次的修改都是谁写的,都加上一个版本号
git共享版本库
对于同一个项目,任何一个电脑上都有完整的版本库,不是放在同一个地方
git工作流程
配置用户信息的作用
因为每次提交都要确定是哪个人提交的,所以需要配置git的基本用户信息
这个可以随便配,不存在的邮箱也行
获得本地仓库
明确一个事情:一个远程仓库和一个本地仓库
先明确本地仓库这个概念
工作
git的工作目录:当前目录下,除了.git以外,都属于工作目录
1.当新创建一个文件的时候,这时和git没有任何关系,属于未跟踪状态
2.git add可以把文件从工作区转到暂存区,这是和本地仓库之间的一个缓存区
3.如果想要真正的实现版本控制,需要提交到本地仓库git commit
进入到了仓库,就变成了 一次提交记录
仓库里面有一个详细记录,记录了到底提交过几次
第一次提交是一个版本,第二次提交也是一个版本,第三次提交也是一个版本
git status命令
查看工作区和缓存区的所有文件,哪些文件第一次提交,哪些文件进行了修改,哪些文件在暂存区中,可以使用git status命令
git add . 和git commit -m "注释内容"
注意:在使用git commit命令时,最好加上本次提交的注释,以便查看日志,显示这个注释
git log
如果 将工作目录 回退到之前提交过的版本?git reset --hard 版本id
git reflog查看所有的版本id(包括git log看不到的)
如果我们希望在工作目录中,有些文件不被纳入git的管理,可以在“工作目录”下创建.gitignorewen文件(文件名称固定),列出要忽略的文件名(可以使用通配符)
分支(重点切换分支和合并分支)
git branch 查看分支
git branch 分支名 创建分支
git checkout 分支名 切换分支
1.什么是分支?
在多人协作的过程中,需要每个人有一个分支,相当于不同的业务线,每个人互不影响,你改你的,我改我的
2.head的作用是什么?
head指向谁,谁就是当前的分支
把代码放到一块,叫合并merge
(当前分支为master)git merge 分支名(例如分支名叫branch1)
是把branch1上的代码合并到当前分支master上(不要搞反了)
我修改一个文件,不能是修改所有分支,所以
工作区只能为唯一的一个分支服务,就是我当前处于哪个分支上,修改的就是哪个分支上的文件
删除分支
git branch -d 分支名
创建分支,是把当前分支的内容拷贝到另一个分支吗?不是,是通过引用的方式
解决冲突(面试内容)
当两个分支,修改了同一个文件的同一行代码,怎么办?(前提两个分支的这行代码的修改都已经commit提交给git管理了)
当合并分支的时候应该用你的代码还是我的代码?git不能决定
实际开发中的分支使用
把本地代码推到远程仓库
1.gitee等平台新建一个仓库(注意:不要添加readme文件初始化这个远程仓库,后续可能会麻烦)
创建私有的还是公开的,这个不重要,表示谁能看到远程仓库里面的代码
2.是每个人都能上传本地仓库的代码到这个远程仓库吗?不是的
如何给gitee证明你是这个远程仓库的主人
有几种方案?
(1)让你输入用户名和密码(登录gitee的)一般不用这种
(2)公私钥
git生成的公钥,添加到整个账户的公钥管理(不是添加到单个项目的公钥管理)
仓库地址使用SSH的,不用Https的
然后,将本地仓库和远程仓库建立连接,需要给远程仓库起个名字,一般是固定死的,就叫origin
,约定死的,看见origin就知道是远程仓库
// 第一次建立连接,将本地仓库和远程仓库建立连接
// git@gitee.com:mengchuan3/mc-club.git是远程仓库的地址
// origin是给这个远程仓库起的名字(约定俗成叫origin)
git remote add origin git@gitee.com:mengchuan3/mc-club.git
查看远程仓库有哪些
git remote
把本地代码push到远程仓库
// origin是远程仓库的名称,推到哪个远程仓库
// master 推到远程仓库的哪个分支(没有会自动创建)
git push origin master:master(前面的是本地的master:后面的是远端的master)
// 把本地的当前分支master和远程仓库origin的master建立连接后
git push --set-upstream origin(远程仓库别名) master(本地):master(远程)
后续只用git push即可
从远程仓库clone文件到本地仓库
git clone 远程仓库链接
克隆一般对于一个仓库只使用一次
克隆是对于整个项目的复制
而一般对于项目,我们只需要维护后续的增删即可
远程仓库有了新的提交(别人提交的),如何拉取到我的本地仓库中?
一端:push 提交到远程仓库
另一端:fetch把远程仓库的更新拉取到本地,只看得到更新,但是远程仓库的新的更新文件没过来,需要再merge才能到本地仓库(将这两步统一简化后就是一步操作git pull)
使用git fetch抓取远程仓库的文件到本地仓库,为啥还要merge呢?
git fetch
命令用于从远程仓库获取最新的更改,但不将这些更改合并到你的当前工作分支。相反,它会将这些更改存储在你的本地仓库中的一个特殊位置,称为“远程跟踪分支”(remote-tracking branch)。
例如,如果你有一个名为 origin
的远程仓库,并且你正在本地 master
分支上工作,git fetch origin
master会从 origin
的 master
分支获取最新的更改,并将这些更改存储在本地的 origin/master
分支中。
为什么需要 merge
当你使用 git fetch
获取了远程仓库的最新更改后,你的本地仓库现在包含两个版本的 master
分支:
- 你的本地
master
分支,它包含你在最后一次与远程仓库同步后所做的所有更改。 - 远程跟踪分支
origin/master
,它包含远程仓库中master
分支的最新更改。
- git merge:
git merge origin/master
会将origin/master
分支上的更改合并到你的本地master
分支。这通常会产生一个新的提交,该提交包含了你和远程仓库所做的所有更改。
当把代码git push推送到远程仓库时,产生冲突,怎么解决?(面试题)
场景1:产生冲突的原因:A和B都在本地仓库修改了同一个文件的同一行代码,A用户在本地修改代码后,优先推送到了远程仓库,此时,B用户在本地修改完,提交到本地仓库,也要推送到远程仓库,此时B用户晚于A用户,提交git push会产生冲突
解决方法:
(1)先使用git pull拉取 A提交到远程仓库的代码
因为pull = fetch + merge ,fetch抓取A提交的代码到本地的origin/master分支没问题,但是合并分支时,会产生冲突(和合并两个本地分支的代码产生的冲突一样,解决方法也一样)
(2)手动解决冲突
打开冲突的文件,手动保留想要的其中一个修改,或者重新修改也行,再保存
(3)git add .
(4)git commit -m "提交说明"
(5)git push 即可
场景2:A和B都在本地仓库修改了同一个文件的 不同行 代码,A用户在本地修改代码后,优先推送到了远程仓库,此时,B用户在本地修改完,提交到本地仓库,也要推送到远程仓库,此时B用户晚于A用户,提交git push会产生冲突
解决方法:
(1)先使用git pull拉取 A提交到远程仓库的代码
因为pull = fetch + merge ,fetch抓取A提交的代码到本地的origin/master分支没问题,因为修改的不是一个地方,所以merge合并分支时,不会产生冲突。
(3)git add .
(4)git commit -m "提交说明"
(5)git push 即可
两个人的提交说明都会保存下来
idea开发工具使用git是有点弱化了工作区、暂存区、本地仓库的概念
把工作区和暂存区归为了一类