Git 日常使用

好处

代码版本管理工具在软件开发中是基础而必要的。在多人合作开发中,协调并行开发;个人使用时,也可以用来记录代码历史记录。
使用场景:

  • 团队开发:开发时,多人并行开发;基于同一起点,建立各自的分支,各自开发完成后,合并到主干。发布时,打上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


版权声明:本文为hua0918xing原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。