Git Notes

0.我在学习Git过程中用到的资料

尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)

https://learngitbranching.js.org/?locale=zh_CN

1.Git概述

  1. Git是分布式 版本控制 系统。

  2. 版本控制:记录文件内容变化,最重要的是记录文件修改历史记录。

  3. 版本控制系统有两类:

    • 集中式版本控制系统:CVS、SVN等,所有的文件修改版本保存在一个单一的集中服务器。用户从服务器上提取最新版文件进行修改,再提交到服务器。
    • 分布式版本控制系统:Git等,提取的不是最新版本的文件快照,而是镜像整个代码仓库为一个本地库,每一次提取实际上就是对代码库进行备份。修改完后将代码推送至代码托管中心(远程库),远程库的代码是最新的。
    • 主要区别在于:服务器断网也可以开发,且每个客户端都保存着完整代码。
  4. Git运行机制:

    • 工作区:代码存放的位置。在工作区可以修改代码,且没有历史记录;
    • 暂存区:将工作区的代码添加(git add)到暂存区,也可以修改代码并且没有历史记录;
    • 本地库:将暂存区的代码提交(git commit)到本地库,就会生成历史版本。在本地库的版本不能修改。若发现代码不尽人意,只能在工作区修改后再次提交,此时本地库同时存在这两个版本。例如,先提交了v1版本,发现不好,则只能在v1版本基础上修改然后提交为v2;
    • 代码托管中心(远程库):将本地库的代码推送(git push)至远程库。

2.常用的Git命令

  1. 总述:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    git config --global user.name <your name>    # 设置全局用户签名
    git config --global user.email <your email> # 设置全局用户签名
    git init # 初始化本地库
    git status # 查看本地库状态
    git add <filename> # 添加到暂存区
    git rm --cached <filename> # 把暂存区或者本地库内的文件删除
    git commit -m "<log information(or version)>" <filename> # 提交文件到本地库(省略文件名则提交整个暂存区)
    git reset --hard 版本号(七位) # 版本穿梭
    git reflog # 查看简略历史记录
    git log # 查看详细历史记录
  2. 设置用户签名:用于区分不同的本地操作者身份,在每一个提交的版本之中可以看到是谁提交的(这里的用户名与GitHub的用户名没有关系)。执行以下命令:

    1
    2
    git config --global user.name <your name>    # 设置全局用户签名
    git config --global user.email <your email> # 设置全局用户签名

    C:\Users\SDYZZY\.gitconfig文件中可以查看是否成功。

  3. 初始化本地库:让Git获得项目目录的管理权。在项目文件夹内执行命令git init来初始化本地库,完成后项目目录内会增加一个.git文件夹(隐藏文件夹)。

  4. 查看本地库状态:git status

    解释:master指当前分支(macos里面为main),no commits yet指目前没有提交过任何文件,nothing to commit (create/copy files and use "git add" to track)指当前没有文件需要提交。

    新建一个文档hello.txt,然后再输入git status。此时的结果中,红色表示此时在工作区存在一个叫hello.txt的未追踪的文件,使用git add追踪(即添加到暂存区)。

  5. 忽略文件:创建一个名为.gitignore的文件,这个文件以句点打头且没有扩展名。可以在其中添加需要忽略的文件名,或者使用通配符忽略一类文件(一行只能有一个文件名)。例如扩展名为.pyc的文件根据.py文件自动生成,因此无须让Git跟踪它们。这些文件存储在目录__pycache__中。

    1
    2
    3
    4
    >>>vim .gitignore
    __pycache__/

    ···
  6. 添加到暂存区:git add 文件名

    其中的警告是由于转换了行末换行符,不用管。此时再查看本地库状态,绿色表示已经追踪到文件,但是只存在于暂存区(可以用git rm --cached <filename>把暂存区内的文件删除,但是工作区里任然存在),还未形成历史版本。

  7. 提交到本地库:git commit -m "日志信息(版本名)" 文件名 。下图表示在本地库主分支(master)提交了一个“first commit”版本的“hello.txt”,(精简的)版本号为3876208,一个文件被改变,13行内容被插入。

  8. 查看历史记录:git reflog(使用git log查看详细记录)。其中彩色表示head指针指向master分支的first commit版本。

  9. 修改文件(版本迭代)示例:修改hello.txt.,然后再查看状态:红色表明修改了且还未追踪。

    然后进行添加、提交:此时指针已经指向新的版本。

  10. 版本穿梭:git reset --hard 版本号,用于回退到过去的某个版本。

    指针已经指向了第一个版本,并且可以打开文件发现确实回到了第一个版本。实际上是head指针指向了master,然后master指针改变指向了第一个版本(在\.git\refs\heads\master文件内可以查看master指向的版本),因此版本穿梭的关键是改变指针指向。

  11. 总结:首先使用git reflog或者git log查看各个版本情况,修改后就可以用git add 文件名添加到暂存区,然后用git commit -m "版本信息" 文件名提交到本地库,若一段时间后不满意当前的版本,可以用git reset --hard 版本号回退到过去的某个版本。

3.Git分支

1
2
3
4
git branch -v                 #  查看已有分支
git branch <new branch name> # 创建分支
git checkout <branch name> # 切换分支
git merge <branch name> # 合并分支
  1. 多个分支:用户分支,测试分支,开发分支……不同分支互不干扰,可以同时推进,完成开发后就可以进行分支合并(在用户看来就是更新)。分支底层就是指针的引用。

  2. 创建分支:git branch 新分支名。 创建热修复分支hot-fix:

  3. 查看已有分支:git branch -v

  4. 切换分支:git checkout 分支名。可以看到星号已经转移到了hot-fix分支前。

  5. 分支合并:git merge 分支名 ,把指定的分支合并到当前分支上,相当于用新的分支覆盖了当前分支。

    正常合并:由master分支的文件创建了hot-fix分支,master分支没有修改,但是hot-fix分支修改了,因此可以直接合并。

    冲突合并:两个分支上的同一文件同一位置有两套不同的修改,不能直接合并。

    需要手动合并:打开文件,手动删除多余的,然后添加、提交(此时提交不能带文件名)。此时切回hot-fix分支,文件没有被修改,只有master分支(合并分支)被修改了:

  6. 总结:分支master、hot-fix是指向具体版本记录的指针,head则指向当前分支。因此创建分支就是多创建一个指针。

4.Git与Github

  1. 创建远程库:

    1.1点击New Repository

    1.2起远程库名,一般与本地库相同

    1.3选择公共库与私有库(公共库读取权限公开)

    1.4

    1.5可以看到远程库的Https和ssh的地址链接

  2. 远程库操作:

    1
    2
    3
    4
    5
    6
    7
    git remote -v                         #  查看当前所有远程地址别名
    git remote add 别名 远程库地址 # 起别名
    git remote remove 别名 # 删除别名
    git push 远程库地址或地址别名 本地分支名 # 推送本地分支上的内容到远程库
    git clone 远程库地址 # 将远程库的内容克隆到本地
    git pull 远程库地址或地址别名 远程分支名 #将远程库对于分支最新内容拉下来后与当前本地分支直接合并
    # 邀请至项目远程库
    • 创建远程库别名:git remote add 别名 远程地址。链接太长,对链接起别名,以后push和pull就可以直接用别名代替链接,一般就用库名作为别名。
    • 推送本地库至远程库:git push 别名或远程库链接 分支

    • 拉去远程库至本地库:git pull 远程库别名或地址 远程分支名。本地库与远程库已经不同步了,将远程库的内容拉取到本地库

    • 克隆远程库至本地库:git clone 远程库地址。(https克隆前不需要init,也不需要登陆账号)。clone做了这三件事:拉取代码;初始化本地库;创建别名

  3. 邀请合作者:点击settings–>collaborators->add people

使用过程中遇到的一些问题

  1. 提示fatal: detected dubious ownership in repository

    原因:根源在于文件夹的所有人和当前用户不一致。

    解决方法:在文件夹的属性-安全-高级里面,更改所有者,并应用到所有的子目录和文件。