赞
踩
目录
git commit、git push、git pull、 git fetch、git merge 的含义与区别
在当今的软件开发领域,高效的版本控制系统是确保团队协作顺畅、代码质量可控的关键。Git 作为一个分布式版本控制系统,凭借其强大的分支管理、协作能力和高效的性能,成为了众多开发者首选的工具。本文将深入探讨 Git 的基本概念、与传统版本控制系统的对比、常用命令以及其理论原理,帮助读者全面了解并熟练运用 Git。
Git 是由 Linux 之父 Linus Torvalds 设计的分布式版本控制系统,最初是为了管理 Linux 内核开发而创建的。与传统的集中式版本控制系统(如 SVN)不同,Git 让每个开发者都拥有完整的本地仓库,可以独立地进行版本控制和提交。这种分布式的设计使得 Git 具有出色的分支管理能力和协作效率。
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 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git的基本工作原理和它是如何进行版本控制的
Git的基本工作原理是通过对文件系统的快照来进行版本控制。当你提交文件时,Git并不会直接保存这些文件的变化,而是对当前的文件状态进行快照,并保存一个指向该快照的索引。这个索引类似于一个指向快照的指针,它记录了文件的状态和变化,并以此构建出文件的版本历史。这样做的好处是,Git能够非常高效地处理大量的文件和项目,同时保证了数据的完整性。
Git的分支管理有哪些特色和优点
Git的分支管理非常灵活,开发者可以轻松地创建、合并和删除分支,这为并行开发和实验性工作提供了便利。每个分支都可以独立进行开发,而不会干扰其他分支的工作,最后再将不同分支的修改合并为一个新的提交。这种分支管理方式使得团队协作更为高效,同时也降低了出错的风险。
Git在团队协作中如何提高团队的效率和协作能力
在团队协作中,Git允许每个开发者都有一份完整的本地仓库,可以独立进行版本控制和提交。这种分布式的设计使得团队成员可以在本地独立地进行开发和修改,而不需要依赖网络连接。同时,Git的分支管理功能使得团队能够轻松地进行并行开发和实验性工作,而不会相互干扰。这些特性帮助团队提高了效率和协作能力,使得团队成员可以更加灵活地进行代码管理和协作开发。
工作流程如下:
下图展示了 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 目前支持 Linux/Unix、Solaris、Mac和 Windows 平台上运行。
Git 各平台安装包下载地址为:Git - Downloads
我这里是使用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
Git官网如下(注:下载安装2.2以上的版本):
Git下载官网https://git-scm.com/downloadshttps://git-scm.com/downloads
官网下载:
安装步骤
注册登录好之后,接下来我们将创建我们的码云仓库
创建我的仓库
创建成功后一定要保存一下命令信息,因为只会出现一次
首先在本地新建一个文件夹作为本地仓库用于存储,然后打开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)则是将本地仓库中的提交同步到远程仓库中的过程。
第一次需要输入账户密码
可以看到我们的码云仓库中存在该文件
新建文件夹模拟他人,进入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 提供了多种解决方案来处理代码冲突。
场景: 假设有两个开发者 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 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,后面我们会详细介绍。
说明:
下表列出了 git 创建仓库的命令:
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 <file> | 以列表形式查看指定文件的历史修改记录 |
命令 | 说明 |
---|---|
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
- git commit:是将本地修改过的文件提交到本地库中;
- git push:是将本地库中的最新信息发送给远程库;
- git pull:是从远程获取最新版本到本地,并自动merge;
- git fetch:是从远程获取最新版本到本地,不会自动merge;
- git merge:是用于从指定的commit(s)合并到当前分支,用来合并两个分支;
$ git merge -b // 指将 b 分支合并到当前分支
git pull 相当于 git fetch + git merge。
git 常用命令:
git init # 初始化本地git仓库(创建新仓库) git config --global user.name "xxx" # 配置用户名 git config --global user.email "xxx@xxx.com" # 配置邮件 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://git@192.168.53.168/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://git@192.168.53.168/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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。