大家好,我是coderh,身为一个光荣的前端开发工程师(假的),Git在我们日常使用中非常的频繁。 这篇文章简单易懂 ,涵盖了开发中遇到的大部分问题,那就随着我大概过一遍Git吧
Git
git众所周知,被称之为分布式版本控制管理系统,看这个词分布式版本控制
就很明确,下面我将从这两个词来更深的理解一下git。
分布式
有分布式就有集中式,SVN 是之前最热门的集中式版本控制系统,而Git是一种分布式版本控制系统,每个用户都有完整的代码副本 。而SVN是一种集中式版本控制系统,所有代码都存储在中央服务器上。两者都可以完成代码的提交,拉取和分支等操作。
但是集中式有很明显的缺点就是,集中式因为所有的操作(分支合并和提交)记录都存储在远程服务器中,如果服务器的磁盘一旦损坏(没有备份 ),虽然可以通过本地的代码,将仓库代码恢复到最新,但还是会损失掉所有的操作记录,包括回滚,分支等内容。
而git则采用的是分布式管理,当进行git pull 和 git clone 等操作的时候,不仅会把最新的代码拉取下来,还会把远程仓库的镜像也一同克隆下来。这样的操作,不仅可以在服务器磁盘损坏的情况下进行代码恢复,更重要的是,因为分布式,可以在本地进行分支的创建,合并,删除等操作,而无需在远程服务器上进行操作,速度更快,尤其是在多人协同开发的情况下更为明显。
版本控制
让我们先听一下,chatGPT的解释.
版本控制是一种管理文件和项目代码的系统,它记录文件的修改历史并允许用户跟踪、回溯和管理这些修改。通过版本控制,团队成员可以协同工作,保留文件的历史记录,并轻松管理代码的不同版本。
从上面这句话不难看出,版本控制主要是为了项目开发中保存历史记录以便在项目出现问题的时候进行快速回滚 ,同时在多人协同工作的时候,也可以将多人的提交进行合并比较,一旦出现问题还会显示冲突,大大的提高了团队协作能力(而无需去复制粘贴,一行行去比对差异)
命令实操
好了,我们对git也大概有个了解了,也知道git做了什么东西,下面我们假设入职一家新公司,来对git命令一一实践
当你入职一家新公司,并领了一台新电脑,领导看你入职手续都办完了,让你去改系统的几个bug。
首先要去官网下载git和其他的开发工具。
当你设置好之后,我们来敲第一个git命令,设置全局提交的名称和email
shell
git config --global user.name "coderh"
git config --global user.email "coderh@qq.com"
无论自己是不是新领到的电脑,都需要敲这个命令来保证代码是自己提交的(不建议设置同事的name去写bug)
好了,设置好名称和email之后,我们可以使用以下命令来拉取代码
shell
git clone https://your.git.address
git 拉取代码需要进行身份验证,有两种方式,一种是输入账号和密码通过http凭证 (credential)的方式来进行验证,另外一种则是使用ssh公钥和私钥的方式来进行验证。
我们先使用账号密码来进行拉取,代码拉取到了以后,通过丧心病狂的开发之后,解决了领导交给你的bug。那么我们则需要将这个请求推送到git上去,以便让其他人拉取最新代码。
先查看一下现在的git工作空间状态
shell
git status
有点多啊,使用简便的版本!
shell
git status -s
shell
git add .
git commit -m "fix():我解决了这个bug!"
git pull
git push
命令输入完,松了一口气,静静等待代码提交上去,但是突然出现的报错,告诉你,暂时还不行。
permission denial,没有权限进行改写,你去问你的领导,原来是因为所有人开发都需要去派生,合并的方式去开发,而且只有领导审核通过之后,才可以合并。这个是防止他人因为粗心大意直接merge到主仓库,导致系统崩溃。
你知道了缘由,直接去git操作页面上进行派生仓库操作,于是你拿到了一个新的仓库地址,http://coderh/git.address
。
于是你开始了下面的操作,首先查看一下目前的远程分支
shell
git remote -v
然后修改一下默认远程仓库的地址,并将之前的仓库地址设置为上游仓库
shell
git remote rename origin upstream
git remote add origin http://coderh/git.address
git add .
git commit -m "fix():我解决了这个bug!"
git push
看着出现的提交页面,心里终于舒服了,上游的分支也更新了,顺手合并到本地
shell
git fetch upstream
git merge upstream/develop
这命令太长了,简单点
shell
git pull upstream develop
还好git pull 把git fetch 和git merge合并了,要不然多麻烦啊
好像还有其他git命令合并来着,算了暂时先这样吧,领导先让我开一个项目,git仓库没东西啊
你有两种选择,一种是先clone仓库,然后clone之后再进行代码修改,好处就是,简便,快!
shell
git clone https://your.git.address
第二种则是将现成的代码推送到仓库中去 ,会有点麻烦,因为git merge 是需要两个分支有相同的base情况下才可以进行推送,如果要强行推动的话,需要添加修饰符 --allow-unrelated-histories
shell
git init
git remote add origin https://your.git.address
git branch --set-upstream-to=origin/main
git add .
git commit -m "feat():项目初始化"
git pull
git merge origin main --allow-unrelated-histories
git push
咋还是出现错误了,奥,原来本地是master分支,远程仓库是main分支啊,好吧.我改变一下本地分支的名称
shell
git branch -m master main
我就是死心眼,我也就是不改本地分支名称(治标不治本)
shell
git push origin master:main
修改push.default默认推送,从simple改为upstream (将push推送到上流分支,需要配合--set-upstream
使用)
shell
git config push.default upstream
以上只是取巧的办法,还是建议大家与上游分支名称一致
好了,终于推送上去了,现在来创建一个分支,来作为开发分支
shell
git branch develop
git checkout develop
命令太长了?不如试试以下任何一种
shell
git checkout -b develop
git switch -c develop
那如何把分支推送上去呢?
shell
git push --set-upstream origin develop
命令太长了,不想看!给个命令少点的
shell
git push origin devleop
开发结束了,这个分支可以进行提测了,咋办
shell
git switch -c release
git merge feature
git push origin release
git branch -d feature
git push -d origin feature
开发到一半,客户不要这个需求了?
shell
git branch -D feature
麻蛋,又想要了?(可以不用全写,只写16位校验码的前几个)
shell
git checkout -b feature 00987
git tag
开发了这么长时间,终于可以发版了,打个标签,来标注一下
shell
git tag v1.0.0
打个tag顺便描述一下这个版本
shell
git tag -a <tag名称> -m "<描述>"
如何查看这个tag详细信息呢
shell
git show <tag名称>
推送到服务器呢?
shell
git push origin v1.0.0
那总不能要是有多个标签,一个个推送吧
shell
git push --tags
这个tag我不想要了,远程删除和远程删除分支命令大概一致 git push -d origin tag.name
shell
git tag -d v1.0.0
查看远程仓库存在的tags
shell
git ls-remote --tags
查看指定远程仓库存在的tags
shell
git ls-remote --tags origin
每次输入git add 和git commit 太麻烦了!(只能在文件处于修改状态的情况下使用,对于未跟踪文件不适用)
shell
git commit -a -m "fix():直接从未跟踪变为提交状态"
写了半天bug,这一轮提交的代码一个都不想要了
shell
git reset --hard HEAD^
那要是不要前几个呢?
shell
git reset --hard HEAD${n}
每次都要写chekout,字符这么多!
csharp
git config --global alias.co checkout
以后就可以使用co
来代替checkout
命令了,真好
看一下自己提交的日志
shell
git log
内容太多了,太乱了,简洁一点!
shell
git log --pretty=oneline
还是有点乱
shell
git log --pretty=oneline --graph
那如何查看之前全部的操作记录呢?(包括创建分支和删除分支)
shell
git reflog
又遇到一个问题,如何快速的创建一个分支,并追踪上游分支呢?
shell
git checkout -b develop --track origin/develop
也可以使用以下命令更简洁
shell
git checkout --track orign/develop
还是太长?(在本地分支找不到develop的情况下,会寻找上游develop分支并创建一个跟踪上游分支的相同名字)
shell
git checkout develop
如何查看本地分支呢?
shell
git branch
远程呢?
shell
git branch -r
本地和远程我都想要!
shell
git branch -a
我要看远程仓库origin的全部信息!
shell
git remote show origin
之前不想要的提交已经推送到远程分支了,git push 不上去怎么办
shell
git reset --hard HEAD^
git push
会提示以上错误代码,让你先拉取然后在拉取后的分支进行修改,而且使用git push origin newHome 也完全不生效
但是有的时候就是想要完全放弃上次提交的所有代码,不如添加一个修饰符试试
shell
git push -f origin newHome
-f的官方含义是git push -f
命令用于强制推送本地提交到远程仓库 ,但慎用,以免破坏提交历史或影响其他人的工作
路还很长
其实这只是git内容较少的一部分,git内容很多,不要靠死记硬背去学习git,要了解其原理,学习起来就简单很多了。大家可以自行了解在日常工作开发流程使用的git flow ,还有让提交记录更加线性化的git rebase操作。
我写完之后,应该会有人说,我为啥要记这么多命令呢?闲的我?我直接用vscode的插件可视化提交和查看!
其实我是赞同你的,在面试官问我之前,我也这么想。但是吧,凡事不能这么想,理解原理才能更好的排查错误,很难想象在一年前的今天,我甚至感觉分支都很难,HEAD指向,更是啥也不懂,这也不是慢慢学,慢慢的敲,才能将开发中遇到的问题一点点的搞清楚,弄明白。才能成为更好的前端开发工程师
了解原理,才能拥有更大的自由,虽然我还有很长的路要走。