Git是当前最流行的开源的分布式版本管理系统。
一、Git基础
1.创建版本库
初始化一个Git仓库,使用git init
命令。
添加文件到Git仓库,分两步:
- 使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m <message>
,完成。
2.版本修改
git status,查看工作区的状态
git diff,可以查看修改内容
3.版本回退
git log,查看版本历史记录,如果想只看关键信息,可以在后面补充参数 --pretty=oneline。Git 的 commit id 是SHA1计算出来的数字,十六进制表示。
HEAD 表示当前版本,即最新的提交,上个版本是 HEAD^, 上上个是HEAD^^,上100个版本为HEAD~100。
git reset --hard HEAD^,回退到上个版本
git reset --hard 某版本号,回退到某一版本,版本号可以写前几位就可以
git reflog,显示每一次命令,方便找到不知道版本号的之前版本
4.工作区和缓存区
工作区(working directory)就是在电脑上能看到的目录,如我的learngit文件夹
版本库(repository)指的是工作区里的一个隐藏目录.git,里面存了暂存区:称为stage(或index),还有自动创建的第一个分支master,以及指向master的一个指针HEAD。
git add,就是把文件修改添加到缓存区;git commit,就是把暂存区的所有内容提交到当前分支
5.管理修改
Git跟踪并管理的是修改,而非文件。
比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
6.撤销修改
场景1:想要丢弃工作区的修改时,用命令 git restore – file;
场景2:改乱了工作区的某个文件的内容,还git add了下,想要丢弃修改,先用git restore --staged file,然后再git restore – file
场景3:有些修改已经提交到版本库(但没有推送到远程库),想要撤销本次提交,可以版本回退
7.删除文件
在文件管理器里删除了文件,或者用命令rm file也可删除文件,然后用git rm file 来将file从版本库中删除。
二、Git进阶
1.GitHub账号设置
由于本地Git仓库和GitHub仓库之间的传输采用SSH加密,所以需要设置SSH公钥,GitHub识别了推送者的公钥后,才能确认是该操作者。邮件验证SSH key的时候生成的钥匙对,id_ras是私钥,id_rsa.pub是要设置的公钥。
2.远程仓库
2.1 添加远程仓库
首先要关联一个远程库:
git remote add origin git@server-name:path/repo-name.git
其中origin是默认习惯的远程库命名;然后用
git push -u origin master
第一次推送master分支的所有内容,此后,每次本地提交后,只要有必要,就可用该命令推送最新修改:
git push origin master
分布式版本系统的最大好处之一就是在本地工作完全不需要考虑远程库的存在,没有联网也可以正常工作,网络正常连接后,再将本地提交推送一下就能完成同步。
2.2 克隆远程仓库
从远程库克隆到本地库,server-name是github的用户名,repository-name是要克隆的库的名称:
git clone git@github.com:server-name/repository-name.git
git支持包括https的多种协议,但ssh速度最快。
3.分支管理
3.1 创建与合并分支
创建dev分支,并切换到dev分支:
git switch -c dev
相当于先创建 git branch dev 再切换 git switch dev
查看当前分支:
git branch
结果会列出所有分支,当前的dev分支前会有一个*
接下来在dev分支里进行工作,比如添加了一个修改,然后切换到master分支:git checkout master,这时master此刻的提交点没有改变。现在把dev分支的修改合并到master分支上:
git merge dev
git merge 用于合并指定分支到当前分支。
然后dev分支可以删除掉:
git branch -d dev
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。
3.2 解决冲突
有时候要合并的分支有冲突,Git无法自动合并分支,就必须首先解决冲突,然后再提交,完成合并。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
查看分支合并图:
git log --graph
3.3 分支管理策略
合并分支时,加上 --no-ff 参数,表示禁用 fast forward 模式,这样查看合并后的历史时看到是有分支的。
实际团队开发时,master分支是非常稳定,仅用来发布新版本;平时的修改都放在dev上,到版本发布时,再把dev分支合并到master上。团队合作的分支类似于:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DLzgCy94-1650621631000)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20220422144649273.png)]
3.4 bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>
命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
3.5 feature分支
软件开发中,经常遇到有新的功能需要添加,这个时候最好是新建1(多)个feature分支,在上面开发这个新功能,完成了之后,合并到主分支,最后再删除feature分支。
如果该feature分支没有被合并过,删除时会提示错误,可用提示的命令强制删除:
git branch -D feature
3.6 多人协作
1.修改完成后,推送自己的修改:
git push origin <branch-name>
2.如果因为远程分支比本地的更新,会推送失败,需要先拉取远程的分支尝试合并:
git pull
如果提示 no tracking information,则需要创建本地分支和远程分支的链接关系:
git branch --set-upstream-to <brand-name> origin/<branch-name>
3.如果合并有冲突,就先解决冲突,在本地提交后push;如果没有冲突,就直接push推送:
git push origin <brand-name>
3.7 Rebase
Git的Rebase,也称为“变基”~ 可以把本地未push的分叉的提交历史“整理”成一条直线,可以看起来更直观:
git rebase
4.标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本,方便以后再找这个版本。
新建一个标签:
git tag <tagname>
git tag -a <tagname> -m "xinxi" “新增带有标签信息的标签”
查看所有标签:
git tag
标签创建了后是存储在本地,不自动推送到远程。如果要删除本地标签:
git tag -d <tabname>
如果要把标签推送到远程:
git push origin <tagname>
git push origin --tags “一次性推送全部未推送到远程的本地标签”
如果要删除远程的标签:
git push origin :refs/tags/<tagname>
5.自定义Git
检查已有的配置信息:
git config --list
给命令取别名,比如把 status 简写为 st:
git config --global alias.st status
“global是全局参数,加了会使命令在该电脑的所有git仓库下生效”
具体配置哪些命令,视需要而定。
ps:熟悉git各项命令操作后,可以尝试使用git的GUI,如Sourcetree。