Git的使用

本文详细介绍了Git的诞生背景、工作原理、常用操作以及分支管理策略。Git作为分布式版本控制系统,解决了集中式版本控制的联网限制,提供自动记录改动、协作等功能。文章还涵盖了Git的安装、配置、文件目录结构,以及如何处理冲突、管理分支。通过实例展示了如何创建、合并分支,以及如何与远程仓库交互。同时,解答了关于Git操作的常见问题,如如何删除已提交文件、如何避免冲突等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

git简介

git诞生背景
Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那d但是linux的代码管理方式是

在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!

为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。

安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。

Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
集中式和分布式版本控制的区别

集中式版本控制系统

central-repo

集中式版本控制系统,版本库是集中存放在中央服务器的,干活的时候用自己的电脑从中央服务器获取最新的版本,然后开始干活,干完活再把自己写完的代码提交到中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆把书借出来,然后回到家改,改完了再放回图书馆。(统一管理的思想)

集中式版本控制系统的缺点:

必须联网才能工作,网速成为了限制条件。

distributed-repo

分布式版本控制系统

分布式版本控制系统是每个人的电脑上都有一个完整的版本库,某个人的电脑坏了,可以随便从其他人那里拷贝一个完整的。(解耦合的思想,每个人都有完整的代码库 然后开始写,写完之后推送到自己的完整代码库上,但是之间同步也不能随便A和B进行同步(不规范),也是需要一个进行合并代码的机器)

相比于集中式版本系统来说 分布式版本控制解决了"管理代码同步"的机器不再是必须的了 不会成为限制条件。

git的作用

1、自动记录每次的改动(在基础代码上修改了那些代码,增量方式代码合并)

2、同事之间协作

git工作原理
本地工作目录 代表   工作区
add操作     代表   暂存区
commit     代表   版本库
push       代表   远程仓库

版本库:可以理解为一个目录,这个目录里面所有的文件都会被git管理起来,每个文件的修改、删除、git都能跟踪,以便任何时刻进行’‘回退历史’’

git可以跟踪文件的修改(支持文本文件、网页、TXT、程序代码等 ;不支持图片、视频等二进制文件的跟踪)

工作区和暂存区

工作区:本地的存放代码的目录 (执行了git init的目录)

版本库:隐藏目录.git就是版本库(暂存区就在版本库中)

暂存区:git add的操作就是将文件存放在暂存区,git commit就是将暂存区的所有内容提交到版本库

分支(远程仓库):将版本库中代码push操作推送到分支

主要是搞清楚工作区和暂存区的概念

本地文件没有git add ----->则就是没有提交到暂存区
本地文件 git add操作后 ------> 就是提交到了暂存区
暂存区文件 commit 操作后  ----> 就是提交到了版本库
版本库 push 操作后  ------> 就是推送到了远程仓库
安装git
#centos:

yum install -y git
git的help命令
   add        将文件内容添加到索引中
   bisect     通过二进制搜索查找引入错误的更改
   branch     列出、创建或删除分支
   checkout   签出到工作树的分支或路径
   clone      将存储库克隆到新目录中
   commit     记录对存储库的更改
   diff       显示提交、提交和工作树等之间的更改
   fetch      从另一个存储库下载对象和引用
   grep       打印与图案匹配的线条
   init       创建一个空的Git存储库或重新初始化现有的Git存储库
   log        显示提交日志
   merge      将两个或多个开发历史记录连接在一起
   mv         移动或重命名文件、目录或符号链接
   pull       从另一个存储库或本地分支获取并与之合并
   push       与关联对象一起更新远程参照
   rebase     转发端口本地提交到更新的上游头
   reset      将当前磁头重置为指定状态
   rm         从工作树和索引中删除文件
   show       显示各种类型的对象
   status     显示工作树状态
   tag        创建、列出、删除或验证使用GPG签名的标记对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rl0x44Qz-1629445873688)(C:\Users\shiya.liu\AppData\Roaming\Typora\typora-user-images\image-20210819170055146.png)]

git配置文件
#因为暂时没有找到比较好的关于介绍config的博客 config的官方手册又有很多的内容,暂时先把获取方式记录。
git help config
git文件目录结构
branches目录:一种不常用的存储速记方式,用于指定git fetch|git pull|git push 的URL ,目前已基本不用
COMMIT_EDITMSG文件:把大写变成小写就容易理解了,commit_editmsg :commit 编辑信息,仅记录最近一次提交的 commit 编辑信息
config:存储当前仓库的配置信息 
git 的配置文件分为三层,分别是:
/etc/gitconfig 文件:系统上每一个用户及他们仓库的通用配置;
~/.gitconfig 或 ~/.config/git/config 文件:当前用户的仓库配置;
.git/config 文件(当前仓库下):当前用户当前仓库的配置;

description:用于在 GitWeb 中展示项目的描述信息。默认内容为:Unnamed repository; edit this file 'description' to name the repository.

FETCH_HEAD
HEAD文件:存储 HEAD 指针,指向当前分支,即:记录当前活动分支
hooks目录:
目录下存储了许多钩子文件(一些脚本),这些文件是各种 Git 命令使用的自定义脚本,可以在Git 特定阶段自动执行,例如:提交 (commit)、变基 (rebase)、拉取 ( pull ) 操作的前后执行。运行 git init 时会安装一些示例钩子,但是默认情况下它们都被禁用。如果要启用,需要删除文件.sample后缀。

index:暂存区(stage),二进制文件
info目录:存储库的其他信息将记录在此目录中
logs:保存所有更新的引用记录。
objects目录:类似于git的键值存储数据库
ORIG_HEAD:
packed-refs
refs
借鉴于其他博客 详细了解与此<https://blog.csdn.net/nyist_zxp/article/details/109406589> 

git使用

免密使用http的方式clone&&push

[user]
        email = shiya@example.com
        name = shiya
[credential]
        helper = store
注意:配置完成后的第一次还是需要进行输入密码登录的
以后的每一次都不需要再输入密码了
git常用操作
git init #初始化版本库(本地某个目录)
git add dir/file #添加本地文件到暂存区
git commit #提交暂存区到
git status #查看本地文件和暂存区文件的状态
git diff #比较本地文件和暂存区文件内容
git log #记录git commit提交的文件
git log --pretty=oneline #输出每个提交版本的commit的id以及变更内容
git reset --hard +(commit) #进行回退版本
git reflog #获取每次操作的commit的id
git reset file #可以将git add提交到缓存区的文件给撤销
git checkout --  file  #丢弃工作区做的修改(返回工作区 但是不能返回到某一时刻工作区的修改 只能在工作区错误的基础上进行修改 然后重新提交) git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
git rm filename #删除版本库的文件
rm -rf filename,结合git commit&& git push 实现删除远程仓库的文件
git remote add origin git@server-name:path/repo-name.git #关联一个仓库
git push -u origin master #关联后使用此命令,第一次推送master分支的所有内容
git push origin master #以后便使用此命令推送最新修改
git clone #命令进行克隆

创建分支、切换分支、合并分支、删除分支
git checkout -b dev #创建并切换·分支
git branch dev #创建分支
git checkout dev #切换分支
git branch #查看当前分支 (当前分支上会有一个*进行标识)
git checkout master && git merge dev #切换到master分支并进行合并dev的分支
git branch -d dev #删除dev分支
git switch -c dev

git merge --no-ff -m "merge with no-ff" dev #合并分支时加上 --no-ff参数 表示禁用fast forward 代表以普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出曾经做过合并。

git branch -D <name> #删除一个没有被合并过的分支,可以使用git branch -D 分支名 进行强制删除
git remote #查看远程仓库信息 origin是默认的远程仓库名
git remote -v #查看抓取和推送的origin地址,如果没有推送的权限就看不到push的地址

git pull #从远程抓取分支 获取最新的文件
连接远程仓库
使用账户密码的方式拉取代码
#用户名 密码  Administrator  12345678
#项目地址  http://Administrator:12345678@10.0.0.6/root/shell.git
git clone  http://Administrator:12345678@10.0.0.6/root/shell.git

设置key
ssh-keygen -t rsa -C "admin@example.com"
Git 全局设置
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"

创建一个新仓库
git clone git@10.0.0.6:root/test.git
cd test
git switch -c main
touch README.md
git add README.md
git commit -m "add README"
git push -u origin main

推送现有文件夹
cd existing_folder
git init --initial-branch=main
git remote add origin git@10.0.0.6:root/test.git
git add .
git commit -m "Initial commit"
git push -u origin main

推送现有的 Git 仓库
cd existing_repo
git remote rename origin old-origin
git remote add origin git@10.0.0.6:root/test.git
git push -u origin --all
git push -u origin --tags

git rebase  #此操作可以把本地未push的分叉提交历史整理成直线  rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比
git tag v1.0 #给当前分支打tag
git tag  v1.0 commit-id #给历史提交打tag
git tag -d v1.0 #删除tag标签

git push origin <tagname> #可以推送一个本地标签;
git push origin --tags  #可以推送全部未推送过的本地标签;
git tag -d <tagname>  #可以删除一个本地标签;
git push origin :refs/tags/<tagname>  #可以删除一个远程标签。
分支的作用

没写完成的代码进行推送会导致 不完整的代码库 影响工作

如果等写完再一次推送 会有代码丢失的风险

(不是可以commit到版本库吗? 应该不会丢失才对呀)

创建分支和与合并分支

原本master分支为当前分支的实质: 指针指向master节点 head指向master 如下图

git-br-initial

创建分支的实质:是将 head指向新创建的分支(整个的一条线仍然是向前走的)

git-br-dev-fd

合并分支就是将master向前走 走到dev分支的节点,并且将head指向为master,就完成了代码分支的合并

git-br-ff-merge

分支策略

在实际开发中遵循这几个基本原则进行分支管理

master: 最稳定的分支

dev :日常开发,不稳定

发布版本时 再将dev分支合并到master分支上,在master分支发布1.0版本

每个小伙伴都在dev分支上干活,每个人都有自己的分支,时不时的往dev分支上合并就可以了。

问题记录

Q:有没有暂存区和版本库的对比 内容对比 或者是提交到了分支 进行修改 撤回的操作
A:对于已经commit的版本库进行的操作  可以是reset进行回滚到工作区 再从工作区进行操作 add 暂存区 再commit到版本库进行一个修改。
Q:对于已经提交到版本库的文件,怎么进行删除?可以恢复的那种 只是不可以去看 就不会展示到版本库里。
A:
git rm 
git commit
可以对已经提交到版本库的文件进行删除
Q:怎么彻底删除误提交到分支的文件,不可恢复的那种?
Q:切换分支并推送到远程仓库是怎么操作的?
git checkout dev
git push origin dev
Q:git从gitlab拉取代码,为什么设置了密钥 还要输入密码 并且密码提示不正确
A:使用ssh的方法clone的代码这样 需要使用HTTP的方式clone 就不会这样了
Q:怎么使用ssh的方式clone代码,push代码到远程仓库而不需要密码呢?

Q:使用http的方式结合账户密码拉取代码需要设置项目为公开的才行?
A:不是,只要在项目组就可以 有权限就可以
Q:使用ssk密钥 还提示输入密码 就很奇怪
A:因为被官网给坑了
当你新创建一个项目时 他会给出你一个操作远程连接的页面,页面给出的登录用户是dmin
但是正确的登录账户不是admin 而是root 所以设置config时应该是root
git config --global user.name "root"
git config --global user.email "root@example.com"
Q:设置的时sshkey的密钥方式 但是克隆时需要用http的方式,那么ssh的方式是怎么使用的?
Q:怎么利用gitlab进行分发主机密钥 实现ssh免密登录机器
Q:当我误删除了一些文件并push到了远程仓库,在工作区可以使用reset的方式恢复到误删除之前的状态,但是此时再把工作区恢复的文件 push到远程仓库时却push不过去,导致远程仓库还是误删除文件的状态。怎么解决这种情况?
Q:创建和合并分支好像是在 工作区和暂存区以及版本库阶段进行实现的 如果我想在远程仓库进行创建新的分支并提交 需要怎么操作?
Q:git switch命令没有在git命令中发现 怀疑是版本问题


Q:bug分支 章节没有看懂 <https://www.liaoxuefeng.com/wiki/896043488029600/900388704535136>
git stash
git stash list
git stash apply
git stash drop
git stash pop
git cherry-pick <commit>
Q:解决冲突章节 没有学会 <https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344>
没理解 
学习方法如下
冲突是怎么产生的 
什么情况下容易产生冲突 
怎么解决的?
什么叫手动解决冲突:手动解决冲突就是将先我提交的代码给pull下来 如果还是提交时提示冲突 就需要手动对比我pull下来的代码 和我的代码进行手动对比 然后手动修改不一致的地方 然后再提交。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值