关于Git的一点思考

GIT历史

很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。

Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那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了。

版本管理工具比较

SVN与GIT的区别:
在公司工作时,往往都是多个同事同时做一个项目,每个人做个人模块的功能,代码往同一个代码库中提交,这时候就需要一个版本控制工具。
现在大多数的公司都会选择用git了,或者从svn往git去做迁移。svn和git到底有什么区别呢?本质区别就是SVN是集中式的版本管理,GIT是分布式的版本管理。
集中式版本控制:
在这里插入图片描述
分布式版本控制:
在这里插入图片描述
SVN采用这种集中式版本控制,只有一个中央仓库,成需要开发时,需要从远程仓库进行代码拉取,如果远程仓库所在的服务器宕机,或者断电,就会影响开发进度,另外SVN和GIT比,有一个明显的短板就是版本控制。而GIT采取的分布式的版本控制方式,每一个开发人员可以管理一个自己的本地仓库,在不联网时也可以不影响开发进度,不同的开发者提交代码时,会将提交记录提交到同一个分支的其他开发人员,方便分支管理。

GIT工作原理

在这里插入图片描述
解释一下Working Directory是你的工作区,stage相当于是一个暂存区,你需要将Working Directory下的文件,add到stage下,这样就可以被git管理。
用git commit提交到History,就是你的本地仓库。你可以在完全不联网的情况下完成开发任务,如果需要一个团队同时开发,这个时候就需要一个远程仓库,每个人从远程仓库上pull最新分支代码,或者把修改的代码push到远程仓库。常用的远程仓库有github,gitee,bitbucket等

GIT的安装

git的安装比较简单,无脑下一步就行了,这里就不赘述。安装完后你会看到三个git相关的可执行文件:

在这里插入图片描述
Git Bash,与Git CMD的区别是Git Bash是Linux下支持的命令,Git CMD则是Windows下支持的命令,命令会有区别,比如linux下清屏的命令是clear,而Windows下则是cls。我们常用的是Git Bash。注意Git GUI是图形化界面,不推荐初学者使用,初学者还是多使用Git Bash,多练习使用指令,达到熟练的程度。
这里说一下安装完记得要配置一下用户名和邮箱,这个是后面连接远程仓库的时候需要用到。
命令:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

远程仓库配置

比较常用的代码托管平台就是github,但是由于服务器在国外,有时比较慢,甚至打不开。这里推荐gitee,也就是码云,国内做的比较好的代码托管平台。至于bitbucket我写在这里是因为现在的公司在用,过段时间我会更新一下bitbucket的使用感受和与github/gitee的区别。

配置:
需要在Git Bash 执行

$ ssh-keygen

会在C:\Users\xuzhenyu.ssh(这是我的目录)生成一个id_rsa.pub的公钥,复制公钥到gitee/github上的ssh配置的选项下即可。
在这里插入图片描述
github/bitbuket也是同理。

GIT的常用的一些命令

使用Git前,需要先建立一个仓库(repository)。您可以使用一个已经存在的目录作为Git仓库或创建一个空目录。

使用您当前目录作为Git仓库,我们只需使它初始化。

git init
使用我们指定目录作为Git仓库。

git init newrepo
从现在开始,我们将假设您在Git仓库根目录下,除非另有说明。

添加新文件
我们有一个仓库,但什么也没有,可以使用add命令添加文件。

git add filename
可以使用add… 继续添加任务文件。

提交版本
现在我们已经添加了这些文件,我们希望它们能够真正被保存在Git仓库。

为此,我们将它们提交到仓库。

git commit -m “Adding files”
如果您不使用-m,会出现编辑器来让你写自己的注释信息。

当我们修改了很多文件,而不想每一个都add,想commit自动来提交本地修改,我们可以使用-a标识。

git commit -a -m “Changed some files”
git commit 命令的-a选项可将所有被修改或者已删除的且已经被git管理的文档提交到仓库中。

千万注意,-a不会造成新文件被提交,只能修改。

发布版本
我们先从服务器克隆一个库并上传。

git clone ssh://example.com/~/www/project.git
现在我们修改之后可以进行推送到服务器。

git push ssh://example.com/~/www/project.git
取回更新
如果您已经按上面的进行push,下面命令表示,当前分支自动与唯一一个追踪分支进行合并。

git pull
从非默认位置更新到指定的url。

git pull http://git.example.com/project.git
已经超过了五分钟?
删除
如何你想从资源库中删除文件,我们使用rm。

git rm file
分支与合并
分支在本地完成,速度快。要创建一个新的分支,我们使用branch命令。

git branch test
branch命令不会将我们带入分支,只是创建一个新分支。所以我们使用checkout命令来更改分支。

git checkout test
第一个分支,或主分支,被称为"master"。

git checkout master
对其他分支的更改不会反映在主分支上。如果想将更改提交到主分支,则需切换回master分支,然后使用合并。

git checkout master
git merge test
如果您想删除分支,我们使用-d标识。

git branch -d test

GIT分支管理

后面补充

下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
<think>好的,用户现在问的是“gitlib怎么回退代码”,看起来可能是打错了,应该是GitLab吧?之前他问过关于IntelliJ IDEA回退远程Git的问题,现在可能想了解如何在GitLab上操作代码回退。不过用户可能混淆了GitGitLab的概念,因为GitLab是一个代码托管平台,而回退代码通常是在本地Git操作后再推送到远程仓库,比如GitLab。 首先需要确认用户的需求,是要在GitLab的界面上直接回退代码,还是通过Git命令在本地操作后推送到GitLab。通常来说,回退代码主要通过Git命令,比如reset或revert,然后强制推送到远程仓库,比如GitLab上的项目。可能用户之前用过IDEA的操作,现在想换用GitLab的界面或者其他方式。 接下来需要思考如何解释清楚两者的区别。GitLab本身提供了一些界面操作,比如通过创建合并请求或者使用revert按钮,但这可能和Git的操作有所不同。用户可能不太清楚这些区别,需要明确说明。 另外,用户可能是在团队协作中遇到了需要回退代码的情况,所以需要注意强制推送的风险,提醒用户通知团队成员,避免覆盖别人的提交。之前的回答里提到了注意事项,这里也需要强调。 可能需要分步骤说明,先本地操作再推送到GitLab,类似于之前的IDEA流程,但这次使用命令行或者GitLab的界面。同时,可能需要提到GitLab的特定功能,比如Revert按钮,或者通过创建新的提交来撤销之前的更改。 还要考虑到用户可能不熟悉命令行,所以提供两种方法:命令行和GitLab界面操作。这样用户可以选择自己熟悉的方式。同时,需要强调两种方法的区别,比如revert会生成新的提交,而reset会改变历史,需要强制推送。 还需要检查是否有其他可能性,比如用户提到的“gitlib”是否是其他工具,但可能性不大,大概率是GitLab的拼写错误。因此,回答时应先确认这一点,或者直接按GitLab处理,同时指出可能的拼写错误。 总结来说,回答的结构应该是先指出可能的拼写错误,然后分两种情况:通过Git命令行操作后推送到GitLab,或者通过GitLab的界面进行操作。详细说明每个步骤,并提醒注意事项,如强制推送的风险,备份等。同时,补充一些常见问题,比如权限问题或分支保护,可能影响操作。</think>以下是 GitLab 代码回退的两种核心方法及详细操作流程: --- ### **基础概念区分** - **GitLab**:代码托管平台,回退需通过 Git 操作 + 推送至 GitLab 仓库 - **Git**:版本控制工具,实际执行回退操作 --- ### **方法1:通过 Git 命令行回退(推荐)** #### **步骤1:本地回退提交** ```bash # 查看提交历史(获取目标提交的哈希值,如 abc123) git log --oneline # 回退方式一:彻底删除后续提交(危险操作) git reset --hard abc123 # 回退方式二:生成反向提交(安全协作方案) git revert abc123..HEAD # 回滚从 abc123 到最新提交的所有变更 ``` #### **步骤2:强制推送到 GitLab** ```bash # 强制覆盖远程分支(仅限 reset 操作后使用) git push origin master --force # 替换 master 为你的分支名 # 常规推送(适用于 revert 操作) git push origin master ``` --- ### **方法2:通过 GitLab 网页端回退** #### **步骤1:使用 Revert 按钮生成反向提交** 1. 进入项目仓库 -> `Repository -> Commits` 2. 找到要撤销的提交 -> 点击 `Revert` 按钮 3. 选择目标分支 -> 确认创建合并请求(MR) #### **步骤2:通过文件历史恢复** 1. 进入目标文件 -> 点击 `History` 2. 选择要恢复的版本 -> 点击 `Revert` 3. 提交更改到新分支或当前分支 --- ### **关键注意事项** 1. **权限要求**: - 强制推送需具备 `Maintainer` 以上权限 - 受保护分支需先解除保护(`Settings -> Repository -> Protected Branches`) 2. **数据备份建议**: ```bash # 创建备份分支 git checkout -b backup_before_reset git push origin backup_before_reset ``` 3. **操作影响对比表**: | 操作类型 | 修改历史 | 适用场景 | 团队影响 | |----------|----------|---------------------------|-------------------| | `reset` | 是 | 个人分支/紧急修复 | 需全员同步 | | `revert` | 否 | 生产环境/协作开发 | 无历史冲突 | --- ### **高频问题排查** 1. **推送被拒绝**: - 确认分支未受保护 - 检查本地分支是否落后于远程 2. **文件丢失**: ```bash # 找回 reset 丢失的提交 git reflog # 查找旧提交哈希 git reset --hard <lost_commit_hash> ``` 3. **合并请求污染**: - 回退后创建新的合并请求时,建议关联原 MR 编号说明原因 --- ### **操作示意图** ```text GitLab 回退工作流: [本地操作] [GitLab 同步] git reset --hard <commit> -> git push --force 或 git revert <commit> -> git push ``` 建议优先使用 `git revert` 配合合并请求,这是 GitLab 官方推荐的安全回退方案。若需强制修改历史记录,请确保操作分支无活跃协作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值