视频教程链接【3小时带你搞定git-玩转GitHub】
教程发布时间大概是2020年
版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统,简单讲就是备份和记录
优点 | 缺点 |
---|---|
简单 | 备份较多或许就会混淆不同版本之间的区别 |
不同系统上的开发者无法协同工作 |
有一个单一的集中管理的服务器,保存所有文件的修订版本,协同工作的人们都通过客户端连到这台服务器,读取最新的文件或者提交更新.
优点 | 缺点 |
---|---|
支持协同开发 | 存在单点故障 |
客户端不只是提取出最新版的文件快照,而是把最原始的代码仓库镜像懂啊本地.每一次提取操作,实际上都是一次对代码仓库的完整备份.
git config --global user.name [username]
git config --global user.email [email]
git config --list //查看所有配置
–global参数表示你这台机器上所有的Git仓库都会使用这个配置.
状态 | 描述 |
---|---|
已提交(committed) | 已提交表示数据已经安全保存在本地仓库中 |
已修改(modified) | 已修改表示修改了文件,但还没保存到仓库中 |
已暂存(staged) | 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中. |
针对Git文件的三种状态,这里需要了解Git项目的是哪个工作区域:工作区,暂存区和Git仓库.
分类 | 描述 |
---|---|
工作区 | 简单的理解为在电脑里能看到的目录,比如自己创建的本地项目目录 |
暂存区 | Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git自动创建的第一个分支master,以及指向master的第一个指针叫HEAD. |
Git仓库 | 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库. |
基本上的Git工作流程描述如下:
版本库又名仓库,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。理解了Git文件状态与三种工作区域之后,通过一个例子来体验Git对于文件的基本操作。
编写一个文本文件并将文件提交到git仓库
通过执行git init
命令在本地初始化一个本地仓库,执行该命令后会在本地初始化一个没有任何文件的空仓库。
文本内容如下:
在.git同级目录下添加git01.txt文件后,使用git status
查看工作目录与暂存区文件状态
使用git status命令能看懂啊那些修改被暂存到了,哪些没有,哪些文件没有被跟踪到.
可以看到git01.txt既没有被暂存也没有被跟踪,输出结果具体解释如下
$ git status
On branch master//显示在主分支上面
No commits yet//还没有提交
Untracked files://没有追踪到的文件
(use "git add ..." to include in what will be committed)//追踪到该文件的方法
git01.txt //没有追踪到是红色,追踪到是绿色
nothing added to commit but untracked files present (use "git add" to track)
可以看到git01.txt既没有被暂存也没有被跟踪
git add
命令添加文件到暂存区git add path通常是通过git add {path}的形式把 {path}添加到索引库中, {path}可以是文件也可以是目录.
$ git status
On branch master
No commits yet//未提交
Changes to be committed:
(use "git rm --cached ..." to unstage)//移除暂存区里的某个文件
new file: git01.txt //追踪到是绿色
此时可以看到有一个git已tracked到新文件git01.txt,文件被成功存放到暂存区
文件被添加到暂存区后,执行git commit命令提交暂存区文件到本地版本库中
$ git commit -m "git版本初始化与文件提交"
[master (root-commit) 965e030] git版本初始化与文件提交
1 file changed, 1 insertion(+)//一个文件被改变,一次插入
create mode 100644 git01.txt
$ git status
On branch master
nothing to commit, working tree clean //暂存区没有文件了
git log
命令用于显示提交日志信息.
git commit命令用于将更改记录(提交)到存储库.将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中.
$ git log
commit 965e030ebd47d8d37defd54adba05f25e4b235c4 (HEAD -> master)//唯一的标识
Author: yaoyaowu2333 <[email protected]>//提交人
Date: Mon Sep 4 20:45:55 2023 +0800//日期
git版本初始化与文件提交//日志
$ git status
On branch master
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git restore ..." to discard changes in working directory)//取消这次改变
modified: git01.txt //modified 被修改
no changes added to commit (use "git add" and/or "git commit -a")
将文件提交到暂存区
$ git add . //点代表当前目录
将文件提交
git commit //会进入文本编辑模式
//点击i进入编辑模式,点击esc退出编辑模式,点击:wq保存退出
修改需要注意的问题
下面再次修改git01.txt然后执行提交操作
执行提交操作
虽然工作区的内容进行了修改,因为没有暂存,暂存区还是和之前一样,所以提交不成功
git本地库与工作区的区别的命令
$ git diff HEAD -- git01.txt
//差异比较说明
diff --git a/git01.txt b/git01.txt
index ad795e8..884dbab 100644
--- a/git01.txt //变动之前的文件
+++ b/git01.txt //变动之后的文件
@@ -1,2 +1,3 @@ //-代表变动之前的文件,1,2代表从一行开始连续两行,+代表变动之后的文件,1,3代表从第一行还是连续三行
git 仓库初始化与文件添加基本操作
-git 开启时光穿梭机的故事
\ No newline at end of file
+git 开启时光穿梭机的故事//将不一样的结果罗列出来
+git 第三次修改
\ No newline at end of file
可以看出:文中第三行内容并没有提交到版本库中,原因在于修改后的git01.txt并没有添加到暂存区,所以执行提交操作并不会发生改变.
暂存区文件提交与撤销
当发现因失误将文件添加到暂存区时,git支持文件的撤销操作,执行命令如下
git reset HEAD 文件 //取消上一次的操作,上一次的操作可以是git add也可以是git commit
执行git add .后查看版本库状态并执行撤销操作
再次查看版本库状态, 成为未追踪文件
当文件修改后被提交的次数很多时,对于版本库中存放的文件就会出现不同的版本,在多人开发的项目环境中,通常会对不同版本文件进行查看甚至回退的情况
对于上面操作的git01.txt文件已有几个版本,对于历史版本的查看使用git log命令
列表显示的结果按提交时间倒序排列.其中第一条中HEAD->master代表当前指针指向Git版本库中master主干分支,每次提交Git内部均会生成一个唯一的SHA算法构建的字符串来唯一标识当前版本
保存并提交命令:git commit -am "日志"
如果提交历史记录较多,可以加入数字控制显示的版本记录数,并且使用命令查看简略版log:git log --pretty=oneline
版本回退到上一个版本,使用命令git reset --hard HEAD^
git01.txt内容
往回退多个版本,例如回退两个版本,命令:git reset --hard HEAD~2
git01.txt内容
通过标识来跳转到想要的版本,命令:git reset --hard 标识
git01.txt内容
回退版本后执行git log命令只会从最初版本显示到当前版本.如果想要前进到更新的版本需要查看所有的日志,运行命令:git reflog
可查看所有版本的标识
git log --pretty=oneline//版本信息一行展示
git reset --hard HEAD^//回退一个版本
git reset --hard HEAD~2//往回退两个版本
git reset --hard 标识//通过标识回退到指定版本
git reflog//查看完整的日志信息
删除文件同样是一个修改操作
查看git文件本地仓库里面的文件,命令:git ls-files
可以看到只有git01.txt,git02.txt没有被添加进去
提交后发现有了两个文件
删除git02后,还可以从git上拉取下来,命令:git checkout git02.txt
可以看到git02又被拉取下来了
git仓库删除文件有两种办法,第一种在工作区删除后
git给的提示有通过add更新,或通过restore撤销这次操作.
下面展示通过add更新
发现git02已经处于被删除状态,执行提交操作后可以发现git02文件已经被成功删除
回退到git02提交
版本
首先要查看所有日志,获取到版本标识,然后通过reset命令跳转到指定版本
Git是一个分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。截止目前,并没有看到分布式的环境,因为以上的操作都在本地发生.对于Git,除了前面提到的本地版本库外,Git支持远程仓库的托管服务,即使用者可以将本地版本库中的文件托管到远程服务器进行存储,这样就极大的方便开发,无论你走到哪,只要你的机器能够联网,就可以通过远程的仓库地址得到一份相同的项目库文件,并且下载到本地的文件版本记录与远程文件版本保持一致,并且可以很方便的实现多人协同开发操作。
对于Git远程仓库,GitHub( https://github.com/ )是比较知名的一个,目前已被微软收购,而国内比较知名的当属码云( https:/gitee.com/ )了,当然除了这些远程仓库外,在公司,有的公司出于安全考虑,可能会自己搭建一套Git服务区来自Git的远程仓库,对于内部仓库会有专门人员来进行维护操作。这里以当下比较流行的GitHub仓库来介绍Git远程仓库基本操作与使用。
下载插件octotree,可以看GitHub项目的层级目录
下载项目方式1:download zip
下载项目方式2:复制https链接,打开git终端,输入命令:git clone https://github.com/xxx/xxx.git
下载项目方式3:使用ssh方式下载,该方式下载效率高,而且更加安全.
ssh-keygen -t rsa -C "GitHub账号邮箱"
,一直点回车
看到公钥已经生成,存储在’/c/Users/13286/.ssh/id_rsa.pub.’
在GitHub添加公钥
点击右上角的头像,点击settings,点击SSH and GPG keys,点击右上角new SSH key,输入title和key(要删除莫文明的空格)
检查测试链接,执行命令ssh -T [email protected]
输入yes后可以成功连接.如果自己的github有多个ssh公钥,可能会报错,我去找如何管理多个ssh key的方法,最后没有找到可用的办法.
输入命令git clone [email protected]:xxx/xxx.git
克隆项目
在远程创建一个仓库,把自己的项目放到远程的仓库
查看当前本地仓库状态
绑定远程仓库命令:git remote add origin [email protected]:xxx/xxx.git
推到远程主干:git push -u origin master
绑定后成功推送成功.在推送过程中因为写错分支名称(把master写成了main),所以失败,改正后就可以成功推送了.结果如下
之所以存在git02.txt应该是因为输入git rm git02.txt
命令后没有提交.
修改内容如上,然后将修改后的文件保存在暂存区,提交到本地仓库,最后上传到远程仓库
绑定只需要一次,之后直接输入命令git push推送就可以了,可以看的修改后的内容成功提交到远程仓库
开发企业项目中在使用Git或者其他类似版本控制软件对项目版本进行管理时,多人合作的项目在开发时通常不会直接在主干master上进行操作,而是重新开辟新的分支,在新的分支上进行开发调试等操作,当项目调试通过时才会将分支项目的代码合并到主干中,这是在实战中比较好的一种策略,特别是多人协同开发一个项目的情况下尤其明显。Git对于分支操作提供了一下基本命令:
命令 | 描述 |
---|---|
git checkout branch | 切换到指定分支 |
git checkout -b new_branch | 新建分支并切换到新建分支 |
git branch -d branch | 删除指定分支(用完后删除) |
git branch | 查看所有分支,并且*号标记当前所在分支 |
git merge branch | 合并分支(切到master分支合并) |
git branch -m oldbranch newbranch | 重命名分支 |
git branch -m | -M oldbranch newbranch | 重命名分支,如果newbranch名字分支已经存在,则需要使用-M强制重命名,否则,使用-m进行重命名。 |
查看当前分支,创建新分支,并切换到新分支
可以看到已经切换到新分支,新分支的内容与主干相同
切回主分支
重命名分支名,并切到dev分支
在dev分支上提交新版本,之后切到master分支
合并分支,注意:合并分支要切到主干
,合并后删除子分支dev
相关命令操作
命令 | 描述 |
---|---|
git branch -a | 查看本地与远程分支 |
git push origin branch_name | 推送本地分支到远程 |
git push origin :remote_branch | 删除远程分支(本地分支还在保留) |
git checkout -b local_branch origin/remote_branch | 拉取远程指定分支并在本地创建分支 |
删除命令与推送命令只差一个冒号
在github新建一个分支,输入分支名,点击create branch:dev即可创建新的分支
因为本地有dev分支,所以要先删除本地dev分支
先切换到主分支,然后执行删除命令
报错是因为分支没有合并,如果要删除没有合并的分支,需要用命令git branch -D 分支名
强制删除
开发中对不同分支下同一文件进行修改后执行合并时就会出现文件修改冲突情况,这里说明一种比较常见的冲突问题以master和leaf01两个分支进行演示说明。
修改master与dev分支前git01.txt文件内容状态
在dev分支修改内容如下:
在master分支修改内容如下:
将dev分支合并入master分支的结果如图所示
$ git merge dev
Auto-merging git01.txt
CONFLICT (content): Merge conflict in git01.txt//合并过程中git01.txt文件发生冲突
Automatic merge failed; fix conflicts and then commit the result.//自动合并四百,修复冲突后再提交结果
冲突结果展示
解决冲突的办法,以其中一个为准,这里里master为准
修改文件后提交到本地仓库
可以看到本地仓库从合并状态变为普通状态
以图的形式看日志,可以看到分支冲突解决的过程
拉取远程库dev并在本地创建dev开发库,执行命令git checkout -b dev origin/dev这里以同台机器不同窗口来模拟两个用户操作同一分支同一文件(实际开发时多人操作统一文件冲突情况比较常见)
这里两个客户端以c1与c2来描述
c1客户端本地修改dev分支git01.txt文件并在本地执行提交操作效果如下
c1操作
c1用户修改git01文件
c1用户添加到暂存区,提交,push到远程仓库
c2操作
c2用户修改git01.txt
c2用户添加到暂存区,提交,push到远程仓库
可以看到push失败,因为c1先提交,c2需要先拉取最新的版本.
拉取成功,但合并的过程中发生冲突,冲突结果入下图所示
解决冲突
再次合并,将解决冲突的版本推送到远程仓库
成功推送
标签操作基本命令git tag
命令 | 描述 |
---|---|
git tag tag_name | 新建标签,默认为HEAD |
git tag -a tag_name -m ‘xxx’ | 添加标签并指定标签描述信息 |
git tag | 查看所有标签 |
git tag -d tag_name | 删除一个本地标签 |
git push origin tag_name | 推送本地标签到远程 |
git push origin --tags | 推送全部未推送过的本地标签到远程 |
git push origin :refs/tags/tag_name | 删除—个远程标签 |
同大多数VCS一样,Git也可以对某一时间点上的版本打上标签。开发中在发布某个软件版本(比如v1.0等等)的时候,通常使用版本库软件命令来对某一版本打上一个标签,以方便标识。
为当前版本添加本地标签
为某一个版本添加标签
为某个版本添加标签并指定标签描述信息
-a 选项表示创建一个附注标签,附注标签是一种特殊的标签,它会在仓库中创建一个带注释的标签对象,包含标签创建者信息、日期以及可选的GPS信息和标签说明,功能更加丰富。
通过日志查看版本信息
推送本地标签到远程
从远程仓库看到push成功
推送所有没被推送过的标签
成功推送到远程仓库
删除指定的远程仓库中的标签v1.0
成功删除远程仓库中的标签v1.0
删除本地标签
全局setting下git环境指定
填写本地git.exe地址
添加自己的github账号和密码
至此,已成功集成git
成功克隆
打开右下角的git,可以看log
点击版本,可以看的到有哪些修改,右键文件,点击show diff可以查看不同.
在项目右键,点击git,可以看到很多命令可以实现多种操作
在terminal可以敲命令
本地新建分支,并切换到新建分支
idea不需要专门提交到暂存区,idea会自动进行add,点击commit即可提交
提交新版本
前面讲到dev分支拉取与文件修改推送操作,遇到一个小的问题.
在修改完git01.txt.文件后添加文件到暂存区后会将idea本地环境相关配置文件一并提交,而这些文件没有必要提交如果提交对于另外一方更新到本地后反而会影响项目运行.前面解决的方式是借助命令方式将暂存区文件转移到工作区来解决。
命令方式虽然能够解决,但操作麻烦,每次提交不可避免会遇到同样问题,这里介绍一个插件-gitignore,使用gitignore 插件可以在执行文件添加前将没有必要提交的文件让git给自动忽略掉这样开发中就只需要关注修改的文件即可,想想是不是很美!
出现冲突,左边的是master内容,右边是dev内容,中间的是最终结果
常用git语句
1进入到某项目中
cd e:
cd 文件夹
2将项目提交到git
git init
git add .
git commit -m “分支名”
https://blog.csdn.net/qq_36079972/article/details/100279562
3建立新分支
git branch newbranch
5. 检查分支是否创建成功
git branch
6. 切换到你的新分支
git checkout newbranch
6将你的改动提交到新分支上
git add .
git commit -m “newbranch”
7切换到主分支
git checkout master
8将新分支提交的改动合并到主分支上
git merge newbranch
https://blog.csdn.net/u014712086/article/details/107005216/
9fatal: remote origin already exists.解决方法
git remote rm origin
10将项目上传到云端
git remote add origin 网址
git push -u origin master