好处
代码版本管理工具在软件开发中是基础而必要的。在多人合作开发中,协调并行开发;个人使用时,也可以用来记录代码历史记录。
使用场景:
- 团队开发:开发时,多人并行开发;基于同一起点,建立各自的分支,各自开发完成后,合并到主干。发布时,打上tag,便于回溯。
- 个人开发:及时提交代码,保存历史记录。进一步修改时可以随心所欲,不怕找不回修改前的状态。
下图是一个开发中的简单工程的示例。用Git管理。分支树自下而上生长。
看图:
git分支树的两个主要元素:分支 和 commit点
左侧区域显示,3个文件改动。状态:modified。
右侧区域是分支图:
分支树自下而上生长
– 当前在蓝色分支add_opcode_to_ind_name,且蓝色分支最新,有未提交的改动。它从origin/HEAD分离而来,多了一个commit点。
– 其他几个分支也从origin/HEAD分离出来,各自开发不同的功能。本地库包含分支:
add_opcode_to_ind_name,
description
dev-phase2远程库包含分支:
以origin/开头的几个分支,
Git 和 SVN
Git和SVN是两种主流的代码管理工具。主要区别,直观的看是分布式和集中式的区别。
SVN是集中式的,只有服务器上保留了代码历史,每次比较更改、更新、回退、提交、分支都要和服务器交互。
Git是分布式的。用户个人电脑上也保留代码历史记录,在.git目录下,用户平时只管理本地代码库,写代码、比较更改、提交、回退、分支等等,这些过程不用联网,直到最终提交时,才需与服务器交互。
另外,Git和SVN内部算法区别,也导致Git的管理更灵活易用。
实操所需
本地pc
- 安装vscode,git
安装git建议选择用vim编辑器,这在Linux系统常用。
vim常用命令:i 插入,即开始编辑内容。 :冒号,回到命令行。wq 保存并退出。w write即保存,q quit及退出编辑器。
- vscode安装好后,安装扩展插件GitLens, Git Graph
(GitLens 可以显示每行代码是什么时候修改的,Git Graph展示分支图)
这样可以同时用vscode写代码,同时看git分支图
远程服务器
安装gitLab,gitBlit等软件。都是傻瓜式安装。
对于只有一台电脑的个人来说,Git的分布式特征,意味着服务器不是很必要。因为本地就有完整的库管理能力。 远程服务器起到代码托管作用,比如Github,让你可以用多台电脑同时开发。
Git是一个代码管理工具,GitLab, GitBlit 都是基于Git的托管软件。GitHub不仅有托管软件,还提供访问服务。
【一种思路】自己有两台电脑,一台ubuntu安装了GitLab,局域网内,两台电脑就可以共同开发了。进一步地,买个域名,并且域名解析到这台ubuntu电脑,这台电脑就成了代码服务器了。可以公网访问代码库。ubuntu放家里当server,另一台在外地随时访问。考虑到网络安全问题,慎用。
常用命令
下面就是学习git的日常使用。
推荐一个github开源工程 learnGitBranching ,帮助学习git,很好用。
1. 建库
方式一:从远程拉取代码库
git clone <url of remote git repository>
方式二:在本地建库
- git init
在一个文件夹,用此命令,建立新代码库。此时你就可以开发了,直到有一天想上传到远程服务器。
这时你可以:
– 在远程服务器建个库,此时库是空的。
– git remote add 让本地库关联远程库
git remote add <name of remote> <url of remote git repository>
<name of remote>
随便取名,常用origin
– git push 推送代码到远程库
git push <name of remote> <local branch name>:<remote branch name>
<remote branch name>
可以是远程没有的,这样会在远程库新建一个分支。
更改与提交
比较方便的,使用vscode的界面辅助,用命令行。个人不喜欢Git 右键菜单,妨碍了解、学习git。
git status
查看改动情况git add <files>
添加改动到缓存区
– 后悔了,可以git restore <>
– git add . 添加所有git commit -m "提交日志"
提交,并写日志
于是,一个新的commit点形成了。git branch -b
–git branch -b <new branch name>
在当前代码建立新分支。
如果后面想关联远程分支,可以git branch --set-upstream-to=<remote name/remote branch name>
例如git branch --set-upstream-to=origin/dev
–git branch -b <new branch name> <remote branch name>
建立新分支,从远程拉取一个分支。这个分支会与远程分支关联git branch -vv
查看分支情况,本地分支和远程分支关系git push
上一节讲过。这里只讲,当本地分支与远程分支无法合并时,比如远程有的commit点,本地在修改时去掉了。那么 最后加-f
可以强制推到远程。例如git push origin dev:dev -f
高阶1:修整commit点
git rebase -i <最后一个commit点>
rebase功能,可以合并、修改代码、修改日志、调整顺序、删除commit点git cherry-pick <特定commit点> <>…
把一个或多个commit点复制到当前分支的顶端,pick顺序即点的最终分支上点的顺序。git reset
–git reset <commit点>
将该点之后的commit删除,但代码改动保留。这样可以重新整理、提交。
–git reset --hard <commit点>
删除commit点,且删除代码改动。此时git status会很干净,哈哈。
– git clean 有的文件夹清理不干净,可以用。
撤销更改
- git reflog 查看git操作记录,每一个操作都有id。
比如上一个是git rebase操作,对应id是ab13f, 之前一个操作是git commit,对应id是7cb3e,那么进一步用git check 7cb3e
就可以取消git rebase操作,回到git commit的结束时的状态。
子模块
当一个git库引用了另一个git库作为子模块。
- git submodule
error: cannot lock ref
解决办法:
进入./.git/refs/,找到提示的文件,删除它。然后重新git fetch