Git学习笔记
一、安装
-
地址:https://git-scm.com/downloads
-
步骤:默认安装
-
检验:可以在开始菜单找到
Git Bash
就表示按装成功啦 -
初始化:安装完成后还要进行初始化Git,此过程只需要执行一次就可以啦
$ git config --global user.name "用户名" $ git config --global user.email "Git注册邮箱"
注意
git config
命令的--global
参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
二、基本操作
仓库(repository)可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
1.创建仓库
$ mkdir learngit
$ cd learngit
$ git init
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),并且当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了
2.文件添加
千万不要使用Windows自带的记事本编辑任何文本文件
(1)使用git add
命令,将文件添加到仓库
$ git add readme.md
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gb3l47kx-1675763030976)(E:\LearnGit\static\image-20230201115231558.png)]
(2)使用git commit
命令,将文件提交到仓库
$ git commit -m "wrote a readme file"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cx6N8RnC-1675763030976)(E:\LearnGit\static\image-20230201115324287.png)]
git commit
命令,-m
后面输入的是本次提交的说明,这样你就能从历史记录里方便地找到改动记录。
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,例如
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files"
3.文件修改
将readme.md
文件进行修改,修改为:
Git is a distributed version control system.
Git is free software.
使用git status
进行查看
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXYtHGNs-1675763030976)(E:\LearnGit\static\image-20230201120148031.png)]
git status
命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt
被修改过了,但还没有准备提交的修改。但是只能告知哪个文件的状态变化,但不会告知变化的内容
使用git diff
可以查看文件具体修改了哪里
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cOF0dSlj-1675763030977)(E:\LearnGit\static\image-20230201121255696.png)]
4.文件删除
使用 git rm
命令删除文件,然后再重现添加到版本库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TeeOHyzJ-1675763030977)(E:\LearnGit\static\image-20230201151006062.png)]
删除错误,版本库中还有,使用git checkout -- license.md
来还原工作区
三、时光穿梭
再次修改readme.md
文件:
Git is a distributed version control system.
Git is free software distributed under the GPL.
提交
$ git add readme.md
$ git commit -m "append GPL"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jwif4HmS-1675763030977)(E:\LearnGit\static\image-20230201125422864.png)]
回顾两次修改:
版本1:wrote a readme file
Git is a version control system.
Git is free software.
版本2:append GPL
Git is a distributed version control system.
Git is free software distributed under the GPL.
使用git log
命令可以查看历史记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W2PYHLEi-1675763030978)(E:\LearnGit\static\image-20230201125711194.png)]
使用git log
命令时可以加上--pretty=oneline
使得信息排列更加清晰
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FkyXjseY-1675763030978)(E:\LearnGit\static\image-20230201130529836.png)]
1.版本回退
使用版本回退之前,Git必须知道当前版本是哪个版本,在Git中使用HEAD
来表示当前版本。HEAD^
表示前一个版本,HEAD^^
表示前前一个版本……
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UviarWuz-1675763030979)(E:\LearnGit\static\image-20230201131607896.png)]
使用git reset
命令可以进行版本的回退,使得HEAD
指向回退后的版本
返回到前一个版本:
$ git reset --hard HEAD^
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRGgkgq1-1675763030979)(E:\LearnGit\static\image-20230201131947490.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wvm8uUQM-1675763030979)(E:\LearnGit\static\image-20230201132138695.png)]
回退完成后,最新的那个版本append GPL
已经看不到了!只要上面的命令行窗口还没有被关掉,你就可以顺着往上找,找到那个append GPL
的commit id
是1cf2b6f8260745a89a62b211ec10eaaaab466b3c4
,于是就可以指定回到未来的某个版本:
$ git reset --hard cf2b6f8260745a89a62b211ec10eaaaab466b3c4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z4hnPGuJ-1675763030979)(E:\LearnGit\static\image-20230201132531841.png)]
Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL
:
┌────┐
│HEAD│
└────┘
│
└──▶ ○ append GPL
│
○ wrote a readme file
改为指向add distributed
:
┌────┐
│HEAD│
└────┘
│
│ ○ append GPL
│ │
└──▶ ○ wrote a readme file
你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id
怎么办?Git提供了一个命令git reflog
用来记录你的每一次命令:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ekVu4G6T-1675763030979)(E:\LearnGit\static\image-20230201132952730.png)]
2.工作区和暂存区
工作区:电脑上的文件夹,例如:learngit
文件夹就是一个工作区
版本库:工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。
暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
我们把文件往Git版本库里添加的时候,是分两步执行的:
-
第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; -
第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
Git自动为我们创建了唯一一个master
分支,所以,现在,git commit
就是往master
分支上提交更改。
需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
修改readme.md
文件,修改为:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
在工作区新增一个license.md
的文件
$ touch license.md
使用git status
查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ArQwBB6y-1675763030980)(E:\LearnGit\static\image-20230201141208933.png)]
Git非常清楚地告诉我们,readme.md
被修改了,而license.md
还从来没有被添加过,所以它的状态是Untracked
。
使用两次的git add
将两个文件都添加到暂存区,再次查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARtuiw6S-1675763030980)(E:\LearnGit\static\image-20230201141419973.png)]
所以,git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h5tLS4iM-1675763030980)(E:\LearnGit\static\image-20230201141634860.png)]
此时,暂存区清空
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAr3Gx2l-1675763030980)(E:\LearnGit\static\image-20230201141703344.png)]
3.管理修改
Git跟踪并管理的是修改,而非文件,这就是Git比其他控制系统设计更加优秀的原因。
修改readme.md
文件
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
将readme.md
文件放到暂存区,并且查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JpSTEyHR-1675763030980)(E:\LearnGit\static\image-20230201142327036.png)]
再次修改readme.md
文件
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
提交暂存区中的readme.md
的文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uYxf6fZv-1675763030980)(E:\LearnGit\static\image-20230201142606420.png)]
提交后再查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3eRZSnsY-1675763030981)(E:\LearnGit\static\image-20230201142641132.png)]
此时,第一次的修改被提交了,第二次的修改不会被提交。。因为,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了。
使用git diff HEAD -- readme.md
命令,可以对比版本库和工作区中的readme.md
文件的区别。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rvTd0L6e-1675763030981)(E:\LearnGit\static\image-20230201143015921.png)]
如果想要提交第二次修改,那就继续git add
将第二次的文件添加到暂存区,然后git commit -m "xxx"
进行提交。
4.撤销修改
修改文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HKqkDot9-1675763030981)(E:\LearnGit\static\image-20230201144710768.png)]
查看状态
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPVuvi8r-1675763030981)(E:\LearnGit\static\image-20230201144744112.png)]
(1)手动修改再添加到暂存区
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cfvpnhE4-1675763030981)(E:\LearnGit\static\image-20230201144152696.png)]
(2)丢弃工作区
使用git checkout -- readme.md
,git checkout -- readme.txt
意思就是,把readme.md
文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.md
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ePvUznMs-1675763030981)(E:\LearnGit\static\image-20230201144835961.png)]
一种是readme.md
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SlXGYSaG-1675763030982)(E:\LearnGit\static\image-20230201145037818.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJVJVc1m-1675763030982)(E:\LearnGit\static\image-20230201145325443.png)]
git checkout -- file
命令中的--
很重要,没有--
,就变成了“切换到另一个分支”的命令
(3)销毁暂存区
使用git reset HEAD <file>
可以把暂存区的修改撤销掉(unstage),重新放回工作区。git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RpwwUUJF-1675763030982)(E:\LearnGit\static\image-20230201150113619.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z2mHNjAo-1675763030982)(E:\LearnGit\static\image-20230201150407003.png)]
四、远程仓库
1.创建远程仓库
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub
文件的内容:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nPLem3xh-1675763030982)(E:\LearnGit\static\image-20230201155849858.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbPj7Kob-1675763030982)(E:\LearnGit\static\image-20230201155926498.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D889lgQJ-1675763030982)(E:\LearnGit\static\image-20230201160039053.png)]
生成SSH后,新建仓库即可
2.关联仓库
- 方法一:
将添加远程仓库,并起一个别名
$ git remote add origin git@github.com:KongQingzhi/learngit.git
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E2vukBxP-1675763030983)(E:\LearnGit\static\image-20230201155546190.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wF3qjRrX-1675763030983)(E:\LearnGit\static\image-20230201155620749.png)]
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以是其他的
使用git push -u origin master
把本地库的所有内容推送到远程库上:
- 方法二:
将添加远程仓库,并起一个别名
$ git remote add origin https://github.com/KongQingzhi/learngit.git
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7WL0l6C-1675763030983)(E:\LearnGit\static\image-20230201163153180.png)]
用git push
命令,把本地库的内容推送到远程,由于远程库是空的,我们第一次推送master
分支时,加上了-u
参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master
分支关联起来,在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令
$ git push origin master
把本地master
分支的最新修改推送至GitHub
3.删除远程仓库
使用git remote rm
命令就可以删除远程仓库啦
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4M7I9Qit-1675763030983)(E:\LearnGit\static\image-20230201164316531.png)]
4.从远程仓库克隆
- 方法一:
$ git clone git@github.com:KongQingzhi/learngit.git
- 方法二:
$ git clone https://github.com/michaelliao/gitskills.git
五、分支管理
1.分支的操作
- 创建
dev
分支
$ git branch dev
- 切换分支
$ git checkout dev
也可以简写
$ git checkout -b dev
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vuydmhGc-1675763030983)(E:\LearnGit\static\image-20230201170956837.png)]
- 查看分支
使用git branch
可以查看分支,当前分支会进行标星*
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yEDaaDmE-1675763030983)(E:\LearnGit\static\image-20230201171133450.png)]
- 修改分支内容
比如对readme.txt
做个修改,加上一行:
Creating a new branch is quick.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M40kRkzz-1675763030983)(E:\LearnGit\static\image-20230201171344104.png)]
提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-udxgj7SE-1675763030984)(E:\LearnGit\static\image-20230201171513439.png)]
切换回master分支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lGW5doO9-1675763030984)(E:\LearnGit\static\image-20230201171602063.png)]
查看readme.md
文件,还是原来的样子
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ThGgMod5-1675763030984)(E:\LearnGit\static\image-20230201171652719.png)]
因为那个提交是在dev
分支上,而master
分支此刻的提交点并没有变
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uXaXbYj0-1675763030984)(E:\LearnGit\static\0)]
- 合并分支
git merge
命令用于合并指定分支到当前分支,合并后,再查看readme.txt
的内容,就可以看到,和dev
分支的最新提交是完全一样的。
$ git merge dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-snnB3jc1-1675763030984)(E:\LearnGit\static\image-20230201172112997.png)]
- 删除分支
使用git branch -d
对分支进行删除
$ git branch -d dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ytnjEPYl-1675763030984)(E:\LearnGit\static\image-20230201172346951.png)]
- switch
我们注意到切换分支使用git checkout <branch>
,而前面讲过的撤销修改则是git checkout -- <file>
,同一个命令,有两种作用,确实有点令人迷惑。
实际上,切换分支这个动作,用switch
更科学。因此,最新版本的Git提供了新的git switch
命令来切换分支:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nfq6s7tc-1675763030984)(E:\LearnGit\static\image-20230201172524704.png)]
创建并切换到新的dev
分支,可以使用:
$ git switch -c dev
直接切换到已有的master
分支,可以使用:
$ git switch master
2.分支冲突
创建一个新的分支feature
,并切换到新的分支,对readme.md
进行修改,并且提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eJl4B6PZ-1675763030984)(E:\LearnGit\static\image-20230201173214877.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LYt7xKyH-1675763030985)(E:\LearnGit\static\image-20230201173954368.png)]
对master分支的readme.md
进行修改,并且提交
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rAkhvpYz-1675763030985)(E:\LearnGit\static\image-20230201173528974.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QbbCnIgO-1675763030985)(E:\LearnGit\static\image-20230201174333102.png)]
使用git merge
合并两个分支,存在冲突,无法合并
$ git merge feature
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FWHWIAo-1675763030985)(E:\LearnGit\static\image-20230201174501896.png)]
!Git告诉我们,readme.md
文件存在冲突,必须手动解决冲突后再提交。git status
也可以告诉我们冲突的文件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Y7Mnazj-1675763030985)(E:\LearnGit\static\image-20230201174607072.png)]
打开readme.md
文件,进行手动合并
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-atiy5sEQ-1675763030985)(E:\LearnGit\static\image-20230201174733669.png)]
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们修改如下后保存:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vMwljg9E-1675763030985)(E:\LearnGit\static\image-20230201174922977.png)]
用带参数的git log
也可以看到分支的合并情况:
用git log --graph
命令可以看到分支合并图。
$ git log --graph --pretty=oneline --abbrev-commit
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pUO1tJ01-1675763030986)(E:\LearnGit\static\image-20230201175132879.png)]
最后删除feature
分支
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MNNABiLg-1675763030986)(E:\LearnGit\static\image-20230201175256327.png)]
3.分支管理策略
通常,合并分支时,如果可能,Git会用Fast forward
模式,但这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
实战一下--no-ff
方式的git merge
:
创建dev
分支并切换到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MQQaj8jl-1675763030986)(E:\LearnGit\static\image-20230202091102481.png)]
修改readme.md
文件,并提交一个新的commit:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1n6YTml-1675763030986)(E:\LearnGit\static\image-20230202091351627.png)]
现在,我们切换回master
,准备合并dev
分支,请注意--no-ff
参数,表示禁用Fast forward
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sgbj1lKd-1675763030986)(E:\LearnGit\static\image-20230202091627907.png)]
查看历史记录
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-csIHXUjK-1675763030986)(E:\LearnGit\static\image-20230202091822952.png)]
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uqwLm0Ai-1675763030987)(E:\LearnGit\static\1)]
4.Bug分支*
产生Bug后不想提交项目,Git还提供了一个stash
功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sEdEVRRM-1675763030987)(E:\LearnGit\static\image-20230202094043017.png)]
现在,用git status
查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qe7rv0MT-1675763030987)(E:\LearnGit\static\image-20230202094109057.png)]
5.feature分支
添加新功能时最好要新建一个feature
分支进行添加新的功能,新功能添加完成后,再删除该分支
新建feature
分支,并添加新的文件/功能
$ git switch -c feature-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-65UR347G-1675763030987)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230202100337385.png)]
切回master
,准备合并:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qoHhXCoT-1675763030987)(E:\LearnGit\static\image-20230202100621138.png)]
就在此时,接到上级命令,因经费不足,新功能必须取消!
虽然白干了,但是这个包含机密资料的分支还是必须就地销毁:
$ git branch -d feature-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LbvG0YOz-1675763030988)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230202100729892.png)]
销毁失败。Git友情提醒,feature-vulcan
分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用大写的-D
参数。。
$ git branch -D feature-1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t1kFyQfq-1675763030988)(E:\LearnGit\static\image-20230202100802173.png)]
6.多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
。
要查看远程库的信息,用git remote
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQpoHrW3-1675763030988)(E:\LearnGit\static\image-20230202100915079.png)]
用git remote -v
显示更详细的信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IpeJ2ksS-1675763030988)(E:\LearnGit\static\image-20230202100939470.png)]
上面显示了可以抓取和推送的origin
的地址。如果没有推送权限,就看不到push的地址。
7.推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
如果要推送其他分支,比如dev
,就改成:
$ git push origin dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sQ7LN7iy-1675763030989)(E:\LearnGit\static\image-20230202101129477.png)]
master
分支是主分支,因此要时刻与远程同步;dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
8.抓取分支
你的小伙伴已经向origin/dev
分支推送了他的提交,而碰巧你也对同样的文件作了修改,并试图推送:推送失败。因为你的小伙伴的最新提交和你试图推送的提交有冲突,解决办法也很简单,Git已经提示我们,先用git pull
把最新的提交从origin/dev
抓下来,然后,在本地合并,解决冲突,再推送:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GXDrcOuw-1675763030989)(E:\LearnGit\static\image-20230202101526542.png)]
git pull
也失败了,原因是没有指定本地分支与远程origin/xxx
分支的链接,根据提示,设置链接:
使用git fetch
更新查看远程仓库的分支信息
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2U07z6yn-1675763030989)(E:\LearnGit\static\image-20230202102641246.png)]
然后链接分支
$ git branch --set-upstream-to=origin/dev dev
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXl25grh-1675763030989)(E:\LearnGit\static\image-20230202102905604.png)]
然后进行git pull
,当前分支与远程分支不对应时也会失败
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YFniYPcd-1675763030990)(E:\LearnGit\static\image-20230202103249168.png)]
切换分支,并重新git pull
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OteIPPCQ-1675763030990)(E:\LearnGit\static\image-20230202103334030.png)]
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用
git push origin <branch-name>
推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>
推送就能成功!
如果git pull
提示no tracking information
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
9.Rebase
多人在同一个分支上协作时,很容易出现冲突。即使没有冲突,后push的童鞋不得不先pull,在本地合并,然后才能push成功。
每次合并再push后,分支变成了这样:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dDAD1CXa-1675763030990)(E:\LearnGit\static\image-20230202103655167.png)]
看上去很乱,Git有一种称为rebase
的操作,有人把它翻译成“变基”,可以将提交历史变成一条干净的直线。
rebase
操作可以把分叉的提交历史“整理”成一条直线,看上去更直观。缺点是本地的分叉提交已经被修改过了。
六、标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
1.创建标签
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
然后,敲命令git tag <name>
就可以打一个新标签:
$ git tag v1.0
可以用命令git tag
查看所有标签:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SJiJmQiP-1675763030990)(E:\LearnGit\static\image-20230202104635378.png)]
默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?
方法是找到历史提交的commit id,然后打上就可以了:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0TCdlmq-1675763030991)(E:\LearnGit\static\image-20230202104802765.png)]
比方说要对add merge
这次提交打标签,它对应的commit id是1aa66a7
,敲入命令:
$ git tag v0.9 1aa66a7
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UPHyiZF3-1675763030991)(E:\LearnGit\static\image-20230202104919885.png)]
注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>
查看标签信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0zCNzJOf-1675763030991)(E:\LearnGit\static\image-20230202105046488.png)]
还可以创建带有说明的标签,用-a
指定标签名,-m
指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UaEP0X1O-1675763030991)(E:\LearnGit\static\image-20230202105303194.png)]
2.操作标签
如果标签打错了,也可以删除:
$ git tag -d v0.1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HW9mkKje-1675763030991)(E:\LearnGit\static\image-20230202105438469.png)]
如果要推送某个标签到远程,使用命令git push origin <tagname>
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yH7t1mNN-1675763030992)(E:\LearnGit\static\image-20230202105532643.png)]
一次性推送全部尚未推送到远程的本地标签:
$ git push origin --tags
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3tP924p1-1675763030992)(E:\LearnGit\static\image-20230202105635827.png)]
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
$ git tag -d v0.9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TINWSjnd-1675763030992)(E:\LearnGit\static\image-20230202105731262.png)]
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBzVw9Fa-1675763030992)(E:\LearnGit\static\image-20230202105823751.png)]
要看看是否真的从远程库删除了标签,可以登陆GitHub查看。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cJrLKWH1-1675763030993)(E:\LearnGit\static\image-20230202110034278.png)]
七、git常用命令表
命令 | 描述 |
---|---|
git config --global user.name “用户名” | 配置用户名 |
git config --global user.email “git注册邮箱” | 配置邮箱 |
git init | 初始化仓库 |
git add 文件名 | 将文件添加到暂存区 |
git commit -m “描述” | 提交暂存区的文件到仓库 |
git status | 查看状态 |
git diff | 查看修改 |
git rm 文件名 | 移除文件 |
git log | 查看历史记录 |
git reflog | 查看历史版本记录 |
git log --pretty=oneline | 一行显示历史记录 |
git reset --hard HEAD^ | 返回上一个版本 |
git reset --hard HEAD^^ | 返回上上一个版本 |
git reset --hard 提交id | 返回指定提交id的版本 |
git diff HEAD – 文件名 | 对比仓库和版本区的某个文件的区别 |
git checkout – 文件名 | 把文件在工作区的修改全部撤销 |
git reset HEAD 文件名 | 销毁暂存区 |
ssh-keygen -t rsa -C “邮箱” | 创建SSH Key |
git remote add origin SSH地址 | 关联仓库 |
git remote add origin 仓库地址 | 关联仓库 |
git remote | 查看远程仓库信息 |
git remote -v | 查看远程仓库的详细信息 |
git remote rm 仓库名 | 删除远程仓库 |
git clone SSH地址 | 克隆仓库 |
git clone 仓库地址 | 仓库地址 |
git branch | 查看分支 |
git branch 分支名 | 创建分支 |
git checkout 分支名 | 切换分支 |
git switch 分支名 | 切换分支 |
git checkout -b 分支名 | 创建并切换到分支 |
git switch -c 分支名 | 创建并切换到分支 |
git merge 分支名 | 将分支与当前分支合并 |
git branch -d 分支名 | 删除分支 |
git log --graph | 查看分支合并图 |
git log --graph --pretty=oneline --abbrev-commit | 查看单行分支合并图 |
git merge --no-ff -m “描述” 分支名 | 禁用Fast Forward模式进行合并分支 |
git stash | 储藏工作区 |
git push origin master | 推送分支(将master推送到origin) |
git pull | 抓取分支 |
git branch --set-upstream-to=origin/远程分支 本地分支 | 本地仓库分支链接远程仓库分支 |
git fetch | 更新远程仓库的信息 |
git rebase | 提交历史变成一条干净的直线 |
git tag | 查看所有标签 |
git tag 标签名 | 新建标签 |
git tag 标签名 提交id | 为指定的提交创建标签 |
git show 标签名 | 查看指定标签名的信息 |
git tag -a 标签名 -m “描述信息” 提交id | 为指定的提交创建带有说明的标签 |
git push origin 标签名 | 推送标签到远程 |
git push origin --tags | 一次性推送全部标签到远程 |
git tag -d 标签名 | 删除本地标签 |
git push origin :refs/tags/标签名 | 删除远程标签 |