版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步
- 版本控制在软件开发中,可以帮助程序员进行代码的追踪、维护、控制等等一系列的操作。
Bash -CMD- GUI的区别
- Git Bash 就是一个 shell,是 Windows 下的命令行工具,可以执行 Linux 命令
- Git CMD 是 Windows 操作系统上的命令行解释程序
- Git GUl 它提供了一个图形用户界面来运行 git 命令
GIT配置
- 每台计算机上只需要配置一次,程序升级时会保留配置信息
- 可以在任何时候再次通过运行命令来修改它们
设置你的用户名和邮件地址
每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中
- 配置用户名
git config --global user.name "XXXX"
- 配置邮箱
git config --global user.email "XXXXX"
- 检查当前配置信息
git config --list
GIT的使用
获取GIT仓库
1.没有远程仓库
- 在当前文件夹下
git init
- 将文件交由GIT管理
git add .
- 提交一次
git commit -m "初始化项目"
2.有远程仓库
- 直接拉取代码
git clone "XXXXX"
文件状态的划分
- 未跟踪
- 默认情况下,Git仓库下的文件也没有添加到Git仓库管理中,我们需要通过add命令来操作;
- 已跟踪
- 添加到Git仓库管理的文件处于已跟踪状态,Git可以对其进行各种跟踪管理
- 细分
- staged:暂缓区中的文件状态
- Unmodified:commit命令,可以将staged中文件提交到Git仓库
- Modified:修改了某个文件后,会处于Modified状态;
GIT的忽略文件
无需纳入 Git 的管理可以创建一个名为 .gitignore 的文件,列出要忽略的文件
- 在实际开发中,这个文件通常不需要手动创建,在必须的时候添加自己的忽略内容即可,
- 一些不需要提交的文件、文件夹
- 本地环境变量文件
- 一些日志文件
- 一些编辑器自动生成的文件;
Git的校验和(commit ID)
Git 中所有的数据在存储前都计算校验和,然后以校验和来引用。
基于 Git 中文件的内容或目录结构计算出来,
可以通过ID 来找到对应修改的文件
远程仓库的验证
- 方式一:基于HTTP的凭证存储(Credential Storage);
`$ git config credential.helper
每一台电脑在首次登录的时候会在本地生成一个凭证,可以在控制面板-凭证管理器里面进行修改或者删除 - 方式二:基于SSH的密钥
- SSH以非对称加密实现身份验证
- 例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;
- 另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录
- 公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管:
SSH操作方法
- 创建一对公钥和私钥
ssh-keygen -t ed25519 -c "your email"
//ed25519 是一种加密类型ssh-keygen -t rsa -b 2048 -C "your email"
- 找到公钥,本地公钥在用户>.ssh文件夹下
- 然后在远程服务器(github)里添加到SSH公钥里面
管理远程服务器
查看远程地址:比如我们之前从GitHub上clone下来的代码,它就是有自己的远程仓库的git remote
git remote -v
-v是-verbose的缩写(冗长的)
远程仓库的默认名字是origin
添加远程地址
也可以继续添加远程服务器(让本地的仓库和远程服务器仓库建立连接)
一个本地仓库可以和多个远程仓库建立链接git remote add <仓库名字> <远程地址>
git fetch origin main
git branch--set-upstream-to=origin/main
建立上游分支联系
重命名远程地址:git remote rename gitlab glab
移除还程地址:git remote remove gitlab
远程仓库的交互
- 从远程仓库clone代码:将存储库克隆到新创建的目录中;
git clone XXXX
- 将代码push到远程仓库:将本地仓库的代码推送到远程仓库中;
- 默认情况下是将当前分支(比如master)push到origin远程仓库的:
git push
git push origin master
- 默认情况下是将当前分支(比如master)push到origin远程仓库的:
- 从远程仓库fetch代码:从远程仓库获取最新的代码
- 默认情况下是从origin中获取代码
git fetch
git fetch origin master
获取到代码后默认并没有合并到本地仓库,我们需要通过merge来合并;git merge
从远程仓库puI代码:上面的两次操作有点繁琐,我们可以通过一个命令来操作git pull
git fetch + git merge(rebase)
- 默认情况下是从origin中获取代码
Git 分支
Git 的默认分支名字是 master,在多次提交操作之后,你其实已经有一个指向最后那个提交对象的 master 分支
master 分支会在每次提交时自动移动:
通过一个名为 HEAD 的特殊指针这个指针指向谁就在那个分支里面
Git创建分支
Git 是怎么创建新分支的呢?
分支只是为你创建了一个可以移动的新的指针
比如,创建一个 testing 分支,你需要使用 git branch 命令:git branch testing
Git切换分支
git checkout xxxxx
git checkout -b xxxxx
创建一个XXX分支并且切换到这个分支
Git分支的合并
git merge 需要合并的分支
查看和删除分支
如果我们希望查看当前所有的分支,可以通过以下命令:git branch
查看当前所有的分支git branch -v
同时查看最后一次提交
git branch --merged
查看所有合并到当前分支的分支git branch --no-merged
查看所有没有合并到当前分支的分支
如果某些已经合并的分支我们不再需要了,那么可以将其移除掉:git branch -d hotfix
删除当前分支git branch -D hotfix
强制删除某一个分支
Git的工作流(git flow)
在整个项目开发周期的不同阶段,你可以同时拥有多个开放的分支;
比如
- master作为主分支
- develop作为开发分支,并且有稳定版本时,合并到master分支中;
- topic作为某一个主题或者功能或者特性的分支进行开发,开发完成后合并到develop分支中;
Git的远程分支
git push origin develop
推送到git仓库并新建一个develop分支git branch --set-upstream-to=origin/develop
跟上游分支建立链接git checkout --track origin/main
跟踪远程分支
- Git 中用于创建一个新的本地分支,并将其与远程分支
origin/main
关联(即“跟踪”该分支) git checkout develop
简写 作用- 检查服务器是否有origin/deve1op这个分支
- 创建一个本地的develop分支
- 让本地的develop分支自动跟踪origin/develop
- 切换到develop分支
git push origin --delete <branch>
删除远程分支
Git rebase
在 Git 中整合来自不同分支的修改主要有两种方法:merge以及rebase。git rebase master
把多分支merge的树结构改成线性结构
我们可以再次执行master上的合并操作git checkout master
git merge experiment
rebase和merge的选择
- merge用于记录git的所有历史,那么分支的历史错综复杂,也全部记录下来
- rebase用于简化历史记录,将两个分支的历史简化,整个历史更加简洁
rebase有一条黄金法则:永远不要在主分支上使用rebase
如果在main上面使用rebase:会造成大量的提交历史在main分支中不同
GIT的各种命令
检测文件状态
git status
文件添加到暂存区
git add xxxxx
如果我们已经跟踪了某一个文件,这个时候修改了文件也需要重新添加到暂存区中git add .
将所有的文件添加到暂存区中:
文件更新提交
git commit
可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行
如果修改文件的add操作,加上commit的操作有点繁琐,那么可以将两个命令结合来使用git commit -a -m"修改了bbb文件'
查看提交的历史
git log
查看一下所有的历史提交记录。
不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面;
命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明;
git log --pretty=oneline
在一行里面显示git log--pretty=oneline --graph
可以显示各个分支的提交
git reflog
可以查看所有操作的历史(包括版本回退)
版本回退
git reset
如果想要进行版本回退,我们需要先知道目前处于哪一个版本:Git通过HEAD指针记录当前版本。
- HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交;
- 理解 HEAD 的最简方式,就是将它看做 该分支上的最后一次提交 的快照(commit ID);
- 上一个版本就是HEAD^,上上一个版本就是HEAD^^;
git reset --hard HEADN
- 如果是上1000个版本,我们可以使用HEAD~1000
git reset --hard HEAD~1000
- 我们可以可以指定某一个commit id; (选择7-8位即可)
git reset --hard 2d44982
Git标签(tag)
创建tag
对于重大的版本我们常常会打上一个标签,以表示它的重要性
- Git 可以给仓库历史中的某一个提交打上标签
- 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0、v2.0等等);
创建标签:
- Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)
- 附注标签:通过-a选项,并且通过-m添加额外信息:
git tag v1.0
git tag -a v1.1 -m "XXXXX"
默认情况下,git push 命令并不会传送标签到远程仓库服务器上,
- 在创建完标签后你必须显式地推送标签到共享服务器上,当其他人从仓库中克隆或拉取,他们也能得到你的那些标签;
git push origin v1.0
git push origin --tags
会push所有的tag标签
删除和检出tag
- 删除本地tag:
要删除掉你本地仓库上的标签,可以使用命令git tag -d tagname
- 删除远程tag:
要删除远程的tag我们可以通过git push <remote> -delete <tagname>
- 检出tag:
如果你想查看某个标签所指向的文件版本,可以使用 git checkout 命令
通常我们在检出tag的时候还会创建一个对应的分支git checkout v1.0
Note: switching to ‘v1.0’