一、git的原理
154Please respect copyright.PENANAKChnPcnbaR
git是赫赫有名的Linux之父Linus Torvalds从2005年起开发的文件版本管理系统,掌控Linux内核这样一个最为重量级的世界产品的Linus为什么要开发这个东西呢?因为Linux系统由全世界的程序员协作维护,对源代码文件的版本控制管理的需求超过了任何其它的软件项目,因此Linus才会为此发力。
git以前的文件版本管理软件大多为集中管理式,即完整的文件历史记录只存在于服务器,其它用户只获取自己当前工作需要的那一小部分内容,这样产生的问题就是一旦服务器不可连接,大家就无法协作,一旦服务器硬盘被损坏,整个文件的历史就丢失了,所以,这样的模式是脆弱的,爲了打造一個健壯好用的協作系統,git应运而生,Linus的做法是,每个用户的电脑上都和服务器一样有完整的历史记录,相当于每个用户的电脑都给服务器做了一个镜像备份,这样,即使服务器不可连接,用户也拥有完整的历史记录,如果服务器损坏,不仅不影响用户的使用,还能从用户的镜像备份中自我恢复,可以说,git是去中心化的典型,Linus不仅是伟大的程序员,更是伟大的思想家。
git为Linux内核的开发而诞生,因此它从一开始就有着极高的规格:154Please respect copyright.PENANAn0Cr97Ie9M
1. 极速154Please respect copyright.PENANAGHLH7jOSJv
2. 简明154Please respect copyright.PENANAveuzFi3r0d
3. 支持并行开发(想想Linux有多少个发行版)154Please respect copyright.PENANA6UC7pzdNjy
4. 分布式(每个用户都有完整的历史记录镜像)154Please respect copyright.PENANAwAVx3owEXD
5. 支持超大规模的项目(比Linux内核更大的项目也不多了吧)
git在文件管理技术上的革新是将以往的差异存储(delta)改为拍照存储(snapshot),也就是说,git以前的文件版本管理系统是保存每个文件的变化量,以此为基础来合成各个时期的文件版本,而git没有存储文件的变化量,它存储的是文件发生变化时的整体拍照,也就是用更多的存储空间获得更快的使用效率。这里的哲学是,如果一系列的操作被频繁地使用来产生某个固定的结果,那么,这个固定的结果就应该被缓存起来,以避免不断重复的操作所消耗的时间,因为时间永远都比任何其它的东西贵重,只要能缩短需要的时间,人类会为此付出任何代价。
git使用SHA-1算法来验证文件的内容和目录的结构,此算法产生的校验和(checksum)被git十分看重,git的数据库存储了所有的文件内容和目录结构的校验和,以此来确保文件内容和目录结构不被篡改。这其实就是区块链的做法,git从2005年诞生起就采用了这样的做法,从技术架构上来看,区块链引发的第三次信息技术革命的始祖其实是git。
因为git在本机保存有完整的文件历史镜像,与服务器的内容一样,因此我们绝大多数时候都只需要在本机操作,只在一切完成妥当以后,将本地的镜像与服务器同步。
我们用 git init 命令创建一个git仓库,它会创建一个名为 .git 的隐藏文件夹,里面存放的东西主要是以下两部分内容:154Please respect copyright.PENANAGCsNEpt2xk
1. 完整的文件历史镜像,也叫本地repository,这就是正式的文件仓库,存放的是已经提交的(commit)文件。154Please respect copyright.PENANAAuRw74WCVk
2. staged区,这里存放的是准备提交到repository的文件的快照,我们用 git add <a_file> 命令的时候,就是将 a_file 的内容拷贝到了 .git 的 staged 区,拷贝完毕以后我们可以接着修改 a_file 的内容而不会影响已经存放在staged区的 a_file 的快照内容。
要了解git的运作原理,首先要了解文件存放的位置有以下4个区域:154Please respect copyright.PENANAmvGREsg6IU
1. 工作区 workspace, 就是我们平常修改文件的地方。154Please respect copyright.PENANAEngSecU4w9
2. 缓存区 staged,位于本地.git隐藏文件夹中, 就是我们修改一个文件到了一个比较好的状态,就将这个状态的文件通过git add命令拷贝到缓存区存储起来,然后继续在工作区编辑文件,而不会影响缓存区中状态较好的文件。154Please respect copyright.PENANAPoXrPz1jfk
3. 本地repo,位于本地.git隐藏文件夹中,就是一次工作结束以后,用git commit命令将所有缓存区中的文件提交给git repo保存,git repo就是由一次又一次的commit组成的。154Please respect copyright.PENANAhytUnbMNp9
4. 远程repo, 它和本地repo是镜像,互为备份,不断相互同步,我们在本地repo有了新的commit以后,通过git push命令将本地repo的新commit内容同步到远程repo,通过git fetch/pull/clone将远程repo的新内容获取到本地repo.
git的使用流程通常如下:154Please respect copyright.PENANARVb4iXGTkL
1. 在工作区修改文件,到了一个满意的程度时,将它add到staged区,使用 git add <a_file> 命令。154Please respect copyright.PENANAJ4PV8Hc41B
2. 将所有需要提交到repository的文件都add到staged区以后,用git commit命令将它们提交到本地repository. 154Please respect copyright.PENANAYm1HhxPdKQ
3. 用git push命令将本地repository的新内容同步到服务器的repository.
二、git的安裝
154Please respect copyright.PENANA2pItnsuKNz
A. Ubuntu 24 安装git
# sudo apt install git
154Please respect copyright.PENANAq1xuBtxjVK
B. Windows 10 安装git
下載安裝文件154Please respect copyright.PENANAyrgnlHumFp
https://github.com/git-for-windows/git/releases/download/v2.45.2.windows.1/Git-2.45.2-64-bit.exe154Please respect copyright.PENANALINcale3Dq
安装过程中,除了以下2步,其它步骤使用默认选项154Please respect copyright.PENANAcZAhpUk9Dw
choosing the default editor: visual studio code154Please respect copyright.PENANAg5OgpKnpPZ
configuring the line ending conversions: checkout as-is, commit as-is154Please respect copyright.PENANACsvTFnWy9V
安装完毕以后从开始菜单中将git bash固定到任务栏,打开git bash, 即为git的命令行界面。
三、使用git (Windows和Linux相同)
154Please respect copyright.PENANAvnaGu8KSNi
A. 全局注册
1. 注册github账号154Please respect copyright.PENANAoN9C8kSU6a
# git config --global user.email "[email protected]"154Please respect copyright.PENANALDAj9xvW1U
# git config --global user.name "SiJinmin"
2. 设置运行 git init 命令时默认的 branch 名称爲main154Please respect copyright.PENANArqMpYkRysq
# git config --global init.defaultBranch main154Please respect copyright.PENANA8k5TgjUSbf
# git config --global --add push.autoSetupRemote true154Please respect copyright.PENANA64w6WJAdl3
git push時自動設置remote爲origin main
3. 设置rebase=true154Please respect copyright.PENANA9ODQocVVRY
# git config --global pull.rebase true154Please respect copyright.PENANAFqaZ1rGGKR
当git pull时,如果有其它人在本地repo的新commit之前已发布commit,rebase=true会令git自动对这些并行发生的commit进行线性排列,自动push本地repo的commit到远程repo,免除merge提示。
4. 保存密码154Please respect copyright.PENANARwRjRlFWA2
初次上传时会提示输入密码,如果想要后续的git push不再需要输入密码,可以使用下面的命令保存输入的密码,其中3600000表示每1000个小时以后需要重新输入密码。154Please respect copyright.PENANA9phrJ8HbfH
# git config --global credential.helper cache154Please respect copyright.PENANAy8qhmgUwpK
# git config --global credential.helper 'cache --timeout=3600000'154Please respect copyright.PENANAbXIkz3Bcn2
运行上述的命令后git push,输入一次用户名和密码,就会被保存下来。
5. 查看全局注册的信息是否正确154Please respect copyright.PENANAIeRSv6mHbl
# git config --list
154Please respect copyright.PENANAeuftllsBrc
B. 初始化本地repo
初始化一个本地git repository的两种方法,一种是git clone, 另一种是git init。
1. git clone: 将远程repository拷贝到本地,且自动拷贝最新版文件到workspace (不支持断点续传)154Please respect copyright.PENANAzWPidbsKkS
# cd /d/code154Please respect copyright.PENANA6O0NSRMT4i
# git clone https://github.com/SiJinmin/buda154Please respect copyright.PENANAzy7sDiuKLg
git clone 虽然是进行项目初始化的最简单方法,但在国内对github使用git clone命令时很慢且容易断线,不能断点续传,因此有时候我们可能需要使用下面的第二种方法进行项目的初始化。
2. git init: 为本地常规文件夹添加 git repo (支持断点续传)154Please respect copyright.PENANAZJE1MKwttL
# cd /d/code && mkdir buda && cd buda154Please respect copyright.PENANAHuRwgFYs6R
创建 .gitignore 文件用来设置需要被忽略的文件,比如node_modules154Please respect copyright.PENANAe0ryo6HsgE
# git init154Please respect copyright.PENANArFHzkmlGI2
# git remote add origin https://github.com/SiJinmin/buda154Please respect copyright.PENANAdSo5VWym7c
# git fetch154Please respect copyright.PENANA7ZExItIeTA
fetch將remote repo的內容同步到local repo, git fetch/pull 命令支持断点续传。154Please respect copyright.PENANAp3K5GkPaHD
# git checkout main154Please respect copyright.PENANAVoyiqvxz0U
checkout將local repo的內容同步到work dir
# git pull154Please respect copyright.PENANAhoZxOVl5XF
pull相當於將git fetch和checkout合併成一個命令,用於從remote repo刷新local repo和work dir
C. 修改文件、查看状态、提交到repo
在本地文件夹 /d/code/buda 中增删改文件,查看文件的修改状态、目前所在的 branch154Please respect copyright.PENANAVGf3GBYdJ2
# git status
提交到repo154Please respect copyright.PENANA2uRuyRICJD
# cd /d/code/buda154Please respect copyright.PENANAGCRW3S1VQi
# git add -A && git commit -m "init files" && git push
查看修改内容154Please respect copyright.PENANAi1Cy8M7U6n
# git diff
查看最近的10次提交154Please respect copyright.PENANArAYDZfUwqL
# git log --stat -10
查看提交的详细信息154Please respect copyright.PENANA7cxNtZ6fB8
# git log -p
154Please respect copyright.PENANAWjPIDT43cF
D. 下载以前的某个版本
1. 查看以前的提交,找到版本所处的<commit SHA>154Please respect copyright.PENANA9uHYGLdadF
# git log -10 --pretty=oneline
2. 创建新的repo154Please respect copyright.PENANAOG41qcDjEH
# mkdir buda && cd buda154Please respect copyright.PENANAM072F1QhFE
# git init154Please respect copyright.PENANAZKl2zrU7ZC
# git add -A && git commit -m "init"154Please respect copyright.PENANAomiB7DcMIp
# git remote add origin https://github.com/SiJinmin/buda154Please respect copyright.PENANAV6qEVxSJBR
# git fetch154Please respect copyright.PENANAQzpgaiHn3b
# git checkout <commit SHA>
四、自建git server
1. 創建bare repo154Please respect copyright.PENANAuIp84fIWDq
# git clone --bare /dir/of/my_project /dir/of/server/repo/my_project.git154Please respect copyright.PENANA3BYRg0gaBr
my_project爲內含.git的目錄, --bare會對my_project/.git的內容進行略微的配置修改,使之可作爲remote repo,remote repo應僅作爲多人協作的中轉站,不應作爲某個人的工作目錄。154Please respect copyright.PENANAQByGVJQNtK
這樣就建好了,其他人就可以通過ssh訪問這個repo了
2. 遠程使用上面的repo154Please respect copyright.PENANAMNCziMWH6I
# git clone [email protected]:/dir/of/server/repo/my_project.git
五、Github的使用
訪問https://github.com,註冊账号154Please respect copyright.PENANACqlQyk2ndc
创建一个repository,比如 https://github.com/SiJinmin/buda154Please respect copyright.PENANAEXfQL2gPPq
生成access token154Please respect copyright.PENANAlffPLsmf0j
现在用git push往github上传文件的时候不能用用户名+密码的方式授权,要用 access token的方式授权,因此我们要先在github上生成access token。154Please respect copyright.PENANAIqgbuF0cip
点击github网站上右上角的头像,选择settings,154Please respect copyright.PENANAsoNVIyXWfX
选择左边底部的developer settings,154Please respect copyright.PENANAA1jP75gQpY
点击左边personal access tokens下面的tokens(classic),154Please respect copyright.PENANAbeyvd2vxH9
点击generate a personal access token154Please respect copyright.PENANAJoKb5Z7p7J
1. note 下填写 linux git push154Please respect copyright.PENANAoNfRvwTK9a
2. expiration 选择 no expiration154Please respect copyright.PENANACngZ4uSutc
3. select scopes: 只需要勾上 repo下面的public_pro即可,其它的都不用勾154Please respect copyright.PENANAkVmEuooyCS
点击generate token按钮,及时保存好它,仅此一面之缘。
六、操作远程repo
1. 查看远程repo154Please respect copyright.PENANAhsKMYvSHnN
# git remote -v154Please respect copyright.PENANAe83xf8VVrl
# git remote show <remote>154Please respect copyright.PENANAIcHusB1Nrx
例如:git remote show origin
2. 添加远程repo154Please respect copyright.PENANAy31fNflsd2
# git remote add short_name url154Please respect copyright.PENANAOAENVGak8R
例如: # git remote origin https://github.com/SiJinmin/buda154Please respect copyright.PENANAJSaKhe8Egx
# git remote add origin /srv/git/project.git154Please respect copyright.PENANAfkHPrZCppC
將本地repo作爲remote repo來訪問
3. 重命名远程repo154Please respect copyright.PENANA4Hbkw5LvgT
# git remote rename <old_short_name> <new_short_name>
4. 删除远程repo154Please respect copyright.PENANAq4ilqSdKfX
# git remote remove <short_name>
5. 通过远程repo的short_name来获取内容154Please respect copyright.PENANAat6CMOIBnr
# git fetch short_name
6. 将本地repo的内容分享到远程repo154Please respect copyright.PENANAbiYwCEzn7E
# git push <remote> <branch>154Please respect copyright.PENANAwcMZTM392P
例如:git push origin main
七、创建自定义命令
# nano ~/.bash_aliases154Please respect copyright.PENANAkFlCMN2hYI
添加alias, 比如:154Please respect copyright.PENANAEWeQUF52pB
alias gitbuda='gitbuda() { git add -A; git commit -m "$1"; git push; }; gitbuda'154Please respect copyright.PENANAu4LKOqEcDQ
其中$1表示命令的第一个参数,这样就可以用 gitbuda "commit message" 来运行命令154Please respect copyright.PENANAwuoZ2Cwx6k
# source ~/.bash_aliases
参考资料
Git - Book154Please respect copyright.PENANAlUHFHcY3uD
Github断点续传(git clone 经常失败)_git clone断点续传-CSDN博客154Please respect copyright.PENANAf88xLCmG1s
https://www.cnblogs.com/upstudy/p/15870787.html154Please respect copyright.PENANALVJNGYnOEE
https://juejin.cn/post/6844903830195273736154Please respect copyright.PENANA7UFwrKD6mX
【已解决】fatal: Authentication failed for ‘https://github.com/.../‘-CSDN博客154Please respect copyright.PENANAoNojZ7uVbS
如何让Git记住你的GitHub Token,避免每次都要重复输入?-腾讯云开发者社区-腾讯云154Please respect copyright.PENANAF1WegmjxTj
git获取指定历史版本代码_git 切换到指定sha版本-CSDN博客
如果您對C語言編程、網站開發、Vue, Git, Linux系統的使用感興趣,邀請您加入淨明創建的「Linux + C語言 + Vue + Git 網站開發技術學習交流微信羣」,請加淨明的微信(si_jinmin)以便拉您進羣。
ns216.73.216.100da2