文章目录
Git !
前记:
首先感谢这个免费学习地址:https://www.liaoxuefeng.com/wiki/896043488029600/896827951938304
因为工作室这边有项目了,使用了gitlab,为了以后能顺利开展团队工作,就把git基本使用看了。
一、概述
- git是用c语言写的
- 集中式和分布式版本控制系统:
- 集中式版本控制系统:有一个“中央电脑”,里面有完整的版本库,每个人从中拿一部分修改后提交上去
- 分布式版本控制系统:每个人电脑都是完整的版本库。通常有一台电脑作为中央电脑
- 核心区别:集中式高度依赖“中央电脑”,而分布式的“中央电脑”仅仅作为“交换方便”的目的而存在
- gitee和github的区别:它们都是依赖git的。git和github是两种东西,github是一个“中央”仓库(虽然git没有这个概念),负责同步所有人。
二、安装
Windows下地址:https://git-scm.com/downloads
三、概念
1、暂存区
在工作空间(Working Directory)和版本库(Repository)中间有一个暂存区(stage), 当执行add的时候,实际是先把文件加入到暂存区,commit之后才放到分支上。
如果新增了文件,但没有add操作,会显示Untracked
Untracked files:
(use "git add <file>..." to include in what will be committed)
123.txt
2、修改和提交
git管理的不是文件而文件内容的修改。
第一次修改 -> git add
-> 第二次修改 -> git commit
这样只会提交第一次修改。第二次修改在本地,用diff命令会显示差异。
第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
这样会覆盖。
四、常见命令
基础设置
-
修改用户/邮箱
$ git config --global user.name "Your Name" $ git config --global user.email "email@example.com"
-
查看用户/邮箱
$ git config user.name $ git config user.email
查看文本文件内容
$ cat 文件名
初始版本库
如果要真正使用版本控制系统,就要以纯文本方式编写文件,图片、视频等只能知道其变化了(如大小),但不知道变化了什么。
# 在一个目录下:
$ git init
添加
添加到仓库要两步,一是添加,二是提交。所以添加可以添加多个文件,反正还没提交。
$ git add file1.txt
$ git add file2.txt file3.txt
提交
# m是comment注释的缩写
$ git commit -m "add 3 files."
查看状态
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt #提示什么文件被修改过
no changes added to commit (use "git add" and/or "git commit -a")
查看不同处
$ git diff 文件名
$ git diff readme.txt
diff --git a/readme.txt b/readme.txt
index 46d49bf..9247db6 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,2 @@
-Git is a version control system.
+Git is a distributed version control system.
Git is free software.
查看提交历史
–pretty=oneline参数是为了显示在一行内,可以不加。
前面16进制代表的是commit id(版本号),唯一的。
$ git log --pretty=oneline
2b7479aaf65d1c8a9af00adeced32b61b422815a (HEAD -> master) append GPL
7bac8f2227985f6082841a9220239bbb37184862 add distributed word
17cca483fe0624b894e78964196332d475c6ebb3 添加了readme.txt file
07c5ab54dc1438f269a7906ce0008bc8f08ad817 wrote a test1 file
查看命令历史
可以配合版本回退中的hard参数使用。
$ git reflog
2b7479a (HEAD -> master) HEAD@{0}: reset: moving to 2b7479aaf65d1c8a9af00a
7bac8f2 HEAD@{1}: reset: moving to head^
2b7479a (HEAD -> master) HEAD@{2}: commit: append GPL
7bac8f2 HEAD@{3}: commit: add distributed word
17cca48 HEAD@{4}: commit: 添加了readme.txt file
07c5ab5 HEAD@{5}: commit (initial): wrote a test1 file
版本回退
- hard英文本意:接近。
- head代表当前版本指针,更准确地说是版本库中的最新版本。head表示上个版本,head^表示上上版本。
-
回到过去
$ git reset --hard head^ HEAD is now at 7bac8f2 add distributed word
-
回到未来
本质和回到过去是一样的,都是通过hard参数。
注意hard参数与–之间没有空格
$ git reset --hard 2b7479aaf65d1c8a9af00a HEAD is now at 2b7479a append GPL
撤消修改
- git checkout – 文件名。可以将工作区的修改直接丢弃,回到的版本是最近一次add或者commit的版本。
- 撤消暂存区的修改。$ git checkout – readme.txt。注意:仅仅只是把暂存区的内容清理掉,不会影响工作区!
删除文件
两种方式:
一是手动删除,可以用checkout撤消修改命令恢复。(checkout实际上是用版本库或者暂存区中最新版本覆盖工作区)
二是用 g i t r m 文 件 名 的 方 式 , 但 此 时 不 能 用 c h e c k o u t 命 令 恢 复 。 git rm 文件名 的方式,但此时不能用checkout命令恢复。 gitrm文件名的方式,但此时不能用checkout命令恢复。 git restore --staged test1.txt可以从暂存区中撤消删除,再用$ git restore test.txt从工作区中撤消删除。
恢复最高级无敌的方法是版本回退。
两种方式都可以用commit命令来提交修改,真正把版本库中的文件删除。(错,必须通过rm命令先statge一下)
五、远程仓库
1、公钥
#生成公钥命令
$ ssh-keygen -t rsa -C "youremail@example.com"
钥匙目录地址:用户目录/.ssh/id_rsa.pub为公钥,id_rsa为私钥。
完事后在github加入自己的公钥信息即可。
2、添加远程库
以gitee为例。
第一步:将远程仓库信息添加到本地
$ git remote add origin https://gitee.com/MeowSir/TestGit.git。 origin为仓库名称
第二步:将master分支推送上去
$ git push -u origin master
由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。(看不懂,反正第一次之后就不用加-u 参数了!)
3、查看删除仓库
git remote -v
查看远程库信息。
git remote rm 远程仓库名
通过仓库名来删除仓库。
4、克隆仓库
git clone git@gitee.com:MeowSir/clone-warehouse-test.git
在一个目录下直接使用即可。
六、分支管理
- head指向的是当前分支
- 而如master \ dev等,是指向提交
查看分支
*号代表head指向的当前分支
$ git branch
dev
* master
创建分支
git branch 分支名
转换分支
git checkout 分支名
新版本git中
git switch 分支名
创建与转换
git branch -b 分支名
git switch -c 分支名
这两个命令相当于创建与转换同时进行。
删除分支
git branch -d 分支名
-D代表强制删除。
合并分支
$ git merge 指定分支名
注意合并的关系:
- 是将指定的分支名合并到当前分支
- 是Fast-forward模式,代表着仅仅是将当前分支指针指向要合并的分支上
查看合并情况
$ git log --graph --pretty=oneline --abbrev-commit
$ git log
no-ff合并
$ git merge --no-ff -m "merge with no-ff" dev
Git默认会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息(分支就是一个指针,删除分支就是把那个指针删了,相当于该分支不存在)。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
可以这样理解:–no–ff 模式其实就是相当于master指针new了一个跟dev指针一样的空间并且放了相同的内容然后指向这个空间。而原来的快速模式,就是简单将master指针指向dev指针指向的内容而已,并没有自己创造空间。
(不太理解这样有什么用)
保留当前状态
为什么要保留当前状态?当其它分支出现问题,需要去其它分支,但当前分支中已经有修改过的内容,但没有提交。
git stash
git stash list
查看所有stash过的状态
git stash apply stash@{数字}
恢复
git stash apply
恢复到最新一次状态
git stash drop
恢复完stash还在,要删除
git stash pop
自动恢复并删除
部分修改
git cherry-pick commit的id
会把commitID下的分支作的修改部分merge过来
多人协作(重点)
origin/dev代表远程分支,dev代表本地分支名
创建远程分支:
git checkout -b dev origin/dev
推送指定分支:
git push origin dev
pull指定分支:
git branch --set-upstream-to=origin/dev dev
rebase
懒得看。。
六、标签管理
- 标签是指向某个commit的指针
- 标签是死的,只能指向一个特定的commit
- 用标签是为了给commit起别名
- 标签和commit的id挂勾,如果两个分支有相同commit的id,则标签一样
生成标签
git tag v1.0
给最近的一次commit打上标签
查看所有标签
git tag
指定commit打标签
git tag v0.9 commit的id
查看标签详情
git show 标签名
带说明的标签
git tag -a 标签名 -m "version 0.1 released" commit的id
删除本地标签
git tag -d 标签名
推送到远程仓库
git push orgin 标签名
git push orgin --tags
一次性推送全部尚未推送到远程仓库的本地标签
删除远程标签
先从本地删除。
$ git push origin :refs/tags/标签名
七、还没看的
感觉暂时用不上,就不看了。
rebase命令,自定义Git,使用Source Tree