Git
零、概念介绍
Git是一个分布式(本地和远程仓库)版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过GIt仓库来存储和管理这些文件,Git仓库分为两种:
本地仓库:开发人员自己电脑上的Git仓库
远程仓库:远程服务器上的Git仓库
Git本地仓库,远程仓库交互示意图:
一、git 环境搭建
官网地址:https://git-scm.com/
(一)、安装git
找一个教学将git安装配置成功,如何验证?如下图(注意:以后点击 Git Bash Here 就可以打开git命令行):
(二)、注册一个远程仓库账号
gitee远程仓库地址:https://gitee.com/
这里我们选择的时gitee这个代码托管平台,具体注册细节找教学。
二、git 设置
(一)、全局设置
1、设置用户信息
这里的姓名和邮箱地址可以随意写,只要能够区别即可
git config --global user.name "XXX"
git config --global user.email "邮箱"
2、查看配置信息
git config --lis
注意:上面设置的user.name 和 user.email并不是我们在注册码云账号时使用的用户名和邮箱,此处可以任意设置。
(二)、本地仓库操作
1、概念介绍
版本库(这里主要指本地仓库):工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
工作区:包含.git文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
简化流程示例图(官网参考地址:https://git-scm.com/about/staging-area):
2、初始化本地仓库
在对应一个目录下,打开git命令行(怎么打开看安装git部分)输入:
git init
我们可以看到生成了一个隐藏目录.git(如果看不到,请自行设置显示隐藏文件),示例:
3、创建文件并添加到缓存区
创建文件:
git status # 可以先通过查看,可以看到我们对应的添加的文件是红色的,此时文件还未添加到暂存区
# 将对应的文件添加到暂存区
git add ./test.txt
# 添加后我们再次查看状态,此时文件就是 绿色 了
git status
# 如果文件较多可以直接将所有新创建的文件添加到暂存区
git add .
4、取消暂存
运行指令后,可以通过 git status 查看该文件是否变红,即该文件已经从暂存区中移除。
git reset ./test.txt
5、将暂存区的内容提交到本地仓库
注意提交后,再次通过 git status 查看,可以发现原本暂存区的文件都没有显示了。
git commit -m "你的注释"
6、查看提交历史
具体的提交哈希值在第一行 commit后面。
git log
7、取消提交回退到上一个提交版本
!!!!特别注意!!!!:
1、首先对于第一次提交而言这个指令毫无意义,如果使用回退前一次提交会报错,如果使用回退具体提交你也只能回退到当前。
2、使用这个指令一般是你本次提交到本地仓库的操作想要回退,不要连续执行或者跨版本回退。
# 回退到本次提交的上一次
git reset --hard HEAD^
# 回退到一次具体的提交
git reset --hard 具体的提交哈希
8、提交回退多次或者指定具体hash是回退过多
这里是挽救你第7步中,错误执行了两次回退提交,或者指定具体提交历史时跨越了需要保留的提交。
# 查看仓库每一次对 HEAD 指针的操作
git reflog
# 输出:
HEAD@{0}: reset: moving to HEAD^
HEAD@{1}: commit: Last commit message # 比如你想要回退到这步操作
HEAD@{2}: commit: Previous commit message
# 回退到对应的 HEAD
git reset --hard HEAD@{1}
(三)、本地仓库与远程仓库绑定
注意在此之前的操作都是在本地仓库中,都没有和远程仓库进行绑定,所以如果你已经绑定,或者直接是clone下来的项目,前面的操作就不一定一致。特指 7、8两步。
1、查看远程仓库
如果输出为空,就是没有添加远程仓库。
git remote
2、基于远程仓库进行创建的本地仓库
注意第一次需要登录自己对应的远程仓库的账号,如果是没有权限的仓库也是无法拉去的。
# 由于本地仓库本身就是基于远程仓库创建的,所以天然绑定
git clone 对应需要克隆的地址
# 修改并添加到本地仓库后
git push # 推送到远程仓库
git pull # 从远程仓库拉取
2、本地已有仓库需要和远程仓库绑定
(1)、新建远程仓库
首先在gitee网站点击此处新建仓库:
(2)、设置远程仓库
然后给远程仓库命名,这里一般命名英文或部分中文会自动生成路径,如果没有你可以自行设置,是否开源取决于你的项目是否想要公布,这里目前先不要初始化(后续你需要对应忽略文件的模板可以点击初始化选择,然后拷贝留用)。
(3)、已有本地仓库和远程仓库建立连接
如果你没有初始化,就可以看到这下面这个提示指令直接复制即可使用:
第二步指令就是在建立连接,建立后此时情况是远程空就push,是本地空就pull
cd existing_git_repo # cd 到你的本地仓库根目录,即.git的那级目录右击打开git命令行
git remote add origin 对应远程仓库的地址 # 这个指令就是添加远程仓库(这里特指master)
git push -u origin "master" # 将本地仓库推送到远程 master 分支
git pull origin "master" # 这样操作后本地的分支显示就会正常
推送成功输出,此时你的仓库就已经和远程仓库建立连接,可以使用 push 和 pull进行推拉了:
注意:只是需要注意的是,如果不是在测试环境下,你需要和团队成员沟通后进行提交,当然这里目前还没有涉及到其他分支的操作
3、取消提交回退(已经push到远程仓库版)
前面我们说过在本地仓库中撤回提交的操作,现在我们说一下如果这个提交你不小心已经提交到了远程仓库怎么办。首先如果你有其他开发成员,第一件事应该是使用沟通软件,立即和他们说明情况,这才是第一位。
这里有两种方式可以处理,自行评估(考虑到有些时候只有你一个人的时候)。没有特殊情况一定是第二种,留痕第一
(1)、强制推送撤销提交
这种方式会用将你取消提交的那次历史操作在本地和远程抹去,如果你有开发伙伴正基于那次提交进行操作,那是非常可恶的
前面提过怎么回退本地仓库的提交,具体细节回看前面说过的(二)、7和8。
git reset --hard HEAD^ # 回退到上一次提交
git push origin 分支名(这里指master) --force # 强制推送
以下通过图例说明,观察提交记录的变化:
1.1强制提交前(本地):
1.2强制提交前(远程)
1.3回退提交后(本地):
1.4强制提交后(远程):
这里说明一下,提交前与本地仓库记录一致的,也有三次提交记录,相当于第三次提交记录在远程被抹去了,如果现在有不知情的成员在根据第三次提交开发代码 -_- 哦豁,完蛋!
!!!! 这里一定会有人说那怎么办,伦家要是真这样操作了怎么吧啊Q_Q,请阅读(三)、3的前言,无论如何,为了避免更大的损失,第一步 一定一定一定 是和你的开发伙伴或者组长迅速说明情况并开始处理。
因为问题往往出在信息差中,特别是这种同步协作。想想如果只有你一个人,你通过前面(二)、8中的方式找到对应记录回退到你撤销前并再次推送到远程仓库是可以恢复现场的。!但是离谱的故事是,你撤销提交前有人已经基于你的操作那次撤销提交进行了二次开发,而从此时到你恢复后这个时间间隔又有人拉下代码进行了操作,而你又恢复了那一次提交。@_@ 哦哈哈哈哈,出了事就想想怎么被两边 ( ˋ( ° ▽、° ) (o( ̄▽ ̄///(斩!!) )
(2)、创建一个逆向提交
这种方式就会保留错误的提交记录。
# 获取需要撤销的提交的哈希值
git log --oneline
# 根据你想要撤销那步的哈希值创建一个逆向提交
git revert 想要撤销的commit的hash
会让你编写一个逆向提交文件,这里我重复书写了 This reverts ...., 具体根据自己所在的规范而定。
如果出现冲突需要解决冲突后,需要再次提交(没有就跳过):
# 解决冲突: (如果出现冲突,解决冲突)
git commit -m "删除了 x.txt 文件,因为这是一次错误的提交。"
推送
# 推送
git push origin 分支名这里是master
以下通过图例说明,观察提交记录的变化:
2.1逆向提交后(本地仓库)
2.2逆向提交push前 (远程仓库)
2.3逆向提交push后 (远程仓库):
可以看到前面错误的提交记录还存在。
三、git 分支操作
前面我们所涉及的操作都是基于一个主分支的,所以我们建立本地远程仓库连接后可以直接git push 或者 git pull,以下我们开始建立多个分支。
Git 分支管理是 Git 强大功能之一,能够让多个开发人员并行工作,开发新功能、修复 bug 或进行实验,而不会影响主代码库。
讲分支前说明一下:
[remote-name]:远程仓库名,一般指origin
[branch-name]:远程仓库的分支名 所以,可以想到如果我们创建了其他分支后这里就有所变化
# 较全写法
git pull [remote-name] [branch-name]
git pull origin master
# 较全写法
git push [remote-name] [branch-name]
git push origin master
(一)、查看分支
就是查看目前的一个分支情况。!!!没有提交之前,无法显示查看分支!!!
git branch 列出所有本地分支
git branch -r 列出所有远程分支
git branch -a 列出所有本地分支和远程分支
(二)、创建分支
创建一个分支,注意:创建的分支会在当前所在的分支的基础上创建。
git branch [name]
(二)、切换分支
从一个分支切换到另一个分支。
git checkout [name]
看到第一行右侧的(master)这里就是提示你当前所在的分支:
(三)、本地分支推送到远程分支
:号前面的是本地分支,后面的是远程分支
git push origin yjl:master # 其实就相当于,认为本地仓库分支名与远程仓库分支名不一样,这样推送。
# 如果你推送的本地分支 和 远程主分支同名可以改为:
git push origin yjl
(四)、合并分支
将后面所指示的分支合并到当前的分支。注意:这里如果设置分支的合并冲突先和你一起开发的小伙伴交流,如果只是你一个人出现了这个问题,就选择对应的保留并重新暂存提交。
git merge [name]
(五)、删除分支
删除对应分支名对应的分支。
# 删除本地分支
git branch -d 分支名
# 删除远程分支
git push origin --delete 分支名
(六)、两种操作
这里分支的具体分法却决于自己设计。
1、本地远程都有主分支和自己的分支
适合:每一个人开一个自己的分支,这样分支由人数而定。
2、本地主分支,远程有主分支和部分功能的分支
适合:主分支是整体结构,开发部分功能开一个分支。这样分支由细分的部分决定
四、git 标签版本发布
如果你达到一个重要的阶段,并希望永远记住提交的快照,你可以使用 git tag给它打上标签。Git 标签(Tag)用于给仓库中的特定提交点加上标记,通常用于发布版本(如 v1.0, v2.0)。
比如说,我们想为我们的项目发布一个 "1.0" 版本,我们可以用 git tag -a v1.0命令给最新一次提交打上(HEAD) "v1.0" 的标签。
"-a"选项意为创建一个带注解的标签,不用 -a 选项也可以执行的,但它不会记录这标签是啥时候打的,谁打的,也不会让你添加个标签的注解,我们推荐一直创建带注解的标签。
(一)、创建
##### 1、没有使用 -a
git tag 标签名
2、使用 -a
当你执行 git tag -a 命令时,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
git tag -a v1.0
(二)、查看
git tag
(三)、推送
!!!特别注意:其实这里的推送指令也可以看出端倪,我们并没有指定对应的分支,而是直接推送。而且注意观察,我们在一个分支里面创建了一个tag后其他分支中也会有这个tag,可以简单理解为tag就是一次提交的全局记录,大家都共享其。
git push origin 标签名
(四)、删除
1、本地删除:
git tag -d v1.0
2、远程删除:
git push origin --delete v1.0
标签:git,本地,仓库,基础,提交,远程,分支
From: https://www.cnblogs.com/fragmentary/p/18487609