Git学习笔记
Git Notes
0.我在学习Git过程中用到的资料
尚硅谷Git入门到精通全套教程(涵盖GitHub\Gitee码云\GitLab)
https://learngitbranching.js.org/?locale=zh_CN
1.Git概述
Git是分布式 版本控制 系统。
版本控制:记录文件内容变化,最重要的是记录文件修改历史记录。
版本控制系统有两类:
- 集中式版本控制系统:CVS、SVN等,所有的文件修改版本保存在一个单一的集中服务器。用户从服务器上提取最新版文件进行修改,再提交到服务器。
- 分布式版本控制系统:Git等,提取的不是最新版本的文件快照,而是镜像整个代码仓库为一个本地库,每一次提取实际上就是对代码库进行备份。修改完后将代码推送至代码托管中心(远程库),远程库的代码是最新的。
- 主要区别在于:服务器断网也可以开发,且每个客户端都保存着完整代码。
Git运行机制:
- 工作区:代码存放的位置。在工作区可以修改代码,且没有历史记录;
- 暂存区:将工作区的代码添加(
git add
)到暂存区,也可以修改代码并且没有历史记录; - 本地库:将暂存区的代码提交(
git commit
)到本地库,就会生成历史版本。在本地库的版本不能修改。若发现代码不尽人意,只能在工作区修改后再次提交,此时本地库同时存在这两个版本。例如,先提交了v1版本,发现不好,则只能在v1版本基础上修改然后提交为v2; - 代码托管中心(远程库):将本地库的代码推送(
git push
)至远程库。
2.常用的Git命令
总述:
1
2
3
4
5
6
7
8
9
10git 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 # 查看详细历史记录设置用户签名:用于区分不同的本地操作者身份,在每一个提交的版本之中可以看到是谁提交的(这里的用户名与GitHub的用户名没有关系)。执行以下命令:
1
2git config --global user.name <your name> # 设置全局用户签名
git config --global user.email <your email> # 设置全局用户签名在
C:\Users\SDYZZY\.gitconfig
文件中可以查看是否成功。初始化本地库:让Git获得项目目录的管理权。在项目文件夹内执行命令
git init
来初始化本地库,完成后项目目录内会增加一个.git
文件夹(隐藏文件夹)。查看本地库状态:
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
追踪(即添加到暂存区)。忽略文件:创建一个名为
.gitignore
的文件,这个文件以句点打头且没有扩展名。可以在其中添加需要忽略的文件名,或者使用通配符忽略一类文件(一行只能有一个文件名)。例如扩展名为.pyc的文件根据.py文件自动生成,因此无须让Git跟踪它们。这些文件存储在目录__pycache__中。1
2
3
4>>vim .gitignore
__pycache__/
···添加到暂存区:
git add 文件名
其中的警告是由于转换了行末换行符,不用管。此时再查看本地库状态,绿色表示已经追踪到文件,但是只存在于暂存区(可以用
git rm --cached <filename>
把暂存区内的文件删除,但是工作区里任然存在),还未形成历史版本。提交到本地库:
git commit -m "日志信息(版本名)" 文件名
。下图表示在本地库主分支(master)提交了一个“first commit”版本的“hello.txt”,(精简的)版本号为3876208,一个文件被改变,13行内容被插入。查看历史记录:
git reflog
(使用git log
查看详细记录)。其中彩色表示head指针指向master分支的first commit版本。修改文件(版本迭代)示例:修改hello.txt.,然后再查看状态:红色表明修改了且还未追踪。
然后进行添加、提交:此时指针已经指向新的版本。
版本穿梭:
git reset --hard 版本号
,用于回退到过去的某个版本。指针已经指向了第一个版本,并且可以打开文件发现确实回到了第一个版本。实际上是head指针指向了master,然后master指针改变指向了第一个版本(在
\.git\refs\heads\master
文件内可以查看master指向的版本),因此版本穿梭的关键是改变指针指向。总结:首先使用
git reflog
或者git log
查看各个版本情况,修改后就可以用git add 文件名
添加到暂存区,然后用git commit -m "版本信息" 文件名
提交到本地库,若一段时间后不满意当前的版本,可以用git reset --hard 版本号
回退到过去的某个版本。
3.Git分支
1 | git branch -v # 查看已有分支 |
多个分支:用户分支,测试分支,开发分支……不同分支互不干扰,可以同时推进,完成开发后就可以进行分支合并(在用户看来就是更新)。分支底层就是指针的引用。
创建分支:
git branch 新分支名
。 创建热修复分支hot-fix:查看已有分支:
git branch -v
。切换分支:
git checkout 分支名
。可以看到星号已经转移到了hot-fix分支前。分支合并:
git merge 分支名
,把指定的分支合并到当前分支上,相当于用新的分支覆盖了当前分支。正常合并:由master分支的文件创建了hot-fix分支,master分支没有修改,但是hot-fix分支修改了,因此可以直接合并。
冲突合并:两个分支上的同一文件同一位置有两套不同的修改,不能直接合并。
需要手动合并:打开文件,手动删除多余的,然后添加、提交(此时提交不能带文件名)。此时切回hot-fix分支,文件没有被修改,只有master分支(合并分支)被修改了:
总结:分支master、hot-fix是指向具体版本记录的指针,head则指向当前分支。因此创建分支就是多创建一个指针。
4.Git与Github
创建远程库:
1.1点击New Repository
1.2起远程库名,一般与本地库相同
1.3选择公共库与私有库(公共库读取权限公开)
1.4
1.5可以看到远程库的Https和ssh的地址链接
远程库操作:
1
2
3
4
5
6
7git 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做了这三件事:拉取代码;初始化本地库;创建别名
- 创建远程库别名:
邀请合作者:点击settings–>collaborators->add people
使用过程中遇到的一些问题
提示
fatal: detected dubious ownership in repository
:原因:根源在于文件夹的所有人和当前用户不一致。
解决方法:在文件夹的属性-安全-高级里面,更改所有者,并应用到所有的子目录和文件。