从零开始一个git操作实例,图文并茂
wptr33 2024-11-10 13:15 30 浏览
徒弟不懂git怎么用,
于是写了篇文章,
把本地git操作从头写了一遍,
自己去看吧!
0、基本概念
?Git是一个免费、开源的、分布式版本控制系统
?它使用一个特殊的叫做仓库的数据库来记录文件的变化
?仓库中的每个文件都有一个完整的版本历史记录
1)安装
sudo apt-update
sudo apt-get install git
git --version
2)工作流转
Git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库。
你的本地仓库由 git 维护的三棵"树"组成。
- 工作目录:它持有实际文件;
- 暂存区(Index):它像个缓存区域,临时保存你的改动;
- 本地仓库(Respository):可以把本地仓库理解成一个目录,这个目录中所有的文件都可以被Git管理起来每个文件的删除、修改、新增操作都可以被Git跟踪到以便任何时候,都可以追踪历史或者还原到之前的某一个版本HEAD,它指向你最后一次提交的结果。
3)文件3种状态
对于任何一个文件,在 Git 内都只有三种状态:已修改(modified),已暂存(staged)和已提交(committed)。
- 已修改表示修改了某个文件,但还没有提交保存;
- 已暂存表示把已修改的文件放在下次提交时要保存的清单中; add
- 已提交表示该文件已经被安全地保存在本地数据库中了。commit
一、创建仓库并提交第1个commit
步骤1-4流程,参考下图流程会更清晰一些
1、创建仓库
使用当前目录作为Git仓库,我们只需使它初始化。
git init
该命令执行完后会在当前目录生成一个 .git 目录。
2、新建本地文件
本地增加文件url.c、README.md
实用git status查看文件状态,红色部分,有2个未跟踪的在文件
3、提交文件到暂存区git add
你可以提出更改(把它们添加到暂存区),使用如下命令:
git add <filename>
git add . //添加所有文件
git add *.c //添加所有c文件
执行下面操作:
git add *.c
git add README.md
4、提交改动git commit
使用如下命令以实际提交改动:
git commit -m "代码提交信息"
或者
git commit
然后进入vim编辑器,添加提交信息
例如:
git commit -m '初始化项目版本'
以上命令将目录下以 .c 结尾及 README 文件提交到仓库中。
现在,刚才的改动已经提交到了 HEAD,但是还没到远端仓库。
可以使用git log查看所有的提交:
5、推送改动git push
刚才的改动现在已经在本地仓库的 HEAD 中了。
执行如下命令以将这些改动提交到远端仓库:
git push origin master
可以把 master 换成你想要推送的任何分支。
如果你还没有克隆现有仓库,并欲将你的仓库连接到某个远程服务器,你可以使用如下命令添加:
git remote add origin <server>
如此你就能够将你的改动推送到所添加的服务器上去了。
三、 分支操作
分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是"默认的"分支。
在其他分支上进行开发,完成后再将它们合并到主分支上。
0)查看分支
列出分支基本命令:
git branch
没有参数时,git branch 会列出你在本地的分支。
此例的意思就是,我们有一个叫做 master 的分支,并且该分支是当前分支。 执行 git init 的时候,默认情况下 Git 就会为你创建 master 分支。 分支在本地完成,速度快。
1)创建分支
要创建一个新的分支,我们使用branch命令。
git branch test
由上图所示:
- 多了一个分支test
- 当前分支为主分支master,前面*表示活动分支
2)切换分支
branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。
git checkout test
创建一个叫做"test"的分支,并切换过去:
git checkout -b test
如上图所示:
- 分支test前面有*,所以当前活动分支为master
分支创建和切换参考下图:
3)切回master分支并合并
在分支test上,修改文件url.c,然后commit
切换回主分支并合并
git checkout master
git merge test
由上图所示,git merge test后,主分支多了一个新的commit b9217
注意:
对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。
4)删除分支
使用-d标识,把新建的分支删掉:
git branch -d test
git branch -D test
如上图,我们删除了分支test
5)上传分支push
除非你将分支推送到远端仓库,不然该分支就是 不为他人所见的:
git push origin <branch>
四、替换本地改动git checkout
假如操作失误可以使用如下命令替换掉本地改动:
git checkout -- <filename>
此命令会使用 HEAD 中的最新内容替换掉你的工作目录中的文件。
已添加到暂存区的改动以及新文件都不会受到影响。
- 步骤
修改文件url.c,增加信息
//this change will be delete by git checkout
然后再git checkout url.c
如上图所示,
执行下面命令后:
git checkout url.c
url.c修改的信息
//this change will be delete by git checkout
已经被删除了,此时工作区域文件还原到了commitb 9217状态
查看url.c:
假如你想丢弃你在本地的所有改动与提交,可以到服务器上获取最新的版本历史,并将你本地主分支指向它:
git fetch origin
git reset --hard origin/master
五、重置git reset
当我们不想要之前提交的修改时,就会用到这个命令。也许这是一个 错误的提交或者可能是引入了 bug 的提交,这时候就要执行 git reset。
git reset 能让我们不再使用当前台面上的文件,让我们可以控制 HEAD 应该指向的位置。
1)软重置
软重置会将 HEAD 移至指定的提交(或与 HEAD 相比的提交的索引),而不会移除该提交之后加入的修改!
输入 git status 后,你会看到我们仍然可以访问在之前的提交上做过的所有修改。
这意味着我们可以修复这些文件的内容,之后再重新提交它们!
2)硬重置
有时候我们并不想保留特定提交引入的修改。不同于软重置,我们应该再也无需访问它们。
Git 应该直接将整体状态直接重置到特定提交之前的状态:这甚至包括你在工作目录中和暂存文件上的修改。
我们重新add并commit,然后硬重置
可见我们所有提交的信息都已经被移除,
工作区域文件恢复到commit 7bb299状态。
打开文件,查看,添加信息已经不存在,
六、还原git revert
另一种撤销修改的方法是执行 git revert。
通过对特定的提交执行还原操作,我们会创建一个包含已还原修改的新提交。
新创建文件peng.c并提交
用git revert 撤销修改
由上图所示,执行git revert 209485之后,我们新增的文件peng.c被删除,并提交了1个新的commit 5b08d
此前添加peng.c文件的提交还在,这样就保留了该提交信息,提高了仓库的兼容性。
在撤销特定的提交时,git revert 非常有用,同时也不会修改分支的历史。
七、拣选git cherry-pick
当一个特定分支包含我们的活动分支需要的某个提交时,我们对那个提交执行 cherry-pick!
对一个提交执行 cherry-pick 时,我们会在活动分支上创建一个新的提交,其中包含由拣选出来的提交所引入的修改。
创建切换到cherry分支,
git branch cherry
git checkout cherry
在分支cherry上修改文件README.md提交几个节点
切回master分支
git checkout master
执行git cherry-pick b98fc77
由上图所示,分支cherry的commit b98fc77,被复制到分支master,并创建了1个新的提交2d995,
通过该命令我们就可以将其他分支,需要的提交,合并到主分支master。
相关推荐
- Linux文件系统操作常用命令(linux文件内容操作命令)
-
在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...
- 别小看tail 命令,它难倒了技术总监
-
我把自己以往的文章汇总成为了Github,欢迎各位大佬star...
- lnav:基于 Linux 的高级控制台日志文件查看器
-
lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...
- 声明式与命令式代码(声明模式和命令模式)
-
编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...
- linux中的常用命令(linux常用命令和作用)
-
linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...
- 提高工作效率的--Linux常用命令,能够决解95%以上的问题
-
点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...
- 如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)
-
这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...
- 最通俗易懂的命令模式讲解(命令模式百科)
-
我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...
- 互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?
-
你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...
- Linux 常用命令(linux常用的20个命令面试)
-
日志排查类操作命令...
- Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)
-
if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...
- 外贸干货|如何增加领英的曝光量和询盘
-
#跨境电商#...
- golang执行linux命令(golang调用shell脚本)
-
需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...
- LINUX磁盘挂载(linux磁盘挂载到windows)
-
1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...
- Linux命令学习——nl命令(linux ln命令的使用)
-
nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)