集中式版本控制工具,版本库是集中存放在中央服务器的,团队里每个人工作时从中央服务器下载代码(必须联网才能工作,局域网或互联网)。个人修改完后然后提交到中央版本库。
Git
是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git
是LinusTorvalds
为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。大神就是大神。
Git
是分布式的,并不需要有中心服务器,因为我们每台电脑拥有的东西都是一样的。Git
之所以有个中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC
是一样的。我们可以把它当做一个开发者的PC
,是 为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。
Git工作流程图:
安装完成后(windows),在任一目录下鼠标右键会多出如下选项:
在安装完成后首先要做的事情就是设置用户名称
和email
地址,Git
提交需要使用这些信息。
git config--global user.name "username"
git config--global user.email "[email protected]"
查看用户信息git config--global user.name
git config--global user.email
有些常用指令参数非常多,每次都要输入很多参数,可以使用别名简化操作:
① 打开用户目录(C盘下的用户目录如C:\Users\lisa
),创建.bashrc
文件
touch .bashrc
② 在.bashrc
文件中输入别名配置内容,例如:
#用于输出g1t提交日志
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
a1ias ll='ls-al"
③ 使用这个配置文件
打开GitBash
(随便哪个目录),执行命令
source C:/Users/lisa/.bashrc
④ 解决GitBash乱码问题(其中一种方案)
打开GitBash
执行命令:
git config --global core.quotepath false
然后在${git home}/etc/bash.bashrc
文件最后加入下面两行
export LANG=zh_CN.UTF-8"
export LC_ALL=zh_CN.UTF-8"
要使用Git
对代码/目录进行版本控制,首先需要创建本地仓库:
Git
仓库GitBash
窗口git init
,把当前目录初始化为一个git
仓库Git
工作目录下对于文件的增删改会存在几个状态,这些修改的状态会随着我们执行Git
的命令而发生变化。
git add
工作区 → 暂存区git add 文件名
通常用git add .
一次性把所有文件加入缓存区(.
是通配符,表示当前目录所有文件)git commit
暂存区 → 本地仓库git commit -m "备注信息"
命令格式:git log [option]
option:
–all 显示所有分支
–pretty=oneline 将提交信息显示为一行
–abbrev-commint 使输出的commitid更简短
–graph 以图形形式显示
命令形式:
gir reset --hard 提交版本
当回退完成后,HEAD
指针(版本指针)就指向了回退版本。
注意,这个时候再用git log
指令查看日志他就只显示到你回退的版本:
例:
回退到上一个版本[当前版本(已经提交)的上一个版本],删除工作区和缓存区的修改
git reset --hard HEAD^
回退到当前版本(没提交前的版本) , 删除工作区和缓存区的修改
git reset --hard HEAD
如果你又想回退到之前哪个版本,只要你记得版本号,是可以的:
如果刚好你忘了那个版本号,还可以通过查看回退日志找回来:
回退日志指令:git reflog
一般我们总会有些文件无需纳入Gt的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitignore
的文件(文件名称固定),列出要忽略的文件名或文件类型。
touch .gitignore
# 忽略.a结尾的文件
*.a
# lib.a 这个文件例外
!lib.a
# 忽略当前目录下的TODO文件,不包括 子目录下的TODO文件
/TODO
# 忽略 build 目录下的所有文件
build/
# 忽略 doc 目录下 .txt 后缀的文件,但不包括 doc/server目录下的 .txt 后缀的文件
doc/*.txt
# 忽略 doc 目录下所有.pdf后缀的文件
doc/**/*.pdf I
几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离开来进行重大的Bug修改、开发新的功能,以免影响开发主线。
查看分支列表
git branch
创建分支
git branch 分支名
切换分支
git checkout 分支名
创建并切换分支
git checkout -b 新分支名
合并分支
git merge 分支名
例如把dev01
分支合并到master
分支,首先切换到主分支
git checkout master
然后执行合并指令,把dev01
分支合并到当前分支(master
)
git merge dev01
- 在命令行操作合并会出现vi编辑器,
Esc
+:
+wq
保存就行。- 一般都是把其他分支合并到主分支。
删除分支
删除分支,需要做各种检查
git branch -d 分支名
不做任何检查,强制删除分支
git branch -D 分支名
- 不能删除当前分支,只能删除其他分支
- 基于
master
分支创建一个dev
分支,在dev
没有合并到master
分支的前提下,用git branch -d dev
去删除dev
分支,git
会认为你是误操作,提示错误。这个时候就需要用-D
来强制删除。
解决冲突
如果master
分支和dev
分支都修改了同一个文件的同一行,要把dev
分支合并到master
分支的时候,就会发生冲突:
这个时候如果打开冲突文件,就会发现里面的内容变了,git把两个分支的冲突内容都写到了冲突文件上让你做取舍:
然后根据需要手动修改,去掉git
自动给你添加的那些指示符,保留或改成你想要的,如:
保存,然后再次add
→commit
→merge
即可。
<<<<<<<与
========
之间的内容属于当前分支
========
与>>>>>>>>dev
之间的内容属于dev分支
master
创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。develop
创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop
分支。master
派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master
、test
、develop
分支。常见远程仓库:
Github
:国外的公开的代码托管平台。Gitee
:国内的公开的代码托管平台。Gitlab
:基于git
的开源项目,用于搭建私服。企业常用Gitlab
,因为Github
和Gitee
平台都部署在别人的服务器中,而Gitlab
是一个开源项目,可以在自己的服务器中搭建git
私服,保证安全。
在Gitee
中创建一个远程仓库,过程省略。
在本地GitBash
中生成SSH公钥
ssh-keygen -t rsa
获取生成的公钥(也是在GitBash
中操作)
cat ~/.ssh/id_rsa.pub
回到本地验证配置是否成功
ssh -T [email protected]
ssh
的地址git remote add origin 远程仓库地址
仓库名默认是
origin
,也可以自定义。
git remote
git push origin master
- 完整命令是:
git push [-f] [--set-upstream] [远端名称] [本地分支名][:远端分支名]
- -f: 表示强制覆盖远程分支的代码,一般危险
- –set-upstream: 推送的同时建立本地分支与远端分支的关联关系,建立了关联在下次推送时就不用写本地分支名和远端分支名,直接
git push
,一般不用。可以通过git branch -vv
命令可以查看分支的关联关系。- 当远端分支名和本地分支名相同时可以忽略远端分支名
push origin master
表示把master
分支推送到远程的origin
仓库
把远程仓库克隆到本地。
git clone <仓库路径> [本地目录]
本地目录可以省略,会自动根据仓库名生成一个同名目录
远程分支和本地的分支一样,我们可以进行merge
操作,只是需要先把远端仓库里的更新都下载到本地,再进行操作。
抓取指令就是将远程仓库里指定分支的更新都抓取到本地,但不会自动进行合并。
git fetch [remote name][branch name]
如果不指定远端名称和分支名,则抓取所有分支。
拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch
+merge
。
git pull [remote name][branch name]
- 如果不指定远端名称和分支名,则抓取所有并更新当前分支。
在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分支,如下图所示。
养成习惯,在
push
推送之前先pull
一下
提交过程可能会因为idea的代码检查比较慢,确认提交等待完成即可。
如果本地没有项目代码,需要从远程仓库克隆
然后配置仓库地址和本地仓库目录
idea就自动把仓库克隆下来并打开。
记得每次推送代码前pull一下,默认选项就行。
如果代码有冲突,那么会弹出提示,提示那个文件冲突了
此时可以选择点击Merge
选项,他会自动打开冲突文件让你修改。或者关掉这个提示窗口,在旁边的项目目录中冲突文件会变成红色,直接打开修改也行。
修改完这个文件还是红色的,说明idea
把冲突文件移出了工作区,这时直接提交会提示错误,先手动add
一下这个文件再提交。
之后就是正常提交推送即可。
推荐使用方式二,以为可以很直观的选择基于哪个提交版本创建分支
巧用git log 窗口很有用
在分支栏直接操作,省略…
参考资料:哔哩哔哩-黑马程序员-黑马程序员Git全套教程,完整的git项目管理工具教程,一套精通git
https://www.bilibili.com/video/BV1MU4y1Y7h5?p=2&share_source=copy_web