导读:
这是我的第一篇CSDN博客,希望在学习的过程中不断记录。这个暑假的学习任务基本上是由导师安排的,以及自己的数学建模也在进行中。想记录通过自己思考的学习内容,记录每次收获的新的启发,已经攻克的点,或者还没有攻克的点。
正文:
Git: 分布式 版本控制系统
作用:自动记录每次文件的改动+让同事协同办公
优势:因为Git跟踪并管理的是修改,而非文件
windows安装:官网下载Git——>安装Git——>设置账户
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
小知识点:
提到分布式自然会想到其对立的集中式。集中式的版本控制系统有CVS,SVN等,然而因为集中式具有速度慢以及联网才能使用的两大缺点因此被分布式取代。大致的形象化了一下:
常见命令:
git status
掌握当前状态
git diff
查看修改内容
git log
显示从最近到最远的提交日志
可以试试加上–pretty=oneline参数
git reset --hard HEAD^
回退到上一个版本
在Git中,用HEAD表示当前版本,上一个版本就是HEAD ^,上上一个版本就是HEAD ^ ^,当然往上100个版本写100个 ^比较容易数不过来,所以写成HEAD~100
git reset --hard 1094a
可以指定回到未来的某个版本(1049a是版本号)
git reflog
用来记录每一次命令
重点add+commit
命令
但是我还是想废话一下,在此之前我建议你先学习一下如何使用git bush 进入某某盘的某某文件夹下,不然的话你的第一个目录很可能和我一样直接建立在桌面了,但是为了保持桌面的整洁,还是放在d盘吧。
$ cd d:
在讲add和commit命令之前我们先来了解一下如何创建自己的版本库(仓库/目录),官网上的命令如下:
$ mkdir learngit
$ cd learngit
$ pwd
pwd命令用于显示当前目录。
git init
把这个目录变成Git可以管理的仓库
git add readme.txt
把文件添加到仓库(执行上面的命令,没有任何显示)
git commit -m "wrote a readme file"
把文件提交到仓库
原理:
工作区是在我们电脑上能够看见的目录,工作区里面有隐藏的版本库(.git),版本库里面有暂存区(index/stage)和自动创建的第一个分支(master)。
所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改
第一步git reset HEAD <file>
第二步按场景1操作
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退
一节,不过前提是没有推送到远程库
删除文件
删除:直接用文件管理器删除或者用命令$ rm test.txt
确认删除?:一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:$ git checkout -- test.txt
远程仓库
实际情况往往是这样,找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub
账号,就可以免费获得Git远程仓库。
由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要一点设置:
第1步:创建SSH Key,在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件(这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人),如果已经有了,可直接跳到下一步。如果没有,Windows下打开Git Bash,
ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
第2步:
登陆GitHub,打开“Account settings”,“SSH Keys”页面,
点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
点“Add Key”,你就应该看到已经添加的Key
敲重点!一定要确定ssh设定好了,不然等下提交会报错。
第3步:
- 在github上面Create a new repository。(setting最后面是delete)。
- git bush进入本地的learngit文件夹中,运行如下命令
git remote add origin git@github.com:你的名字/learngit.git
- 把本地库中的所有内容推送到远程库中
git push -u origin master
一点小贴士:一定要认真仔细啊!不要输错任何一个字母,不然等下就会花费大量的时间来弥补这些“小错”,还有就是你可能忘记ssh的密码,可自行百度。
第4步(clone):
git clone git@github.com:你的名字/gitskills.git
分支管理
知识储备+命令:
master主分支是一条线,head指向master确定当前的分支
创建新的分支dev,把head指向dev分支
$ git branch dev $ git checkout dev
或者
git checkout -b dev
(-b参数表示创建并切换)
查看当前分支:git branch
(当前分支前面会标一个*号)
对dev分支进行工作区的修改和提交
把dev分支合并到master上,就是把master指向dev的当前提交,并删除dev分支,留下主分支 $ git merge dev
$ git branch -d dev
查看当前分支:git branch
最新版本的Git提供了新的git switch命令来切换分支:$ git switch -c dev
直接切换到已有的master分支,可以使用$ git switch master
。
小结:
查看分支: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>
解决冲突:
冲突:master分支和feature1分支各自都分别有新的提交
我们可以直接查看readme.txt的内容:
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,
我们修改后保存再提交:
用git log --graph
命令可以看到分支合并图。
分支管理策略:
通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master分支
应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev分支
上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支
,时不时地往dev分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
Bug分支
修复bug时,我们会通过首先确定要在哪个分支上修复bug,创建新的bug分支,进行修复,提交,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再用git stash list
查看工作现场,一是用git stash apply
恢复,但是恢复后,stash内容并不删除,你需要用git stash drop
来删除;另一种方式是用git stash pop
,恢复的同时把stash内容也删了。
可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:$ git stash apply stash@{0}
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
丢弃分支:
如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>
强行删除。
多人协作:
查看远程库的信息,用git remote
或者用git remote -v
显示更详细的信息
push推送分支:
- 首先,可以试图用
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>
。
fetch抓取分支:
- 从远程抓取分支,使用
git pull
,如果有冲突,要先处理冲突。
Rebase:
- rebase操作可以把本地未push的分叉提交历史整理成直线;
- rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
总结:
- 学习到分支管理一章节,我的git学习基本结束了,后面的教程等有时间的时候应该也会继续去还债的。
- 总体感觉而言,廖雪峰老师讲的还是很入门级别的,画风也很有意思,是入门的不二之选。
- 对于我的本次学习而言,是很早之前的任务了,但是当时没有怎么认真去看,水一水就过去了,现在重新梳理一下发现清晰了很多,操作起来也会更加得心应手。
- 不太能掌握的部分是版本冲突那边,还是不知道怎么具体去解决,希望能遇到一下这样的问题,亲自去解决一下。
- 第一期的学习笔记就到这里啦!大家下期再见!下一期会学习html+css基础。