❓由一个很神奇的问题展开,git是什么,它仅仅是一个工具嘛?
看完这一篇,你可以说你精通 git 啦!!!
Git 是一个版本控制系统。
Git 可帮助您跟踪代码更改。
Git 用于在代码上进行协作。
Git 思想可以带入你的工程(docker | hub | ipfs | ……所有设计版本机制)
在这里面,可以掌握git的基本操作,基本可以解决百分之九十的开发问题,而剩下的百分之十,对应的最新高级篇可以帮你。
又或许,我们希望掌握它的原理,或许我们可以从头构建一个git,不是嘛🎉
- Haskell:在 Haskell 中自下而上重新实现 “git clone”
- JavaScript : 小程序
- JavaScript : 制造 GIT - 学习 GIT
- Python : 一个 Git 客户端就其创建、提交并转发到 GitHub 上
- Python:给自己写一个 Git!
- Ruby : 在 Ruby 中重建 Git
为了实施
git clone
,将涵盖以下领域:
- git 协议用于使git 客户端能够使用各种传输机制(本机 git 协议、ssh、http)从远程 git 服务器检索所需的更改集,
- 包文件格式,用于将最少量的数据从服务器传输到客户端(更普遍地用于有效地将打包对象存储在存储库中),
- git 用于以 blob 形式存储提交、树、标签和实际文件内容的底层对象存储
- 以及用于跟踪工作目录中文件更改的索引格式。
- 如何实现
clone
git基础篇会解决我们日常的百分之九十的问题,但是总是有那么一些问题需要我们注意的。比如说某一个,我开发的项目的某一个模块感觉这个模块没有之前的好了,那么我想切换回以前的模块。这个时候我们可以用
git log 指定项目目录
得到以前的提交记录,然后git switch 想要的版本hash \指定的目录
最后就是git commit -m "checkout ...."
。
2022年9月10日 17:47:28
进阶篇存在的目的或许不仅仅是git语法层面的,就比如说我们需要删除一个分支,可能很简单的两个命令就可以解决
# 用两行命令删除分支 ## 删除本地分支 git branch -d localBranchName ## 删除远程分支 git push origin --delete remoteBranchName但是我们很疑惑它们的用法🗒️❌
1. 什么时候需要删除分支
一个 Git 仓库常常有不同的分支,开发者可以在各个分支处理不同的特性,或者在不影响主代码库的情况下修复 bug。
仓库常常有一个
master
分支,表示主代码库。开发人员创建其他分支,处理不同的特性。开发人员完成处理一个特性之后,常常会删除相应的分支。
2. 本地删除分支
如果你还在一个分支上,那么 Git 是不允许你删除这个分支的。所以,请记得退出分支:
git checkout master
。通过
git branch -d <branch>
删除一个分支,比如:git branch -d fix/authentication
。当一个分支被推送并合并到远程分支后,
-d
才会本地删除该分支。如果一个分支还没有被推送或者合并,那么可以使用-D
强制删除它。这就是本地删除分支的方法。
3. 删除远程分支
使用这个命令可以远程删除分支:
git push <remote> --delete <branch>
。比如:
git push origin --delete fix/authentication
,这个分支就被远程删除了。你也可以使用这行简短的命令来远程删除分支:
git push <remote> :<branch>
,比如:git push origin :fix/authentication
。如果你得到以下错误消息,可能是因为其他人已经删除了这个分支。
error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'git@repository_name'使用以下命令同步分支列表:
git fetch -p
-p
的意思是“精简”。这样,你的分支列表里就不会显示已远程被删除的分支了。
git - module
不仅仅很有用,而且里面的实现也值得学习
git - Script
脚本能让我们更快的、更方便推动项目
有时候我们需要撤销上一次的
add
或者commit
怎么办?
- 我们使用
git reset HEAD
这样只是撤销了上一次add
- 我们使用:
git reset --soft HEAD^
这样就成功撤销了commit
。- 使用
git reset --hard HEAD^
这样连add
也撤销了。即使是一个简单的推送,或许我们并不赞成强行推送,但是实际确是:我们总是需要去强行推送某一个分支,就比如用npm build搭建出网页推送上去,每一次打包都需要覆盖之前的操作:
git push --force origin master
-
🗝️ 2. git和svn对比
-
🗝️ 3. git工作原理
-
🗝️ 4. git分支
-
🗝️ 5. git上传
-
🗝️ 6. git(菜鸟)
-
🗝️ 7. git分支与合并
-
🗝️ 8. git版本回退
-
🗝️ 12. 贡献代码
记录下参与开源社区的一些记录
统一格式:
统一格式:git commit -m 'type(scope): 描述(#issue)'
我们在提交的时候带上邮箱信息:-s
git commit -s -m "..."
git commit
艺术:<类型>[可选 范围]: <描述> [可选 正文] [可选 脚注]
git commit
提交类型可以是如下:
feat
:新功能(feature)fix
:修补bugdocs
:文档(documentation)style
: 格式(不影响代码运行的变动)refactor
:重构(即不是新增功能,也不是修改bug的代码变动)test
:增加测试chore
:构建过程或辅助工具的变动perf
:性能优化revert
:回滚build
:构建ci
:持续集成update
:更新add
:添加delete
:删除init
:初始化merge
:合并move
:移动rename
:重命名sync
:同步release
:发布hotfix
:修复线上问题optimize
:优化
我们或许可以基于远程origin
分支创建一个新的分支bug-xiongxinwei
git checkout -b bug-xiongxinwei origin
如果你有多次提交
git rebase -i <commit-id> # 如果你的pr有多次提交
合并:想要把master分支合并到feature分支
git checkout feature
git rebase master
//这两条命令等价于git rebase master feature
origin
“和”bug-xiongxinwei
“这两个分支各自 前进 了
在这里,你可以用”pull
“命令把”origin
“分支上的修改拉下来并且和你的修改合并; 结果看起来就像一个新的”合并的提交”(merge commit)
但是,如果你想让”mywork
“分支历史看起来像没有经过任何合并一样,也可以用 git rebase
,如下所示:
git checkout mywork
git rebase origin
这些命令会把你的”mywork
“分支里的每个提交(commit)取消掉,并且把它们临时 保存为补丁(patch)(这些补丁放到”.git/rebase
“目录中),然后把”mywork
“分支更新 到最新的”origin
“分支,最后把保存的这些补丁应用到”mywork
“分支上。
在经历几年的 git 使用后,我形成了自己的 git 工作流,配合 GitHub CLI 的使用,如果你想了解 Github CLI,这篇文章可以帮助到你
最开始使用的是 中心式协同流,下面两个仓库陪伴着我使用最久,也是学习仓库,或许对你们有帮助可以 star:
- cubxxw/CS-NativeCloud-Blockchain-awesome - 📚 菜鸟成长手册🚀 CS系列 、云原生系列、区块链系列、web3系列🔥、Golang系列💡...... (2 days ago)
- cubxxw/awesome-cs-course - 📚awesome:Linux、csapp、os、leetcode、web、html、css、JavaScript、git、java、python、C/C++、mysql、mongodb、golang、blockchain、markdown (6 days ago)
这个过程一般是下面这个样子的:
- 从服务器上做git pull origin master把代码同步下来
- 改完后,git commit到本地仓库中
- 然后git push origin master到远程仓库中,这样其他同学就可以得到你的代码了
如果在第 3 步发现 push 失败,因为别人已经提交了,那么你需要先把服务器上的代码给 pull 下来,为了避免有 merge 动作,你可以使用 git pull --rebase 。这样就可以把服务器上的提交直接合并到你的代码中:
- 先把你本地提交的代码放到一边
- 然后把服务器上的改动下载下来
- 然后在本地把你之前的改动再重新一个一个地做 commit,直到全部成功
如果有冲突,那么你要先解决冲突,然后做 git rebase --continue
引入“功能分支”。这个协同工作流的开发过程如下:
- 首先使用 git checkout -b new-feature 创建 “new-feature”分支
- 然后共同开发这个功能的程序员就在这个分支上工作,进行 add、commit 等操作
- 然后通过 git push -u origin new-feature 把分支代码 push 到服务器上
- 其他程序员可以通过git pull --rebase来拿到最新的这个分支的代码
- 最后通过 Pull Request 的方式做完 Code Review 后合并到 Master 分支上
但是在生产环境中,这样的开发也是没有办法满足需求的,所以我们出现了一个 GitFlow 协同工作流,但是由于 git flow 太复杂,很乱,所以后面又有了 GitHub Flow 。
其中有个问题就是因为分支太多,所以会出现 git log 混乱的局面。具体来说,主要是 git-flow 使用git merge --no-ff来合并分支,在 git-flow 这样多个分支的环境下会让你的分支管理的 log 变得很难看。
所谓 GitHub Flow,其实也叫 Forking flow,也就是 GitHub 上的那个开发方式。
- 每个开发人员都把 “官方库” 的代码 fork 到自己的代码仓库中。
- 然后,开发人员在自己的代码仓库中做开发,想干啥干啥。
- 因此,开发人员的代码库中,需要配两个远程仓库,一个是自己的库,一个是官方库(用户的库用于提交代码改动,官方库用于同步代码)。
- 然后在本地建 “功能分支”,在这个分支上做代码开发。
- 这个功能分支被 push 到开发人员自己的代码仓库中。
- 然后,向 “官方库” 发起 pull request,并做 Code Review。
这就是 GitHub 的工作流程。
如果你有 “官方库” 的权限,那么就可以直接在 “官方库” 中建功能分支开发,然后提交 pull request。通过 Code Review 后,合并进 Master 分支,而 Master 一旦有代码被合并就可以马上 release。
这是一种非常 Geek 的玩法。这需要一个自动化的 CI/CD 工具做辅助。是的,CI/CD 应该是开发中的标配了。
关于 CI/CD action 可以看这篇文章,当然,所有笔记在上面的仓库中都有介绍,有心人自然能找到。
我们知道软件开发的趋势一定是下面这个样子的:
-
以微服务或是 SOA 为架构的方式。一个大型软件会被拆分成若干个服务,那么,我们的代码应该也会跟着服务拆解成若干个代码仓库。这样一来,我们的每个代码仓库都会变小,于是我们的协同工作流程就会变简单。
对于每个服务的代码仓库,我们的开发和迭代速度也会变得很快,开发团队也会跟服务一样被拆分成多个小团队。这样一来, GitFlow 这种协同工作流程就非常重了,而 GitHub 这种方式或是功能分支这种方式会更适合我们的开发。
-
以 DevOps 为主的开发流程。DevOps 关注于 CI/CD,需要我们有自动化的集成测试和持续部署的工具。这样一来,我们的代码发布速度就会大大加快,每一次提交都能很快地被完整地集成测试,并很快地发布到生产线上。
我在想,是否有一种工作流,可以面对我们现实工作中的各种情况。但是,我想这个世界太复杂了,应该不存在一种一招鲜吃遍天的放之四海皆准的银弹方案。所以,我们还要根据自己的实际情况来挑选适合我们的协同工作的方式。