前言
在当今的软件开发领域,高效的版本控制系统是确保团队协作顺畅、代码质量可控的关键。Git 作为一个分布式版本控制系统,凭借其强大的分支管理、协作能力和高效的性能,成为了众多开发者首选的工具。本文将深入探讨 Git 的基本概念、与传统版本控制系统的对比、常用命令以及其理论原理,帮助读者全面了解并熟练运用 Git。
一、Git简介
Git 是由 Linux 之父 Linus Torvalds 设计的分布式版本控制系统,最初是为了管理 Linux 内核开发而创建的。与传统的集中式版本控制系统(如 SVN)不同,Git 让每个开发者都拥有完整的本地仓库,可以独立地进行版本控制和提交。这种分布式的设计使得 Git 具有出色的分支管理能力和协作效率。
1.Git 与 SVN 区别点
- 1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
- 2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
- 3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
- 4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
- 5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
2.Git的介绍
Git的基本工作原理和它是如何进行版本控制的
Git的基本工作原理是通过对文件系统的快照来进行版本控制。当你提交文件时,Git并不会直接保存这些文件的变化,而是对当前的文件状态进行快照,并保存一个指向该快照的索引。这个索引类似于一个指向快照的指针,它记录了文件的状态和变化,并以此构建出文件的版本历史。这样做的好处是,Git能够非常高效地处理大量的文件和项目,同时保证了数据的完整性。
Git的分支管理有哪些特色和优点
Git的分支管理非常灵活,开发者可以轻松地创建、合并和删除分支,这为并行开发和实验性工作提供了便利。每个分支都可以独立进行开发,而不会干扰其他分支的工作,最后再将不同分支的修改合并为一个新的提交。这种分支管理方式使得团队协作更为高效,同时也降低了出错的风险。
Git在团队协作中如何提高团队的效率和协作能力
在团队协作中,Git允许每个开发者都有一份完整的本地仓库,可以独立进行版本控制和提交。这种分布式的设计使得团队成员可以在本地独立地进行开发和修改,而不需要依赖网络连接。同时,Git的分支管理功能使得团队能够轻松地进行并行开发和实验性工作,而不会相互干扰。这些特性帮助团队提高了效率和协作能力,使得团队成员可以更加灵活地进行代码管理和协作开发。
3.Git 工作流程
工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
下图展示了 Git 的工作流程:
4.Git 工作区、暂存区和版本库
基本概念:
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
下面该图展示了工作区、版本库中的暂存区和版本库之间的关系:
- 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。
- 图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
- 图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
- 当对工作区修改(或新增)的文件执行 git add 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
- 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
- 当执行** git reset HEAD** 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- 当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。
- 当执行 git checkout . 或者** git checkout -- <file>** 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动。
- 当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
二、Git安装配置
在使用Git前我们需要先安装 Git。Git 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
Git 各平台安装包下载地址为:Git - Downloads
1.Linux 平台上安装
我这里是使用Centos系统安装Git
安装命令
$ yum install curl-devel expat-devel gettext-devel \
openssl-devel zlib-devel
$ yum -y install git-core
$ git --version
git version 2.34.1
我们也可以在官网下载源码包来安装,最新源码包下载地址:Git - Downloads
解压安装下载的源码包:
$ tar -zxf git-2.34.1.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
2.Windows 平台上安装
Git官网如下(注:下载安装2.2以上的版本):
Git下载官网https://git-scm.com/downloadshttps://git-scm.com/downloads
**官网下载: **
安装步骤
三、Git 创建仓库和下载
1、首先需要注册一个gitee账号
gitee官网https://gitee.com/![](https://img-blog.csdnimg.cn/ee76470cfec349bb98315de360201183.png)
注册登录好之后,接下来我们将创建我们的码云仓库
创建我的仓库
创建成功后一定要保存一下命令信息,因为只会出现一次
2.git初始化并提交到远程仓库
首先在本地新建一个文件夹作为本地仓库用于存储,然后打开Git Bash Here终端
执行全局设置命令
git config --global user.name "孤留光乩"
git config --global user.email "12839247+superm-ctb-learning@user.noreply.gitee.com"
此时在C盘用户路径下会出现一个**.gitconfig**文件,用于git的全局配置
创建git仓库,并将这个仓库标记为git所托管的本地仓库
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以 git init 是使用 Git 的第一个命令。
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
mkdir glgj-1 ---创建本地仓库文件夹
cd glgj-1 ---进入文件夹
git init ---初始化文件夹进行全局配置
** 将文件交给git管理并上传到本地仓库**
touch README.md ---创建文件
git add README.md ---提交给git管理
git commit -m "first commit" ---上传到本地仓库
注: 在 Linux 系统中,commit 信息使用单引号 ',Windows 系统,commit 信息使用双引号 "。
所以在 git bash 中 git commit -m '提交说明' 这样是可以的,在 Windows 命令行中就要使用双引号 git commit -m "提交说明"。
提交到远程仓库并推送
git remote add origin https://gitee.com/superm-ctb-learning/glgj-1.git ---提交到远程仓库
git push -u origin "master" ---推送
文件的提交(commit)是将本地修改保存到本地仓库中的一个步骤,而推送(push)则是将本地仓库中的提交同步到远程仓库中的过程。
第一次需要输入账户密码
可以看到我们的码云仓库中存在该文件
3.另一用户下载该仓库文件
新建文件夹模拟他人,进入git终端
下载文件和代码需要先拿到仓库的URL
下载代码或文件
git clone URL ---根据仓库绑定仓库URL地址进行克隆下载
git clone 时,可以所用不同的协议,包括 ssh, git, https 等,其中最常用的是 ssh,因为速度较快,还可以配置公钥免输入密码。各种写法如下:
git clone git@github.com:fsliurujie/test.git --SSH协议
git clone git:github.com/fsliurujie/test.git --GIT协议
git clone https:github.com/fsliurujie/test.git --HTTPS协议
四、使用git代码冲突场景和解决方案
在协作开发中,经常会遇到多人对同一文件进行修改导致的代码冲突。这种情况下,Git 提供了多种解决方案来处理代码冲突。
场景: 假设有两个开发者 A 和 B 在不同的本地分支上修改了同一个文件,并尝试将它们推送到远程仓库时,就可能发生代码冲突。
解决方案: 以下是处理代码冲突的通用步骤:
1.拉取最新代码: 在开始处理冲突之前,首先从远程仓库拉取最新的代码:
git fetch origin git checkout your_branch git merge origin/your_branch
2.查找冲突: 如果在合并操作后出现了冲突,Git 会标记出冲突的部分,你可以使用如下命令来查看冲突的文件:
git status
3.手动解决冲突: 找到包含冲突的文件,手动编辑文件以解决冲突。冲突部分一般被包裹在类似以下的标记中:
<<<<<<< HEAD
// 你的修改
=======
// 别人的修改
>>>>>>> other_branch
4.标记为已解决: 当你解决完所有的冲突后,在命令行中执行以下命令标记这些文件为已解决:
git add <conflicted_file>
5.完成合并: 解决所有的冲突后,执行合并操作:
git commit -m "解决代码冲突"
** 6.推送修改:** 最后,将解决冲突后的代码推送到远程仓库:
git push origin your_branch
五、Git 基本原理和常用命令
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
1.创建仓库命令
下表列出了 git 创建仓库的命令:
命令说明
git init
初始化仓库
git clone
拷贝一份远程仓库,也就是下载一个项目。
2.提交与修改
Git 的工作就是创建和保存你的项目的快照及与之后的快照进行对比。
下表列出了有关创建与提交你的项目的快照的命令:
命令说明
git add
添加文件到暂存区
git status
查看仓库当前的状态,显示有变更的文件。
git diff
比较文件的不同,即暂存区和工作区的差异。
git commit
提交暂存区到本地仓库。
git reset
回退版本。
git rm
将文件从暂存区和工作区中删除。
git mv
移动或重命名工作区文件。
git checkout
分支切换。
git switch (Git 2.23 版本引入)
更清晰地切换分支。
git restore (Git 2.23 版本引入)
恢复或撤销文件的更改。
提交日志
命令说明
git log
查看历史提交记录
git blame
以列表形式查看指定文件的历史修改记录
远程操作
命令说明
git remote
远程仓库操作
git fetch
从远程获取代码库
git pull
下载远程代码并合并
git push
上传远程代码并合并
git commit、git push、git pull、 git fetch、git merge 的含义与区别
- git commit:是将本地修改过的文件提交到本地库中;
- git push:是将本地库中的最新信息发送给远程库;
- git pull:是从远程获取最新版本到本地,并自动merge;
- git fetch:是从远程获取最新版本到本地,不会自动merge;
- git merge:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;
$ git merge -b // 指将 b 分支合并到当前分支
git pull 相当于 git fetch + git merge。
3.Git 常用命令大全
git 常用命令:
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --global user.email "[email protected]" # 配置邮件 git config --global color.ui true # git status等命令自动着色 git config --global color.status auto git config --global color.diff auto git config --global color.branch auto git config --global color.interactive auto git config --global --unset http.proxy # remove proxy configuration on git git clone git+ssh://[email protected]/VT.git # clone远程仓库 git status # 查看当前版本状态(是否修改) git add xyz # 添加xyz文件至index git add . # 增加当前子目录下所有更改过的文件至index git commit -m 'xxx' # 提交 git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改) git commit -am 'xxx' # 将add和commit合为一步 git rm xxx # 删除index中的文件 git rm -r * # 递归删除 git log # 显示提交日志 git log -1 # 显示1行日志 -n为n行 git log -5 git log --stat # 显示提交日志及相关变动文件 git log -p -m git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容 git show dfb02 # 可只用commitid的前几位 git show HEAD # 显示HEAD提交日志 git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本 git tag # 显示已存在的tag git tag -a v2.0 -m 'xxx' # 增加v2.0的tag git show v2.0 # 显示v2.0的日志及详细内容 git log v2.0 # 显示v2.0的日志 git diff # 显示所有未添加至index的变更 git diff --cached # 显示所有已添加index但还未commit的变更 git diff HEAD^ # 比较与上一个版本的差异 git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异 git diff origin/master..master # 比较远程分支master上有本地分支master上没有的 git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容 git remote add origin git+ssh://[email protected]/VT.git # 增加远程定义(用于push/pull/fetch) git branch # 显示本地分支 git branch --contains 50089 # 显示包含提交50089的分支 git branch -a # 显示所有分支 git branch -r # 显示所有原创分支 git branch --merged # 显示所有已合并到当前分支的分支 git branch --no-merged # 显示所有未合并到当前分支的分支 git branch -m master master_copy # 本地分支改名 git checkout -b master_copy # 从当前分支创建新分支master_copy并检出 git checkout -b master master_copy # 上面的完整版 git checkout features/performance # 检出已存在的features/performance分支 git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支 git checkout v2.0 # 检出版本v2.0 git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出 git checkout -- README # 检出head版本的README文件(可用于修改错误回退) git merge origin/master # 合并远程master分支至当前分支 git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改 git push origin master # 将当前分支push到远程master分支 git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支 git push --tags # 把所有tag推送到远程仓库 git fetch # 获取所有远程分支(不更新本地分支,另需merge) git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支 git pull origin master # 获取远程分支master并merge到当前分支 git mv README README2 # 重命名文件README为README2 git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退) git rebase git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支) git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933 git ls-files # 列出git index包含的文件 git show-branch # 图示当前分支历史 git show-branch --all # 图示所有分支历史 git whatchanged # 显示提交历史对应的文件修改 git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818 git ls-tree HEAD # 内部命令:显示某个git对象 git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH git reflog # 显示所有提交,包括孤立节点 git show HEAD@{5} git show master@{yesterday} # 显示master分支昨天的状态 git log --pretty=format:'%h %s' --graph # 图示提交日志 git show HEAD~3 git show -s --pretty=raw 2be7fcb476 git stash # 暂存当前修改,将所有至为HEAD状态 git stash list # 查看所有暂存 git stash show -p stash@{0} # 参考第一次暂存 git stash apply stash@{0} # 应用第一次暂存 git grep "delete from" # 文件中搜索文本“delete from” git grep -e '#define' --and -e SORT_DIRENT git gc git fsck
版权归原作者 孤留光乩 所有, 如有侵权,请联系我们删除。