廖雪峰Git教程—学后笔记
本文是看完廖雪峰Git教程后,做的一个教程笔记,方便自己查阅。
廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/896043488029600/896067008724000
一、创建版本库
git init 初始化一个git仓库
git add file—name 添加文件到git暂存区
git commit -m“说明描述” 提交文件到git仓库
二、时光穿梭
1.查看状态
git status 查看git仓库的当前状态,文件是否被修改过
git diff 查看文件被修改的地方
2.版本回退
git log 查看当前版本之前的提交日志,包括每次提交的:版本号、作者、日期、提交说明
HEAD 指向当前版本
git log --pretty=oneline 查看之前commit日志,包括每次commit的:版本号、提交说明
git reset --hard HEAD^ 退回上一个版本,HEAD指向上一个版本
git reset --hard HEAD^^ 退回上上个版本,HEAD指向上上个版本
git reset --hard HEAD~10 退回前10个版本,HEAD...
cat file-name 显示文件内容
git reset --hard 版本号 回到指定版本
git reflog 查看历史提交/切换日志,包括:版本号、提交说明
3.工作区和暂存区
工作区——>git add ——>暂存区——>git commit——>分支master/版本库
Git是跟踪修改的,每次修改,如果不用git add到暂存区,那就不能用commit提交到master分支上。
总结:修改暂存区:命令前加git,eg: git add /git rm
修改版本库:先修改暂存区,然后统一git commit即可
4.管理修改
每次修改,必须先用 git add 到暂存区,然后再 git commit 到版本库中。
5.撤销修改:
场景1:只是在工作区修改
git checkout -- file_name 把文件在工作区的修改全部撤销,使其恢复到最近一次add、commit的状态
场景2:在工作区修改 + add到暂存区
git reset HEAD file_name 把文件在暂存区的修改全部撤销,使其恢复到工作区被修改的状态
git checkout -- file_name
场景3:在工作区修改 + add到暂存区 + commit(前提:你没有push到远程库)
git reset --hard HEAD^ 直接退回上一个版本
6.删除文件:
1.工作区删除:rm file_name 删除文件夹:rm -r name
1.暂存区删除:git rm file_name 删除文件夹:同上
2.版本库中删除:git rm file_name + git commit -m"说明"
3.将远程库的文件/文件夹删除,但本地保留:
git rm -r --cached file_name
git commit -m""
git push -u origin master
7.恢复误删的文件:
场景:文件已提交到版本库,但工作区的误删除了,要恢复
git checkout -- file_name 用版本区的版本替换工作区的版本
三、远程仓库
1.设置SSH Key:本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以要设置SSH Key
(1).创建SSH Key:过程略
(2).添加ssh key到GitHub
2.在GitHub上创建新仓库:略
3.关联本地库和github仓库:其实就是在本地库使用git命令添加远程主机+远程仓库
(1) git remote add origin git@github.com:Github用户名/Github仓库名.git
(2) git remote add origin https://github.com/Github用户名/Github仓库名.git
优先选用第一种方法,速度快
git remote add origin git@gitlab.liquidnetwork.com:wanghailin/sklearn.git
4.将本地库同步/推送到远程库: 将本地库的当前分支与远程库的远程分支关联
第一次同步:git push -u origin master
以后的同步:git push origin master
5.如果远程库是空的,可以直接将本地库的文件push到远程库
如果远程库非空+远程分支和本地分支相关,需要用git pull origin master先把远程库的最新branch拉到本地库,与本地库的master合并,然后再git push
如果非空+不相关:git pull合并分支失败,则要用:git pull origin master --allow-unrelated-histories + git push
6.git push命令的区别:
(1)git push <远程主机名> <远程分支名>:一般,远程主机名为origin,分支名为master,即git push origin master
(2)git push -u origin master:将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了
(3)git push:-u指定了默认主机+默认分支,或者当前分支只追踪一个远程分支,则可以省略主机名+分支名
5.将远程库克隆到本地库: git clone git@github.com:Github用户名/Github仓库名.git
NOTE: (1)remote/origin都表示远程主机名
(2)git clone 不需要git init
7.git clone、git pull和git fetch的用法及区别:详情见收藏文件夹
(1)git clone <版本库的url>:
本地无需git init,直接将远程仓库clone到本地,包括被clone仓库的版本变化
(2)git pull <远程主机名> <远程分支名>:<本地分支名>
git pull = git fetch + git merge,即将远程仓库的分支拉取下来与本地当前分支合并,
(3)git fetch
更新远程代码到本地仓库,但没有合并
四、分支管理
1.理解分支:工作区——> add ——>暂存区——> commit——>分支master/本地版本库——> push ——>远程库
在开发新功能时,你如果每天都把未完成的新版本都commit到master分支上,会影响master的程序,所以你可 以创建一个新分支,每次都把新版本commit到新分支,待程序完成之后,再将新分支合并到master分支上
1.1 疑问:只把新版本commit到本地库,不push到远程库,不就行了???等开发完毕,再统一push到远程库???
2.创建和合并分支:
git checkout -b dev 创建并切换到dev分支
相当于两条命令:
git branch dev 创建分支dev
git checkout dev 切换到分支dev
git branch 列出所有分支,并用*标明当前分支
git add file—name
git commit -m“说明描述” 此时是在dev分支上提交
git checkout master 切换到分支master,此时查看文件,添加的内容消失
git merge dev 将分支dev合并到master
疑问:合并是求两个分支的并集吗???
git branch -d dev 删除分支dev
3.解决冲突:当待合并的两个分支内容相互冲突时,git merge branch_name,显示合并失败
Cat file_name 查看文件内容,Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
将合并失败的部分修改后,再合并
git log --graph 查看分支合并图
4.分支管理策略
git merge --no-ff -m "commit说明描述" dev ?????
master分支:应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
dev分支:干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到 master上,在master分支发布1.0版本;
个人分支:每个人都有自己的分支,时不时地往dev分支上合并就可以了
个人理解:master分支上只能创建dev分支,用于干活,其他个人分支都是在dev分支上创建的,也就是说,master分支只和 dev分支相连。
5.bug分支
git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作
git checkout master 切换到master分支
git checkout -b issue-101 建立并切换到bug分支,修复bug
git add ~
git commit -m“” 提交
git checkout master 切换到master分支
git merge --no-ff -m "merged bug fix 101" issue-101
git stash list 查看保存的工作现场列表
git stash apply 恢复保存的工作现场,但stash内容不删除,要用 git stash drop 来删除
git stash pop 恢复保存的工作现场,同时把stash删除
个人疑问:
1.实验证明,在dev分支没有提交的时候,是可以切换到master分支上新建bug分支的。 好像不是???
2.那为什么不直接切回到master分支上,新建bug分支,修复bug,合并到master,再切回dev分支工作不就行了????
3.为什么还非要stash一下??意义何在???
解答: 1.实验证明,在dev分支的修改没有commit/stash的时候,不能切回到master分支上
2.所以在master上新建bug分支,必须先在dev上stash,才能切回到master分支上
3.实验证明,在dev分支的修改没有commit/stash的时候,可以在dev分支上新建并切换到新分支
6.feature分支:
个人理解:
1.bug分支<——master分支——>dev分支——>个人分支,一般的,新分支在哪个分支上建立的,删除时就要在其对应的分支上删除。
2.一般情况下,分支只有被合并后才能删除。如果新分支没有被合并就需要删除,需要强制删除
git branch -D branch_name 强制删除分支
7.多人协作
git remote 查看远程库的信息
git remote -v 查看远程库更详细的信息
git push origin branch_name 将分支推送到远程库/同步
master分支: 是主分支,因此要时刻与远程同步;
dev分支: 是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支: 只用于在本地修复bug,没必要推到远程,修复完毕后直接合并到master分支即可
feature分支:是否推到远程,取决于你是否和你的小伙伴合作在上面开发。如果feature是个人开发,则不用推送,开发完毕直接合并到 master即可
git clone git@github.com:Github用户名/Github仓库名.git 抓取远程仓库到本地,默认情况下,抓取后的本地仓库,只能 看到本地的master分支
git branch 显示只有一个master分支
git checkout -b dev origin/dev 抓取dev分支到本地:创建并切换到dev分支,且dev分支是 远程库的dev分支
NOTE: git clone 本地后,先cd到本地仓库后,再抓取dev分支到本地。然后就可以在dev分支上开发,并push到远程
在dev分支上修改,提交后,push到远程仓库。然后另一个人也同样在本地的dev修改,提交,push到远程.push失败,因为远程仓库包含了本地没有的内容,原因是有其他人push,同步了远程仓库和其他本地库。
解决方法:先用git pull把最新的提交从origin/dev抓下来,然后在本地merge,解决冲突,在push
git branch --set-upstream-to=origin/dev dev 设置dev和origin/dev的链接
git pull git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一 样。解决后,提交,再push
8.多人协作模式的总结:
(1)首先,可以试图用git push origin <branch-name>推送自己的修改;
(2)如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
(3)如果合并有冲突,则解决冲突,并在本地提交;
(4)没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
9.Rebase
git rebase 把本地未push的分叉提交历史整理成一条直线,使其看上去更加的直观
五、标签管理
1.理解:每次commit都是一个版本,对应一个版本号,版本号是一连串的数字,不便于交流,所以有了标签/tag
eg: commit_1 版本号:6a5819e... tag:v1.2
2.创建标签
git branch 查看分支
git checkout branch_name 切换到想打tag的分支
git tag tag_name 打标签(默认对该分支的最新commit打标签/HEAD)
git tag tag_name 版本号 对版本号对应的commit打标签
git tag -a tag_name -m"说明" 版本号 同上,并带有说明
git tag 查看所有标签
git show tag_name 查看标签信息,有说明的标签,可以看到说明信息
3.操作标签
git push origin tag_name 推送一个本地标签
git push origin --tags 推送所有未推送过的标签
删除标签:
(1)git tag -d tag_name 删除一个本地标签
(2)git push origin :refs/tags/tage_name 删除一个远程标签
六、使用GitHub
别人的github仓库 ——> fork ——> 自己的github仓库 ——> clone ——> 本地仓库 ——> 修改
别人的github仓库 <—— request <—— 自己的github仓库 <—— push <—— 本地仓库 <——
七、使用码云
1.码云:国内的git托管,功能和github相同,但是比github速度快
2.添加公钥:和github相同
3.关联: git remote add origin git@gitee.com:Gitee用户名/Github仓库名.git
但是会显示关联失败,因为本地库learn已经关联到github了
git remote -v 查看远程库的信息
解决方法:
(1)先删除本地库和github的关联,再关联本地库和gitee的远程库
git remote rm origin 删除本地库和远程库的关联
git remote add origin git@gitee.com:Gitee用户名/Github仓库名.git 再关联本地库和gitee的远程库
git remote -v 查看此时的远程库信息
(2)本地库同时关联两个远程库:github + gitee
git remote rm origin 删除本地库和远程库的关联
git remote add github git@github.com:hailin2018/learn.git 关联本地库和github
git remote add gitee git@gitee.com:hailin2018/learn.git 关联本地库和gitee
git remote -v 查看此时的远程库信息
4.push:
NOTE: remote/origin都表示远程库
git push origin branch_name 将分支推送到远程库/同步,远程库名称为关联时定义的origin
git push github master 将master分支推送到github远程库
git push gitee master 将master分支推送到gitee远程库
八、自定义Git
1.git config --global color.ui true 让git显示颜色
2.忽略特殊性文件:
问题:有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,每次git status都会显示Untracked files
办法:(1)在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
(2)把.gitignore也提交到Git
3.配置别名/简化命令
eg:
git config --global alias.st status 简化 status 为 st
git config --global alias.ci commit 简化 commit 为 ci
git config --global alias.br branch 简化 branch 为 br
git config --global alias.unstage 'reset HEAD'
4.配置文件
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用
用户的git配置文件在用户主目录(admin)下的一个隐藏文件.gitconfig中
仓库的Git配置文件都放在.git/config文件中:
删除别名,直接删除对应的行即可
5.搭建gig服务器
在远程仓库一节中,我们讲了远程仓库实际上和本地仓库没啥不同,纯粹为了7x24小时开机并交换大家的修改。
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。