本文是书生大模型实战营系列的第三篇文章,本文的主题是:Git基础知识点。
原始教程链接:Tutorial/docs/L0/git/readme.md at camp4 · InternLM/Tutorial
1.Git总览
什么是Git?
Git是一个分布式版本控制系统,广泛用于软件开发和代码管理。Git最初是为了解决Linux内核开发过程中的协作问题而设计的。Git的设计目标包括提高版本控制系统的速度、增强分支管理的灵活性以及确保数据完整性和项目历史的可靠性。
作为一个分布式版本控制系统,Git允许每个开发者在本地拥有整个项目的完整副本,包括其全部历史记录。这意味着开发者可以在没有网络连接的情况下提交更改、查看日志、撤销操作等。此外,Git通过使用SHA-1哈希算法来命名和识别对象,确保了项目历史的完整性,即使面对复杂且频繁的修改也能保证数据的一致性。
Git不仅简化了开发者之间的工作流程,也使得合并不同开发者的工作变得更加容易。它的出现极大地提高了软件开发过程中版本控制的效率,支持多种合作模式,从而适应不同规模团队的需求。无论是个人项目还是大型团队协作,Git都提供了一个强大而灵活的工具集来管理和追踪代码的变化。
2.安装Git
在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
这里的 "Your Name"
和 "your.email@example.com"
应替换为你自己的用户名和电子邮件。
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
查看全局配置
git config --global --list
3.Git的一些基本概念
仓库(Repository):仓库是存储你的项目文件及其所有历史记录的地方。仓库不仅保存了当前版本的文件,还包括了整个项目的所有历史更改记录、提交日志、分支信息等。仓库分为两种:本地仓库和远程仓库。
工作区(Working Directory):指的是从Git仓库中checkout出来的代码目录,即你当前正在工作的区域。
暂存区(Staging Area):这是一个临时存放更改的区域,用于准备下一次提交。使用git add
命令可以将修改过的文件添加到暂存区,标记为准备提交的状态。
三者之间的关系:
-
从工作区到暂存区:你在工作区中所做的任何更改(新增、修改或删除文件),都需要通过
git add
命令将其添加到暂存区。这一步骤让你有机会检查和组织你想要在一个提交中包含的所有更改。 -
从暂存区到Git仓库区:一旦你满意了暂存区的状态,就可以运行
git commit
命令来创建一个新的提交。这个提交会永久地保存在你的本地Git仓库中,包括所有暂存区的更改以及一条描述性的提交消息。 -
与远程仓库同步:如果你正在与团队协作或者想要备份你的代码,你需要使用
git push
命令将本地仓库中的提交推送到远程仓库(如GitHub、GitLab等)。
提交(commit):当你完成某些修改后,可以通过git commit
命令将暂存区中的更改保存为一个新提交。每个提交都有一个唯一的SHA-1哈希值作为标识符,并包含了一个关于此次更改的简短描述信息(即提交信息)。提交是Git追踪项目历史的基础单位。
分支(Branch):分支允许你在不影响主线(通常是master
或main
分支)的情况下探索不同的想法或修复问题。Git分支操作非常轻量级,创建、合并分支都非常快捷。通过git branch
可以查看、创建、删除分支,使用git checkout
切换分支。
假设你正在为你的项目开发一项新功能:
- 首先,确保你在主分支上:
git checkout main
- 创建并切换到新的分支:
git checkout -b feature-xyz
- 在新分支上进行更改、添加文件至暂存区并提交这些更改。
- 开发完成后,切换回主分支:
git checkout main
- 将新功能分支合并到主分支:
git merge feature-xyz
- 最后,如果你确定不再需要这个分支了,可以安全地删除它:
git branch -d feature-xyz
合并(Merge):当不同分支上的工作需要整合时,可以使用git merge
命令将指定分支的更改合并到另一个分支中。这有助于整合团队成员的不同贡献,并解决可能存在的冲突。
标签(Tag):标签通常用于给特定的提交打上永久性标记,比如发布版本。这样可以帮助你快速定位重要的里程碑式提交,而不必记住其具体的哈希值。通过git tag
可以创建、列出和删除标签。
克隆(Clone):使用git clone [url]
可以从远程服务器获取一个项目的完整副本到本地,包括其全部历史记录。这是开始参与开源项目或与团队协作的第一步。
拉取(Pull) 和 推送(Push):git pull
用于从远程仓库获取更新并尝试合并到当前分支;git push
则是将本地提交推送到远程仓库,使团队成员可以看到你的最新更改。
4.git的一些小教程
git常见的命令如下:
常见命令:
初始化一个Git仓库,使用git init
命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成
要随时掌握工作区的状态,使用git status
命令。如果git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
版本穿梭:
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。- 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。
每次修改,如果不用git add
到暂存区,那就不会加入到commit
中。
- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 - 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
命令git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git
;
关联一个远程库时必须给远程库指定一个名字,origin
是默认习惯命名;
关联后,使用命令git push -u origin master
第一次推送master
分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改。
分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!
克隆一个仓库,首先必须知道仓库的地址,然后使用git clone
命令克隆。
Git支持多种协议,包括https
,但ssh
协议速度最快。
Git鼓励大量使用分支:
- 查看分支:
git branch
- 创建分支:
git branch <name>
- 切换分支:
git checkout <name>
或者git switch <name>
- 创建+切换分支:
git checkout -b <name>
或者git switch -c <name>
- 合并某分支到当前分支:
git merge <name>
- 删除分支:
git branch -d <name>
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
用git log --graph
命令可以看到分支合并图。
Git分支十分强大,在团队开发中应该充分应用。
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场;
在master
分支上修复的bug,想要合并到当前dev
分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
开发一个新功能,最好新建一个分支;
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作的工作模式通常是这样:
- 首先,可以尝试用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
抓取(pull)和推送(push)
- 查看远程库信息,使用
git remote -v
; - 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用
git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交; - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致; - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/branch-name
; - 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。 - 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
标签Tag
- 命令
git tag <tagname>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id; - 命令
git tag -a <tagname> -m "blablabla..."
可以指定标签信息; - 命令
git tag
可以查看所有标签。
Github
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码。
5.本次作业
本次的作业任务要求如下:
完成后的提交截图:
本次就写到这里啦,感兴趣的小伙伴,收藏点赞关注哈!