文章目录
- 一、Git介绍
- 1.1、Git的作用
- 1.2、Git的理念
- 1.3、Git的特点
- 1.4、Git对比SVN
- 二、Git的概念
- 2.1、Git基础概念
- 三、Git的基本操作
- 3.1、使用Git管理一个代码仓库的流程
- 3.2、Git常用命令介绍
- 四、Git状态的变化
- 五、Git安装和配置
- 5.1、Git的安装
- 5.2、Git的配置
- 六、Git的高级操作
- 6.1、.gitignore文件的使用
- 6.2、git diff的使用
- 6.3、git如何处理代码冲突
- 6.3.1、更新本地代码库
- 6.3.2、查找冲突
- 6.3.3、手动解决冲突
- 6.3.4、添加解决后的文件
- 6.3.5、提交解决后的文件
- 6.4、git merge合并代码
- 6.5、git 代码回退
- 七、Git的GUI工具
- 八、如何使用Git在Github上贡献代码
公众号:MCNU云原生,欢迎微信搜索关注,更多干货,及时掌握。
一、Git介绍
1.1、Git的作用
Git 是一个开源的分布式版本控制系统,用于管理一个或多个文件的整个历史记录。它有助于跟踪文件的变化,同时让多个开发者对同一个文件做出更改,并帮助开发者们在不同时间点进行历史查阅和版本比较。
1.2、Git的理念
Git 拥有一个独特的理念,即分布式版本控制系统。它采用客户端-服务器模式,将文件、数据和代码以分布式仓库的形式保存在不同的服务器上,以便用户进行版本控制、代码管理和共享。 Git 的分布式版本控制系统可以更快地处理版本控制任务,比传统的集中式版本控制系统更安全、更可靠、更高效。
1.3、Git的特点
- 分布式:每个开发者都拥有完整的代码库,可以离线工作,不需要依赖中央服务器。
- 非线性开发:可以创建多个分支,并行开发多个功能,通过合并分支进行代码整合。
- 高效性:Git 的设计可以快速地进行代码比较和合并,使得开发者可以快速迭代。
- 安全性:Git 使用 SHA-1 散列值来保证代码的完整性,具有防篡改的能力。
- 易于学习和使用:Git 的命令行操作简单,且有大量的可视化工具和第三方工具支持。
- 开放源代码:Git 是自由软件,任何人都可以自由地使用、修改和分发它。
- 大规模协作:Git 可以支持上千人同时协作开发同一项目,通过不同分支的合并和冲突解决保证项目的稳定性和质量。
1.4、Git对比SVN
Git 和 SVN 都是版本控制系统,用来管理软件开发过程中的源代码。它们具有一些相似的功能,但是也有一些显著的不同。
Git 是分布式版本控制系统,每个人都可以拥有 Git 仓库的完整拷贝,可以将代码更改推送给其他人,而不用依赖中央服务器。这使得 Git 具有更强大的灵活性,尤其是对于跨越多个组织的团队来说,它可以更快地提交和合并代码。
Git 具有更快的性能,因为它包含一个高效的文件夹索引系统,只跟踪文件本身的变化,而不是整个文件夹。Git 还支持分支,可以轻松地创建许多不同的分支,并利用它们来实现快速发布和实验。
SVN 是集中式版本控制系统,它的工作流程需要一个中央服务器来存储所有的文件及其更改。这使得 SVN 在管理大型团队的源代码时比较方便,因为它提供了一个共享的仓库,每个人都可以从中获取最新的代码。SVN 的另一个优点是,它支持自动合并所有变更,这样可以很容易地将多个开发者的更改合并到一起,而不会出现冲突。另外,SVN 可以跨多个操作系统使用,可以管理任何文件类型。
总的来说,Git 和 SVN 都是强大的版本控制系统,但各有优势。Git 更适合多个组织的团队,以及需要快速发布和实验的项目,而 SVN 则更适合大型团队,并且可以跨多个操作系统使用。
目前从应用和发展的广度来说,Git已经渐渐地在取代SVN的市场份额,所以可以说Git是必学的。
二、Git的概念
2.1、Git基础概念
想要使用Git需要先掌握Git的一些基础概念,更好地理解Git。
- 仓库(Repository):仓库是 Git 中最重要的概念之一,它是用来存储项目代码的地方。所有的修改记录都保存在仓库中,包括提交的代码历史、分支信息、标签等。当我们将修改记录提交到仓库后,它们就会成为代码的一部分。
- 提交(Commit):Git 中的提交是指将文件或代码变更记录下来,并且提交一个说明(commit message)。
- 分支(Branch):Git 中的分支是指代码版本的不同分支。可以创建新的分支来尝试新的代码,而不会影响到主分支。
- 合并(Merge):Git 中的合并是指将一个分支中的代码合并到另一个分支中。
- 拉取(Pull):Git 中的拉取是指将远程仓库中的代码更新到本地仓库中。
- 推送(Push):Git 中的推送是指将本地仓库中的代码更新到远程仓库中。
- 标签(Tag):Git 中的标签是指给某一个特定的提交打上一个标签,用于区分这个提交与其他提交的不同。
- 工作区(Working Directory):工作区是指项目代码所在的目录,也就是我们平时编辑和修改代码的地方,在工作区中,我们可以创建、修改和删除文件等。
- 暂存区(Staging Area):暂存区是介于工作区和仓库之间的一个缓冲区域。在提交代码之前,我们需要将修改过的文件添加到暂存区中。暂存区中保存了待提交的修改记录,包括哪些文件被修改了,修改了哪些部分,但还没有真正提交到仓库。
可以用下面的图来更好地理解这三个概念之间的关系:
git add git commit
工作区 --------------> 暂存区 --------------> 仓库
简单来说,我们在工作区中修改代码后,通过 git add
命令将修改的文件添加到暂存区,然后通过 git commit
命令将暂存区中的修改记录提交到仓库中。在提交之前,我们可以通过 git status
命令来查看工作区和暂存区的状态,以及哪些文件被修改过、添加到了暂存区等信息。
三、Git的基本操作
3.1、使用Git管理一个代码仓库的流程
- 初始化仓库:使用
git init
命令在本地创建一个新的 Git 仓库。 - 添加文件:将项目文件添加到仓库中,使用
git add
命令将修改后的文件添加到 Git 的暂存区中。 - 提交代码:使用
git commit
命令提交修改记录到 Git 仓库中。每次提交需要添加一条注释,简要描述修改了哪些内容。 - 创建分支:使用
git branch
命令创建一个新的分支,并切换到该分支。这个分支可以用于开发新的功能或修复错误,不会影响主分支(通常为master
)的代码。 - 合并分支:在开发新功能或修复错误后,需要将分支合并到主分支上,使用
git merge
命令将分支合并到主分支上。 - 拉取代码:在多人协作开发中,需要将远程仓库中的代码拉取到本地进行开发。使用
git pull
命令将远程仓库中的代码更新到本地仓库中。 - 推送代码:在完成开发并且测试通过后,需要将修改的代码推送到远程仓库中。使用
git push
命令将本地仓库中的代码更新到远程仓库中。 - 标记版本:当完成一个里程碑或者发布一个版本时,可以使用
git tag
命令创建一个新的标签,用于标记当前的版本号。
3.2、Git常用命令介绍
Git 是一个强大的版本控制工具,提供了众多命令来管理代码仓库,以下是一些常用的 Git 命令介绍:
git init
:初始化一个新的 Git 仓库。git add
:将文件或目录添加到 Git 的暂存区中。git commit
:将暂存区的修改记录提交到 Git 仓库中。git clone
:从远程 Git 仓库中克隆一个副本到本地。git status
:查看当前 Git 仓库的状态,包括哪些文件被修改过、添加到了暂存区等信息。git log
:查看 Git 仓库中的提交历史记录,包括每个提交的作者、时间、注释等信息。git branch
:查看 Git 仓库中的分支信息,并可以创建、删除、重命名等操作。git merge
:将一个分支的修改合并到当前分支中。git pull
:从远程 Git 仓库中拉取最新的代码到本地仓库中。git push
:将本地 Git 仓库中的修改推送到远程 Git 仓库中。git checkout
:切换到指定分支或提交。git tag
:为当前的提交打上一个标签,用于标识当前版本。git remote
:管理与远程仓库的连接,可以添加、删除、重命名等操作。git diff
:查看当前修改和之前提交的版本之间的差异。
这些命令只是 Git 提供的众多命令中的一部分,可以根据具体需求进行选择和使用。同时,可以通过 git --help
命令查看 Git 的帮助文档,以获得更多的信息和帮助。
四、Git状态的变化
在Git中,有三个主要的概念:工作区、暂存区和仓库。它们分别代表了不同的状态,可以通过Git命令进行变化。
- 工作区(Working Directory):指的是你在本地电脑上实际修改的文件。当你修改了文件,但没有执行Git命令时,这些文件的状态就是“未跟踪”或“已修改”。
- 暂存区(Staging Area):也称为索引(Index),是一个临时的存储区域,用于存储即将被提交到Git仓库的文件。当你执行
git add
命令时,修改的文件会被添加到暂存区,此时这些文件的状态为“已暂存”。 - 仓库(Repository):也称为版本库,是Git用来存储历史提交记录的地方。当你执行
git commit
命令时,暂存区中的文件会被提交到仓库中,此时这些文件的状态为“已提交”。
下面是这些状态如何相互转换的说明:
- 将修改的文件添加到暂存区:
git add <file>
,此时文件的状态由“未跟踪”或“已修改”变为“已暂存”; - 将暂存区的文件提交到仓库:
git commit -m "commit message"
,此时文件的状态由“已暂存”变为“已提交”; - 查看文件状态:
git status
,此命令可以查看工作区、暂存区和仓库中文件的状态; - 撤销暂存区的修改:
git reset <file>
,此命令可以将暂存区的文件恢复为未暂存的状态; - 撤销工作区的修改:
git checkout -- <file>
,此命令可以将工作区的文件恢复到上次提交的状态; - 恢复仓库中的文件:
git checkout <commit> <file>
,此命令可以将指定提交中的文件恢复到当前分支上。
需要注意的是,上述命令在执行时需要指定对应的文件或提交。同时,这些命令还有更多的选项和参数可以使用,可以通过git help
命令来查看Git的文档。
五、Git安装和配置
5.1、Git的安装
Windows和Mac下都有直接图形界面的安装方式,非常简单,不再赘述,主要讲讲Linux下的安装方式。
在Linux下安装Git需要先安装必要的依赖:
-
Centos/RedHat
$ yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
-
Debian/Ubuntu
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
下载最新版Git进行安装
$ tar -zxf git-2.39.2.tar.gz
$ cd git-2.39.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
5.2、Git的配置
git提供了git config
命令用于配置或读取相应的工作环境变量,其主要配置文件分为三层,从上到下分别是:
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用git config
时用--global
选项,读写的就是这个文件。.git/config
文件:仅针对当前项目有效,.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。
最重要的配置就是配置用户名和电子邮件,使用以下命令即可:
$ git config --global user.name "lucas"
$ git config --global user.email lucas@foxmail.com
如果想要查看已有配置信息,可以使用以下命令:
$ git config --list
diff.astextplain.textconv=astextplain
filter.lfs.clean=git-lfs clean -- %f
filter.lfs.smudge=git-lfs smudge -- %f
filter.lfs.process=git-lfs filter-process
filter.lfs.required=true
http.sslbackend=openssl
http.sslcainfo=D:/install/Git/mingw64/ssl/certs/ca-bundle.crt
core.autocrlf=true
core.fscache=true
core.symlinks=false
pull.rebase=false
credential.helper=manager-core
credential.https://dev.azure.com.usehttppath=true
init.defaultbranch=master
user.name=lucas
user.email=lucas@foxmail.com
......
六、Git的高级操作
6.1、.gitignore文件的使用
在使用 Git 管理代码仓库时,有些文件或目录不应该被 Git 进行版本控制,例如编译输出文件、日志文件等。这时可以使用 .gitignore
文件来告诉 Git 忽略这些文件或目录。
.gitignore
文件是一个文本文件,列出了 Git 应该忽略的文件或目录的规则。每一行规则都是一个模式,可以包含通配符、反斜线等符号,表示需要忽略的文件或目录的名称或路径。例如:
# 忽略所有 .txt 文件
*.txt
# 忽略 build 目录及其下的所有内容
/build/
# 忽略指定的文件
example.log
在上述例子中,第一行规则使用了通配符 *
来匹配所有 .txt
结尾的文件;第二行规则使用了反斜线 /
来指定需要忽略的目录 build
,并在末尾加上了斜线 /
来表示忽略该目录下的所有内容;第三行规则指定了需要忽略的文件名 example.log
。
.gitignore
文件可以放置在代码仓库的任何级别上,从仓库根目录到任意子目录都可以。一般建议将其放置在代码仓库的根目录下,以便更方便地管理和维护。
需要注意的是,如果在 .gitignore
文件中忽略了某个文件或目录,那么 Git 将不会对其进行版本控制,也不会将其包含在提交中,因此需要确保 .gitignore
文件中的规则正确地列出了需要忽略的文件或目录。
6.2、git diff的使用
git diff
是一个常用的 Git 命令,用于比较 Git 仓库中的不同版本之间的差异。它可以用于比较两个提交之间的差异,或比较工作目录中的文件与暂存区或最新提交之间的差异。
下面是 git diff
命令的一些常见用法:
- 比较工作目录中的文件与最新提交之间的差异:
git diff
- 比较工作目录中的文件与暂存区之间的差异:
git diff --cached
- 比较两个提交之间的差异:
git diff <commit1> <commit2>
其中 <commit1>
和 <commit2>
分别是要比较的两个提交的 SHA-1 标识符,可以使用提交的短标识符或分支名代替。
- 比较指定文件或目录的差异:
git diff <commit1> <commit2> <file>
其中 <file>
可以是文件或目录的路径,可以只比较某个文件或目录的差异。
- 比较两个分支之间的差异:
git diff <branch1>..<branch2>
其中 <branch1>
和 <branch2>
分别是要比较的两个分支的名称,可以使用分支的短名称或完整名称代替。
以上是 git diff
命令的一些常见用法,使用这些命令可以帮助开发者比较不同版本之间的差异,从而更好地管理代码仓库。
6.3、git如何处理代码冲突
在多人协作开发时,经常会出现代码冲突的情况。当两个或多个开发者同时修改同一个文件的同一部分时,就会发生冲突。Git 提供了一些命令和工具来帮助开发者处理代码冲突,下面是处理代码冲突的一般步骤:
6.3.1、更新本地代码库
在处理代码冲突之前,需要先更新本地代码库。使用 git pull
命令从远程仓库获取最新的代码。
6.3.2、查找冲突
在更新代码库之后,如果有冲突,使用 git status
命令查看冲突文件的状态,冲突文件的状态为 both modified
。
6.3.3、手动解决冲突
手动编辑冲突文件,将冲突部分保留下来,删除其他部分。可以使用编辑器或其他工具来帮助解决冲突。
6.3.4、添加解决后的文件
在解决冲突之后,使用 git add
命令将解决后的文件添加到暂存区。
6.3.5、提交解决后的文件
在将解决后的文件添加到暂存区后,使用 git commit
命令提交修改。
如果在解决冲突的过程中遇到问题或错误,可以使用 git merge --abort
命令取消合并操作,返回到合并前的状态。
需要注意的是,在多人协作开发时,最好避免同时修改同一个文件的同一部分,可以通过拆分任务、分工协作等方式来避免冲突的发生。此外,在处理冲突时,需要保持沟通和协作,及时解决问题。
6.4、git merge合并代码
Git merge是将两个或多个分支的代码合并到一个分支中的操作。在合并过程中,Git会自动尝试将两个分支的代码进行比较和合并,以生成一个新的合并提交。
以下是使用Git merge合并代码的一些步骤:
- 确保你已经切换到需要合并到的目标分支,例如master分支:
git checkout master
- 运行merge命令来将目标分支与要合并的分支进行合并:
git merge <branch-name>
- Git会尝试自动合并分支的代码。如果Git遇到了冲突,它会提示你手动解决冲突。你需要手动编辑有冲突的文件,以解决冲突。
- 如果合并成功,Git会生成一个新的合并提交。在这个提交消息中,Git会包含有关合并的信息,如何合并的分支等等。
- 最后,使用
git push
命令将合并的代码推送到远程仓库。
注意:在进行合并操作之前,建议先从远程仓库获取最新的代码并将其合并到本地分支。这样可以避免不必要的冲突和合并问题。
6.5、git 代码回退
在Git中,可以使用多种方法回退代码,包括撤销工作区的修改、恢复指定版本的代码等。下面介绍一些常用的回退代码的方法:
- 撤销工作区的修改:
git checkout -- <file>
,此命令可以将工作区的文件恢复到上次提交的状态。如果你已经使用git add
将修改的文件添加到暂存区,但还没有提交,可以使用git reset HEAD <file>
来撤销暂存区的修改。 - 恢复指定版本的代码:
git checkout <commit> <file>
,此命令可以将指定提交中的文件恢复到当前分支上。你可以使用git log
命令来查看提交历史记录,并选择需要恢复的版本。如果你想恢复到某个历史提交的状态,可以使用git checkout <commit>
命令,这将使得HEAD指向这个提交,并将工作区和暂存区都恢复到这个提交的状态。 - 回退提交:
git revert <commit>
,此命令可以创建一个新的提交,用于撤销指定提交的更改。该命令将会生成一个新的提交,包含了回退操作的更改,但是不会删除原始提交。如果你需要完全删除某个提交,可以使用git reset
命令,但是需要注意,这将会删除该提交及其之后的提交,因此需要谨慎使用。
需要注意的是,在使用Git回退代码时,需要注意不要将未提交的修改丢失,并且需要保留历史提交记录。如果你不确定该如何回退代码,可以先创建一个新的分支,进行实验,确保不会对主分支造成不可逆的影响。
七、Git的GUI工具
Git GUI工具是一种可以通过图形界面操作Git的工具,它可以帮助用户更轻松地管理Git仓库、提交代码、查看历史记录等操作。下面是一些常用的Git GUI工具:
-
GitKraken:这是一款跨平台的Git GUI工具,支持Windows、Mac和Linux系统。它提供了一套直观的图形界面,可以帮助用户更方便地管理Git仓库。GitKraken还支持一些高级功能,如分支管理、代码审核等。
-
Sourcetree:这是一款免费的Git GUI工具,支持Windows和Mac系统。Sourcetree提供了一套简洁的界面,可以帮助用户更轻松地管理Git仓库。它还支持一些高级功能,如Git-flow工作流、Submodule管理等。
-
GitHub Desktop:这是一款免费的Git GUI工具,支持Windows和Mac系统。GitHub Desktop提供了一套直观的界面,可以帮助用户更方便地管理Git仓库、提交代码等操作。它还支持GitHub网站的集成,可以更轻松地进行Pull Request等操作。
-
Git Cola:这是一款开源的Git GUI工具,支持Windows、Mac和Linux系统。Git Cola提供了一套简洁的界面,可以帮助用户更轻松地管理Git仓库、提交代码等操作。它还支持一些高级功能,如分支管理、Submodule管理等。
-
Git GUI:这是Git自带的GUI工具,可以在Windows、Mac和Linux系统中使用。Git GUI提供了一套简单的图形界面,可以帮助用户更轻松地进行Git操作。它支持大多数Git操作,如提交代码、查看历史记录等。
以上是一些常用的Git GUI工具,它们都提供了一套直观的图形界面,可以帮助用户更方便地管理Git仓库、提交代码等操作。不同的Git GUI工具有不同的特点和优缺点,用户可以根据自己的需要选择合适的工具。
八、如何使用Git在Github上贡献代码
-
在 GitHub 上创建一个账户并登录。
-
找到要贡献代码的项目,并在项目主页上点击 “Fork” 按钮,将项目复制到自己的账户下。
-
在自己的电脑上安装 Git 工具。
-
使用 Git 将项目克隆到本地计算机中。可以通过在命令行终端中使用以下命令来克隆项目:
bashCopy code git clone https://github.com/你的用户名/项目名.git
-
在本地修改代码,并使用以下命令将更改提交到本地 Git 仓库:
sqlCopy codegit add . git commit -m "提交信息"
其中,
git add .
命令将所有修改添加到暂存区,git commit
命令将提交更改,并在提交信息中描述更改。 -
将本地更改推送到自己的 GitHub 账户中:
perlCopy code git push origin master
这将把本地的更改推送到 GitHub 上。
-
在自己的 GitHub 账户上打开一个 Pull Request (PR) 请求,请求将更改合并到原始项目中。在 GitHub 上点击 “New pull request” 按钮,填写 PR 请求的标题和描述,并选择要合并的分支。
-
等待原始项目的维护者审核并接受你的 PR 请求。如果需要进一步修改,原始项目的维护者可以在 PR 请求中提出评论和建议。
-
当 PR 请求被接受并合并到原始项目后,你的代码贡献就完成了。
以上是在 GitHub 上贡献代码的基本步骤。在此过程中,你需要注意遵循项目的代码风格和贡献规范,避免与其他贡献者冲突,以便顺利地将你的代码贡献到项目中。
掌握以上知识,一般的Git操作完全不在话下!还等啥,行动吧。