Git入门 你的名字 2022-11-10 14:12 209阅读 0赞 # Git # ## 什么是Git? ## Git是一个免费的, 开源的分布式版本控制系统,是一个工具,可以快速高效地处理丛小型到大型的项目. ## 什么是版本控制? ## 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. ## 为什么要是用版本控制系统? ## 有了它就可以将某个文件回溯到之前的状态.甚至将整个项目退回到过去某个时间点的状态.而且回溯的工作量微乎其微.你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致问题出现的原因,又是谁在何时报告了某个功能缺陷等等. ## 版本控制系统的分类 ## ### 集中化的版本控制系统 ### 诸如CVS,SVN以及Perforce等.都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过 客户端 连到这台服务器,取出最新的文件或者提交更新.多年来,这已成为版本控制系统的标准做法.每个人都可以在一定程度上看到项目中的其他人正在做什么.而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统,要比在各个客户端上维护本地数据库来的轻松容易. 集中化带来的问题就是单点故障.一旦服务器宕机,那么谁都无法提交更新也就无法协同工作. ### 分布式的版本控制系统 ### 诸如Git,BitKeeper等, 客户端并不只是提取最新版本的文件快照,而是把代码仓库完整地镜像下来. 许多这类系统都可以指定和若干不同的远端代码仓库(GitHub)进行交互. 分布式的版本控制系统在管理项目时存放的不是项目版本与版本之间的差异,它存的是索引(所需磁盘空间很少所以每个客户端都可以放下整个项目的历史记录) ## Git本地结构 ## ### 工作区 ### 写代码的地方,写的文件都存在这个地方. ### 暂存区 ### 打算要提交但还没提交的,可以将暂存区的文件提交到本地库或者撤回 ### 本地库 ### 每个历史版本的信息. ### 相关的命令 ### 1. git add : 将工作区的文件提交到暂存区 2. git commit : 将暂存区的文件提交到本地库 ## 代码托管中心 ## ### 是什么? ### ### 有什么用? ### 目的是用来维护远程库. ### 本地库和远程库如何交互 ### 分为两种 1. 团队内部协作 2. 跨团队协作 ### 代码托管中心 ### 局域网环境下: 可以搭建GitLab服务器作为代码托管中心,GitLab可以自己去搭建. 外网环境下: 可以由GitHub或者Gitee作为代码托管中心,GitHub或者Gitee是现成的托管中心,不用自己去搭建. ## 初始化本地仓库 ## 1. 创建一个文件(作为本地仓库) 2. 打开Git终端(Git Bash Here) 3. clear命令: 清屏 4. 设置签名(用户名和邮箱) git config --global user.name "xr" git config --global user.email "1@qq.com" 1. 本地仓库初始化 //先进入到目标文件夹 cd d:/GitResp //执行初始化 git init //执行结果:生成一个隐藏文件.git //Initialized empty Git repository in D:/GitResp/.git/ //进入.git目录,查看包含的文件信息 cd .git/ ls -l //执行结果 total 7 -rw-r--r-- 1 99498 197609 23 Mar 17 20:11 HEAD -rw-r--r-- 1 99498 197609 130 Mar 17 20:11 config -rw-r--r-- 1 99498 197609 73 Mar 17 20:11 description drwxr-xr-x 1 99498 197609 0 Mar 17 20:11 hooks/ drwxr-xr-x 1 99498 197609 0 Mar 17 20:11 info/ drwxr-xr-x 1 99498 197609 0 Mar 17 20:11 objects/ drwxr-xr-x 1 99498 197609 0 Mar 17 20:11 refs/ \*\*注意 : \*\* .git目录下的本地库先关的子目录和子文件不要随便修改和删除. ## 常用命令 add 和 commit ## 1. 在GitResp目录下创建Demo.txt文件. 2. 将工作区的文件添加到暂存区 git add Demo.txt 1. 将暂存区的文件添加到本地库 //-m表示message ,用来添加注释,即后面双引号内的内容.表示对提交文件的一个注释. git commit -m "这是我提交的第一个文件" Demo.txt \*\*注意 : \*\* 不放在本地仓库中的文件,git是不进行管理的.即使放在本地仓库的文件,git也不会自动管理.必须通过命令操作才可以将本地仓库的文件添加到本地库. ## 常用命令status ## 用来查看本地仓库的的状态 git status 创建一个Demo2.txt(不进行其他操作) git status //执行结果 On branch master Untracked files: (use "git add <file>..." to include in what will be committed) Demo2.txt nothing added to commit but untracked files present (use "git add" to track) 然后将Demo2.txt添加到暂存区 git add Demo.txt 再查看状态 git status //执行结果 On branch master Changes to be committed: (use "git restore --staged <file>..." to unstage) new file: Demo2.txt 将Demo2.txt提交至本地库 git commit -m "我提交的第二个文件" Demo2.txt //执行结果 [master b70164f] 这是我提交的第二个文件 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Demo2.txt 修改Demo2.txt的内容 再查看状态 git status //执行结果 On branch master Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git restore <file>..." to discard changes in working directory) modified: Demo2.txt no changes added to commit (use "git add" and/or "git commit -a") 重新添加至暂存区 再提交到本地库 ## 常用命令log ## git log //执行结果 commit f6ccb49b3ada6858186a8c90cf5226cb275e0dc5 (HEAD -> master) //commit后面的十六进制串代表当前历史记录的索引 Author: lancoff <994984749@qq.com> //索引对应的值为"历史记录对应的具体内容" Date: Wed Mar 17 20:44:20 2021 +0800 修改了Demo2.txt commit b70164f37fe28830330c94f0286aa847f4843c85 Author: lancoff <994984749@qq.com> Date: Wed Mar 17 20:39:26 2021 +0800 这是我提交的第二个文件 commit f53e46fb4c0bb9723ae30c556182c9deea8fa155 Author: lancoff <994984749@qq.com> Date: Wed Mar 17 20:26:18 2021 +0800 这是我提交的第一个文件 当历史记录较多的时候,log命令的执行结果会进行分页显示. 按b回退,空格翻页,q退出 ### 其他日志展示方式 ### git log --pretty=oneline //执行结果 f6ccb49b3ada6858186a8c90cf5226cb275e0dc5 (HEAD -> master) 修改了Demo2.txt b70164f37fe28830330c94f0286aa847f4843c85 这是我提交的第二个文件 f53e46fb4c0bb9723ae30c556182c9deea8fa155 这是我提交的第一个文件 git log --oneline //执行结果 f6ccb49 (HEAD -> master) 修改了Demo2.txt b70164f 这是我提交的第二个文件 f53e46f 这是我提交的第一个文件 git reflog //执行结果 f6ccb49 (HEAD -> master) HEAD@{0}: commit: 修改了Demo2.txt b70164f HEAD@{1}: commit: 这是我提交的第二个文件 //HEAD@{x}:表示如果要回退到这个版本需要几步 f53e46f HEAD@{2}: commit (initial): 这是我提交的第一个文件 ## reset命令 ## 可以前进或后退历史版本 $ git reflog 1ba51d5 (HEAD -> master) HEAD@{0}: commit: 我修改了Test ca323d4 HEAD@{1}: commit: 我创建了Test f6ccb49 HEAD@{2}: commit: 修改了Demo2.txt b70164f HEAD@{3}: commit: 这是我提交的第二个文件 f53e46f HEAD@{4}: commit (initial): 这是我提交的第一个文件 //回退到ca323d4 git reset --hard ca323d4 //前进到1ba51d5 git reset --hard 1ba51d5 \*\*注意 : \*\* 在git终端里, 选中就算赋值 1. hard参数 本地库指针移动的同时,同步重置工作区和暂存区 2. mixed 重置暂存区,但不改变工作区的内容 3. soft 暂存区和工作区都不做改动. 实际开发中:一般只用`--hard`参数 ## 删除文件,找回本地库删除的文件 ## 1. 新建Test2.txt 2. 将其添加到本地库中 3. 删除工作区的Test2.txt rm Test.txt 1. 将删除操作同步到暂存区和本地库 //注意下删除同步到暂存和本地的命令. $ git add Test2.txt $ git commit -m "删除Test2.txt" Test2.txt [master c8ce563] 删除Test2.txt 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 Test2.txt 查看日志 git reflog 找回本地库删除的文件:实际上就是回退到历史版本. git reset --hard 704ca0a ## 找回暂存区删除的文件 ## 1. 删除工作区的数据 rm Test.txt 1. 同步到缓存区 git add Test2.txt 1. 后悔了,回复暂存区中的数据.(实际上和上一个案例一样,回退到历史版本) git reset --hard 704ca0a //其实也可以执行 git reset --hard HEAD // 前提是HEAD已经指向了目标版本 ## diff ## ### 单个文件的比对 ### 1. 增加Test3.txt的内容,并将其从工作区添加到暂存区,再提交到本地库 2. 在Test3.txt再次添加内容,导致工作区和暂存区不一致,如果不知道两个区的文件信息的区别,则需要进行比对 3. 执行diff命令 $ git diff Test3.txt diff --git a/Test3.txt b/Test3.txt index 04da025..049f09e 100644 --- a/Test3.txt +++ b/Test3.txt @@ -2,5 +2,6 @@ using namespace std; int main() { + cout << "Hello Git" << endl; return 0; } \ No newline at end of file //git是按照行为单位来管理数据的, 所以删除一行添加一行 总结: git diff \[文件名\] ->用来比较工作区和暂存区的单个文件差异 ### 多个文件的比对 ### 1. 两个文件(Test2和Test3)都发生内容的修改,但不添加到暂存区, 此时,工作区的两个文件都和暂存区的文件不一样. 2. 执行diff命令,但不加文件名参数 $ git diff diff --git a/Test2.txt b/Test2.txt index e69de29..7c4a013 100644 --- a/Test2.txt +++ b/Test2.txt @@ -0,0 +1 @@ +aaa \ No newline at end of file diff --git a/Test3.txt b/Test3.txt index 049f09e..5d4e9ef 100644 --- a/Test3.txt +++ b/Test3.txt @@ -2,6 +2,6 @@ using namespace std; int main() { - cout << "Hello Git" << endl; + cout << "修改了输出内容" << endl; return 0; } \ No newline at end of file 总结: git diff 比较工作区中和暂存区中所有文件的差异 ### 暂存区和本地库的文件比较 ### 1. 将Test3.txt提交到暂存区,此时,工作区和暂存区同步了,但是暂存区和本地库还没有同步 2. 执行diff命令 $ git diff HEAD Test3.txt //注意这里的参数,HEAD是指向当前版本的指针. diff --git a/Test3.txt b/Test3.txt index 049f09e..5d4e9ef 100644 --- a/Test3.txt +++ b/Test3.txt @@ -2,6 +2,6 @@ using namespace std; int main() { - cout << "Hello Git" << endl; + cout << "修改了输出内容" << endl; return 0; } \ No newline at end of file 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master) $ git commit -m "insert Test3.txt" Test3.txt [master 1d104cb] insert Test3.txt 1 file changed, 1 insertion(+), 1 deletion(-) 1. 暂存区和其他版本进行比较 $ git diff 63b042c Test3.txt //指定版本索引 diff --git a/Test3.txt b/Test3.txt index 049f09e..7284ab4 100644 --- a/Test3.txt +++ b/Test3.txt @@ -1,7 +1 @@ -#include <iostream> -using namespace std; - -int main() { - cout << "Hello Git" << endl; - return 0; -} \ No newline at end of file +aaaa \ No newline at end of file ## 分支 ## ### 什么是分支? ### 在版本控制过程中,使用多条线同时推进多个任务.这里面说的多条线就是多个分支. ### 分支的好处 ### 同时多个分支可以并行开发,互相不耽误,互相不影响,提高开发效率 如果有一个分支功能开发失效,直接删除这个分支就可以了,不会对其他分支产生任何影响. ## 查看分支,创建分支,切换分支 ## ### 查看分支 ### $ git branch -v * master dc263a2 修改了Test2的内容 //当前只有一个主分支master ### 创建分支 ### 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master) $ git branch branch01 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master) $ git branch --v branch01 dc263a2 修改了Test2的内容 * master dc263a2 修改了Test2的内容 //你在哪个分支,是通过 * 来显示的 ### 切换分支 ### $ git checkout branch01 Switched to branch 'branch01' ## 冲突问题以及如何解决冲突 ## 什么时候出现冲突? 在同一个文件的同一个位置修改内容 1. 在branch01 下修改Test4.txt的内容 2. 并将文件同步到本地库 3. 将分支切换到master() 4. 修改Test4.txt 5. 同步到本地库 6. 再次切换到branch01分支,查看Test4.txt 总结:各分支的开发内容互不影响. 把两分支合并到master 1. 切换到master 2. 将branch01的内容和主分支内容进行合并 $ git merge branch01 Auto-merging Test4.txt CONFLICT (content): Merge conflict in Test4.txt //有冲突 Automatic merge failed; fix conflicts and then commit the result. 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master|MERGING) //MERGING表示处在冲突中 $ 1. 解决冲突:公司内部商议解决,人为决定留下想要的. 2. 利用add, commit解决冲突 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master|MERGING) $ git add Test4.txt 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master|MERGING) //现在仍处于合并状态中 $ git status On branch master All conflicts fixed but you are still merging. //冲突问题解决 (use "git commit" to conclude merge) Changes to be committed: modified: Test4.txt \*\*注意 \*\* 冲突发生后,commit 操作不能带文件名,否则会发生错误 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master|MERGING) $ git commit -m "解决Test4文件冲突" Test4.txt fatal: cannot do a partial commit during a merge. //报错并且仍处于合并状态 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master|MERGING) $ git commit -m "解决Test4文件冲突" [master dc02c0e] 解决Test4文件冲突 99498@DESKTOP-A4INPR0 MINGW64 /d/GitResp (master) //解决了冲突,退出了合并状态
相关 git入门 前言:在公司实习会使用git,总结一下使用git的学习过程与遇到的问题。 参考:[https://blog.csdn.net/u010059669/article/detai 男娘i/ 2023年08月17日 17:28/ 0 赞/ 135 阅读
相关 Git入门 Git 什么是Git? Git是一个免费的, 开源的分布式版本控制系统,是一个工具,可以快速高效地处理丛小型到大型的项目. 什么是版本控制? 版本控制是一种 你的名字/ 2022年11月10日 14:12/ 0 赞/ 210 阅读
相关 git入门 git 入门教程 Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。 Git有什么特点?简单来说就是:高端大气上档次! 版本库 什么是 妖狐艹你老母/ 2022年10月01日 04:44/ 0 赞/ 193 阅读
相关 git 入门 Git 全局设置: git config --global user.name "test" git config --global user.email " 不念不忘少年蓝@/ 2022年06月17日 04:44/ 0 赞/ 278 阅读
相关 Git入门 `git`是一个优秀的分布式版本控制系统,支持跨网络的软件本本控制; 版本库: 通常来说是一个目录,在这个目录里面包含的文件都是可以被`git`管理起来的, 朱雀/ 2022年05月19日 14:34/ 0 赞/ 276 阅读
相关 Git入门 Git > 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 Git配置用户 > git config --global user.na Dear 丶/ 2022年04月24日 16:12/ 0 赞/ 247 阅读
相关 Git入门 Git常用命令: 首先设置 git config --global [user.name][] “你的用户名” git config --global user.e 小灰灰/ 2022年04月05日 11:52/ 0 赞/ 278 阅读
相关 git 入门 git入门 一、下载安装 1. git官网地址[Git - Downloads][] 二、提交仓库 1. 用户配置 $ git config 快来打我*/ 2022年04月01日 05:15/ 0 赞/ 256 阅读
相关 Git 入门教程 点击上方蓝色字体,选择“置顶公众号” 优质文章,第一时间送达 ![640?wx\_fmt=jpeg][640_wx_fmt_jpeg] 作者 | gafish 链接 | 以你之姓@/ 2021年08月19日 19:20/ 0 赞/ 648 阅读
相关 Git入门 下载与安装 1. 首先,在本机安装Git, 官方下载网站:https://git-scm.com/downloads; 2. 安装完成后,配置Git环境变量, 计算机 朴灿烈づ我的快乐病毒、/ 2021年06月10日 20:40/ 0 赞/ 472 阅读
还没有评论,来说两句吧...