主题:
git的使用。本篇主要是学习git时一些粗浅的学习笔记,可能后面会有更新。
因为不够全面。如果想要详细学的话,可以移步廖雪峰的git教程
内容:
-
git是一个版本控制系统,简单理解就是可以记录一个空间内被追踪文件的每次的修改。
git的下载安装很简单。直接用apt install git即可。
git需要建立一个respository,这个respository就是版本库,是git的监管区域,可以监管里面
的文件,respository建立需要 1 建立一个空文件夹,这是这个respository的专属空间
也可以使用一个已有文件的目录,这样的话,原来的原文件是不变的。使用init之后,这些文件需要进行add和commit,和init之后建立这些文件效果是一样的。2021520 -
使用git init来将这个空间进行改造成一个respository(也可以使用git clone来建立并克隆
一个其他地方的respository)这一部可以不在respository里面进行 -
在里面如果添加一个文件的话,需要先建立一个文件,然后需要 git add filename来说明 系统来监视这个文件的改动,否则,git不会自动来监视一个文件的改动。如果有文件不被监视,会在使用
git status看到用文字的提示
###################
未跟踪的文件:
(使用 “git add <文件>…” 以包含要提交的内容)
readme2.txt
###################
其次,还需要进行git commit来提交这个文件给这个仓库。
问题:git add和git commit 的联系是什么?为什么要有两个操作?
git add所做的操作就是
(1) 为作为参数的文件进行“快照”(快照是对于一个文件的记录,相当于一个
当前状态的记录,一个断点,可以用来恢复)
(2) 将快照的索引(通过计算文件的校验和来得到)放到暂存区域(其实就是一个用来暂时存放快照
索引的文件),方便之后可以将这些快照组织为一个commit对象然后保存为一次完整的快照。
git add是相当于将一些内容放到暂存区域内,为commit做准备。可以多次add,也就是将不同的内容
放到暂存区域,然后一次commit
git commit做的事:
(1)会创建一个commit对象,里面除了有作者相关信息,还有一个tree指针,指向一个tree
对象,tree对象包含每一个文件的快照的指针,因此这个tree就可以恢复所有的更改的文件内容。
当再次提交的时候,就再创建一个commit对象,此时会有一个parent指针,指向之前的commit
对象。 -
当一个文件处于监视列表,并且修改了的时候,如果没有进行add,也就是将内容加入暂存区域
会提示没有加入暂存区。如果add了,但是没有commit(提交)的话,会产生没有提交的变更的提醒(使用git status)。但是这个时候,已经可以使用git diff来查看
修改了那些内容了。(只要是修改了就可以使用git diff来查看修改的内容) -
git log可以查看commit版本,也就是可以恢复的版本有那些。没一个commit有一个commit id,commit记录是按照时间由前到后来进行显示的。
使用git reset可以进行回退或者到某一个版本(根据commit id)。git reset --hard HEAD^
表示上一个版本。HEAD表示当前版本。加几个^表示后退几个版本。
如果想要回到更为先进的版本的时候(前提是这个版本存在),可以使用commit id作为参数 -
对于没有add 或者 没有commit的修改,可以采用git restore 来删除工作区的修改,
也就是把工作区内的文件恢复为上次commit之前的时候,或者add之前(找到该文件的最近的快照)。
而git restore --staged 表示将当前暂存区的内容抛弃掉,不改变工作区的内容
当想要恢复到暂存区内的版本之前的版本(如果还没有进行commit的话),可以使用git reset HEAD 文件
来进行恢复。如果已经提交的话,那么就要用到版本回退。如果这个commit已经提交到远程
那么就不可逆转。 -
使用git来删除一个文件。一个工作区文件的删除,分为在版本库中删除还是在工作区中删除
因为在工作区中的文件的删除(rm)不会导致版本库的文件的删除。因此,如果只是rm删除一个文件的话,会留下一个记录,提醒。如果想要在版本库中删除的话,需要用git rm,然后进行commit就可以保存这个了。当然了,可以通过恢复commit版本来回复这个文件。 -
git支持远程版本库:也就是从一个远程主机上来托下来一个respository,然后在本地进行修改,制作成一个commit,然后再推送上去。同时也可以从远程主机上来找到别人的commit
步骤:
(1)通过git remote add 本地认为的远程库名字 链接(可以为ssh版本) 完成关联(这个关联作用区域只是这个respository,在别的respository可以重名,不会有问题:2021520)
(2)git push -u origin master可以完成本地仓库内容的推送到远程仓库中 -u参数只是第一次
需要,之后再次提交的时候不需要家-u,这个命令会完成本地的master和远程的master绑定
(3)之后在本地修改之后,git push origin master会将“最新”的commit推送出去
(4) git remote rm origin 可以删除这个连接,本地就访问不到了。 -
git支持多分支,也就是从当前的版本出发,创建一个新的分支,这个分支和原来的版本初始状态
是一致的,切换到这个分支之后,可以做修改,commit,不会影响主分支。主要是更加安全,
当分支已经做得很好了,然后再合并到master分支,否则直接不用合并到master分支即可。
不会对master分支造成影响。鼓励用分支来解决问题。
创建分支用git branch name 切换分支用 git switch brachname 也可以用
git switch -c b branchname 来完成创建和切换。
查看分支用git branch
合并某分支到当前分支:git merge name
删除分支:git branch -d name
有时候合并会有冲突,此时需要手工来进行修改冲突,也就是修改这个文件。然后进行add和commit,
然后将,当有的文件没有一个
加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并 -
git stash 可以保存当前工作区的内容,放到一个栈里面
然后可以去执行其它的任务。当执行回来之后,使用git stash pop来恢复,并删除工作区现场的
内容。git stash list可以查看在工作区现场栈里面有什么内容 -
一般开发时,master分支是稳定版本的发布分支,dev版本是开发版本的分支,到一定程度
dev会合并到master。每个开发人员的分支都是在dev下面的。合并到dev上
修复bug可以使用一个分支,修复完成之后,进行合并,删除bug分支。
增加新的特性功能时,建立一个feature分支,然后合并,删除分支 -
git push origin branchname可以完成 向远程的branch来推送最新的commit前提是 远程和本地的一个branch是存在关联的。
git branch --set-upstream-to branch-name origin/branch-name
可以完成本地的branch和远程的branch的关联。
其次,需要远程和本地的提交不存在冲突。如果存在冲突的话,需要先git pull下来,然后进行冲突的解决,然后再提交。 -
git支持打标签,也就相当于把某一个commit取了一个别名。一般是最新的commit打一个标签当然也可以是使用commit id来指定。
git tag tagname [commit id]还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字:
git tag -a v0.1 -m “version 0.1 released” 1094adb
使用git tag可以查看所有的tag
标签可以删除 使用git tag -d name
标签可以推送到远程
git push origin tagname
git push origin --tags可以一次性推送全部本地标签 -
在GitHub上,可以任意Fork开源仓库;
自己拥有Fork后的仓库的读写权限;
自己的版本修改之后,可以推送pull request给官方仓库来贡献代码。