Git Learning End Version
Git Learning Notes from 廖老大!
简介
Git是目前世界上最先进的分布式版本控制系统。
入门
推荐一个个人认为讲得很不错链接吧
该讲师以类比于Tesla汽车公司的方式,给大家解释git的使用方法,以及GitHub的平台逻辑
https://www.bilibili.com/video/BV1wW41167wR?t=478
诞生
BitKeepe
Git –基于C
集中式 与 分布式
- 集中式:
需先从中央服务器获得最新版本,改后交由服务器整合。—-联网工作 - 分布式:
每个人的电脑上都是一个完整的版本库,各个电脑可相互推送修改内容。—-不必联网
所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的详细变化,Microsoft的Word格式是二进制格式
Git安装
- 官网下载https://git-scm.com/downloads
已安装可通过Git本身获得最新的开发版本git clone https://github.com/git/git
- 设置 -指定仓库的用户名和Email地址
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
创建版本库(仓库)
- 创建目录
- 初始化git
git init
- 添加 readme.txt 文件到git仓库
1
2
3
4git add file1 //git命令必须在git仓库目录中运行
git add file2 //add 文件时改文件必须在当前目录存在
... //可以一次提交多个文件
git commit -m "有意义的提交说明"注意不要使用记事本编写!!!!不要使用记事本编写!!!!不要使用记事本编写!!!! 安装notepad++
实时掌握工作区状态
1 | git status //显示当前工作区的更改状态(判定是否有差异 差异对象目前不懂) |
版本更替
- 查看
git log [–graph] (该参数可查看分支合并图)
星号表示一个commit, 注意不要管*在哪一条主线上
|表示分支前进
/表示分叉
\表示合入查看从当前版本开始最近到最远的提交记录
记录commit_id版本号
id:SHA1计算出来的一个非常大的数字,用十六进制表示,用于区分不同commit版本
- 回溯
git reset –hard commit_id (绝对)
git reset –hard head^ (相对)
- 相对head指针指向的版本 ^个数为相对于当前head指向版本的上..版本
- head~100 相当于 head^^^^(100个)
- 未来
- git reflog
- 查看所有commit版本历史 确定即将更替版本的版本号
4.20
工作区与暂存区
工作区(本地)
用户可视的目录
版本库
.git隐藏文件为版本库
暂存区 stage
git add filename 指令将文件修改添加到暂存区中
master分支
git commit -m “说明” 将暂存区中的提交记录一并提交至master分支中
- 注意是将暂存区的修改记录提交,若进行了第二次更改未添加至暂存区,则无法直接与第一次修改一并提交至master分支中
指向master分支的head指针
git diff 总结
git diff查看工作区和暂存区差异
git diff –cached查看暂存区和仓库差异
git diff HEAD 查看工作区和仓库的差异
– filename 可指定查看具体文件在不同区的差异 有空格呢
撤销修改
git checkout – filename 撤销工作区的修改 实际上是使用版本库最新版本替代工作区版本
git reset head filename 撤销暂存区的修改
git reset –head commit_id(head) 版本回退 撤销已提交但未推送到远程库的修改
删除文件
git rm filename
git checkout – filename 对于已经提交的文件,误删后可恢复
从来没有被添加到版本库就被删除的文件,是无法恢复的!
4.21
远程库
关联远程库
git remote add origin [http|ssh秘钥]
要关联一个远程库,使用命令git remote add origin [http|ssh秘钥]
或者在.git目录下 config文件中直接修改url为[http|ssh秘钥]即可
关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名
推送分支至远程库
git push origin master
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后通过git push origin master推送最新修改;
查看远程库信息
git remote -v
“删除”远程库
git remote rm name
此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。
克隆远程库
git clone [http|ssh秘钥]
待更新
4.22
分支管理
查看分支:git branch [-a] -a参数可查看远程分支
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
- 合并冲突
手动解决冲突文件后重新add后提交
删除分支:git branch -d
删除远程分支:git push origin –delete dev
强行删除未被合并的分支: git branch -D
4.29
分支管理补充
对于所有的分支而言,工作区与暂存区是公共的,所以在其他分支作的更改但是未add,commit的内容同样会在其他分支中呈现
分支管理策略
合并分支
- Git默认Fast forward模式,删除分支后,会丢掉分支信息(其他分支的commit信息将丢失)
强制禁用Fast forward模式,添加–no-ff参数,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev
4.30
BUG分支
Untracked files (未被追踪的文件): 从未add到暂存区的文件
Changes not staged:已被add到暂存区但是最新更改未add
原则: commit的内容应该是当前版本的较完善版本,未完善的存在bug的内容不应该commit,否则即使最新commit修改了之前bug,但是用户仍可以通过log访问到未完善版本。
修改BUG: 创建bug分支,修改bug后,合并到主分支即可
注意: 如果当前正在其他分支工作,突然需要修改紧急bug,需要切换到master分支修改bug,并先提交修改bug后的版本(不应包含当前工作分支的内容),但是本地工作区与暂存区为所有分支共享,如果当前分支所作更改不进行add-commit操作,则当前分支所作更改在其他分支仍然可见(可见代表其他分支也会不可避免的add-commit当前分支对项目所作的更改),关键是这部分内容不能提交啊(代码太那啥),所以我们可以先把当前分支的更改”藏匿”到缓存堆栈中,这样其他分支尽情提交而看不到本分支修改内容,待master分支修改完bug并commit后,回到本分支取出,继续更改即可。
git stash [save ""]
把所有未提交的修改(包括暂存的和非暂存(Changes not staged)的)都保存起来(当前目录就变干净),用于后续恢复当前工作目录。
保存之前确定无Untracked files,因为git stash不能将未被追踪的文件(Untracked file)压栈
git stash list
查看现有stash缓存堆栈内容git stash pop
将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下。git stash apply
将缓存堆栈中的第一个stash应用到工作目录中,但并不删除stash拷贝git stash drop
默认删除缓存堆栈中第一个stash
Cherry_pick 与 merge
git cherry-pick commit_id
就是将指定的提交(commit)应用于其他分支,这会在当前分支产生一个新的提交.
代码冲突
- –continue
用户解决代码冲突后,将修改的文件重新加入暂存区,第二步执行如下命令,让 Cherry pick 过程继续执行。git cherry_pick --continue
- –abort
发生代码冲突后,放弃合并,回到操作前的样子。git cherry_pick --abort
- –quit
发生代码冲突后,退出 Cherry pick,但是不回到操作前的样子。git cherry_pick --quit
注意:两者均为将新分支更改更新至当前分支,但是merge会将整个分支的文件更新,cherry-pick为将指定提交应用于当前分支
5.1
克隆仓库
- git clone [http|ssh秘钥]
整个仓库被克隆包括所有分支,但是最开始只能看到master分支,需要创建远程origin的对应分支到本地,才能看到对应分支git switch -c dev origin/dev
如果需要提交最新更改,不要直接使用原作者项目下的秘钥,否则没有操作权限,需要fork到自己仓库下,再clone
推送分支
git push origin <branch-name>
将本地某个分支的更新推送到远程库
抓取分支 建立关联
git pull <远程库名> <远程分支名>:<本地分支名>
取回远程库某个分支的更新,再与本地的指定分支(默认当前分支)合并。- git pull = git fetch + git merge
注意: 抓取分支之前,可以先指定本地分支与远程对应分支的链接,建立关联
git branch --set-upstream-to=origin/dev dev
关联目的: 如果在本地分支下进行pull 和push操作时 ,便不需要指定远程的分支。
标签
创建标签
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
git tag tagname
默认给当前分支的最新提交打上标签git tag
查看所有按字母排序的标签git show tagname
查看标签的详细信息git tag -a tagname -m “说明文字” commit_id
为指定commit打上名为tagname的带有说明文字的标签
操作标签
- 命令
git push origin <tagname>
可以推送一个本地标签; - 命令
git push origin --tags
可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>
可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
经历总结
看大佬都是一两天看完,惭愧哈哈哈,最近社团,考试(考的稀碎),比赛等等实在是抽不出来时间更新笔记了,只能是拿每天零碎的时间更新一下,好在五一放假有更多的自由时间来完善,很舒服啊,总算是结课廖雪峰老师的git了,终于不用再百兆百兆的保存原始项目了!起飞好吧。