[toc]
Git是什么?
Git是目前世界上最先进的分布式版本控制系统
安装Git
官网下载地址:git-scm.com/download/wi…
入门
1. 创建版本库
- 版本库又名仓库,英文名repository
- 步骤
- 切换到合适的目录
- 命令
cd可以切换文件夹,命令mkdir可以新建文件夹
- 命令
- 初始化一个Git仓库。使用
git init命令 - 添加文件到Git仓库,分两步:
- 使用命令
git add <file>。注意,可反复多次使用,添加多个文件 - 使用命令
git commit -m <message>,完成 - 例:添加并提交一个readme.txt文件
- 命令
ls可以查看当前文件夹中的文件
- 命令
- 使用命令
- 切换到合适的目录
2. 修改文件后会发生什么?
- 使用
git status命令,可以发现文件状态有变化 - 如果
git status告诉你有文件被修改过,用git diff可以查看修改内容 - 可以更新版本。执行命令
git add <file>并git commit -m <message>
3. 版本回退
3.1 本地回退
- 先看一下提交记录,命令
git log:
$ git log
commit a0c5fe209704e56a7e00e79f3de7b5d67b33c31a (HEAD -> master)
Author: ------- <----------@gmail.com>
Date: Mon Aug 24 20:11:47 2020 +0800
append GPL
commit fab9c50d48b54085c54211d33737f4662a2a4488
Author: ------- <----------@gmail.com>
Date: Mon Aug 24 20:04:35 2020 +0800
add a word distributed
commit 415ac66de426d66b906ad06afd7d4dec0ec7ea10
Author: ------- <----------@gmail.com>
Date: Mon Aug 24 19:54:13 2020 +0800
-
注意 commit 后面那一串东西是 commit id(版本号)
-
HEAD是指针,指向的版本就是当前版本。因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard <commit_id>- 先查看提交历史,命令
git log,以便确定要回退到哪个版本。- 可以用
<commit_id>指定版本,也可以用如下符号:HEAD^上一个版本HEAD^^上上个版本HEAD~100往上100个版本
- 注意:会 “丢失” 后续版本
- 可以用
- 要重返未来,用
git reflog查看命令历史,以便确定要回到未来的哪个版本
- 先查看提交历史,命令
-
命令
cat <file>可以看看该文件内容
3.2 远程回滚
- 如果你的错误提交已经推送到自己的远程分支了,那么就需要回滚远程分支了
- 先本地回退
git reset --hard <commit_id>
- 再强制推送到远程分支
git push -f origin master ## 这里假设只有一个master分支
- 先本地回退
4. Git的基本工作原理
- 说明
- 工作区(Working Directory):就是我们在电脑里能看到的目录,比如刚刚创建的
learngit文件夹就是一个工作区 - 版本库(隐藏文件夹
.git)- 暂存区(stage,或者叫index)
- master 分支(唯一)
- 工作区(Working Directory):就是我们在电脑里能看到的目录,比如刚刚创建的
- 命令
git add <file>:把文件从工作区添加到暂存区git commit -m <message>:把文件从暂存区移动到分支
5. Git管理的是修改,而不是文件
- Git是如何跟踪修改的?
- 每次修改,如果不用
git add到暂存区,那么git commit时就不会提交到分支中
- 每次修改,如果不用
6. 撤销修改
- 场景 1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- <file>。- 把该文件在工作区的修改全部撤销:会回到最近一次
git commit或git add时的状态 - 本质:用版本库里的版本替换工作区的版本 √
- 把该文件在工作区的修改全部撤销:会回到最近一次
- 场景 2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步:
- 第一步:用命令
git reset HEAD <file>,就回到了场景1- 也就是说,
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区 √
- 也就是说,
- 第二步:按场景1操作【注意别漏了】
- 第一步:用命令
- 场景 3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库
7. 删除
- (1) 如果你用的
rm <file>删除文件,那就相当于只删除了工作区的文件- 如果想要恢复,直接用
git checkout -- <file>就可以把版本库的版本恢复到工作区 - 但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容
- 如果想要恢复,直接用
- (2) 如果你用的是
git rm <file>删除文件,那就相当于不仅删除了文件,而且还添加到了暂存区【√】- 如果想要恢复,需要先
git reset HEAD <file>,然后再git checkout -- <file>
- 如果想要恢复,需要先
- (3) 如果你想彻底把版本库的删除掉,先
git rm <file>,再git commit -m <message>就OK了【√】
远程仓库:Github
1. 通过SSH连接远程仓库:
- 步骤:
- 本地电脑生成 ssh 密钥——公钥私钥
- 打开
git bash,输入下面命令生成 email 的 ssh 密钥:ssh-keygen -t rsa -C "youreamil",一路确认 - 根据
git bash的回复的秘钥目录找到私钥id_rsa和公钥id_rsa.pub
- 打开
- 复制公钥
id_rsa.pub内容,到第三方git仓库设置中绑定ssh key
- 本地电脑生成 ssh 密钥——公钥私钥
2. Github远程库配置
场景1:先有本地库,后有远程库的时候,如何关联远程库?
现在的情景是,你已经在本地创建了一个
Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
-
要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git;- 例如:
$ git remote add origin git@github.com:bobo6668/learngit.git
- 例如:
-
关联后
- 使用命令
git push -u origin master第一次推送master分支的所有内容;- 第一次使用 Git 的
clone或者push命令连接 GitHub 时,会得到一个SSH警告,忽略即可
- 第一次使用 Git 的
- 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master推送最新修改;
- 使用命令
-
Debug:push 的时候遇到了 Warning
Warning: Permanently added the RSA host key for IP address '13.229.188.59' to the list of known hosts.- 解决方法:在host文件中添加一句话即可
13.229.188.59 github.com
场景2:我们从零开发,那么最好的方式是先创建远程库,然后,从远程库克隆
- 在
Github上先创建一个仓库,如gitSkills,并得到地址 - 使用
git clone命令克隆git clone git@github.com:bobo6668/gitSkills.git- 注意
Git执行克隆操作时,克隆到当前路径pwd那里去了
Git支持多种协议,包括https,但ssh协议速度最快
更多资料:可以看看 Github 的 Hello World
分支管理
1. 创建与合并分支
2020年8月26日21:10:10
Git鼓励大量使用分支:- 查看分支:
git branch - 创建分支:
git branch <name> - 切换分支:
git switch <name>(不建议git checkout <name>)- *创建+切换分支:
git switch -c <name>(不建议git checkout -b <name>)
- *创建+切换分支:
- 合并某分支到当前分支:
git merge <name> - 删除分支:
git branch -d <name>
- 查看分支:
2. 解决冲突
- 当
Git无法自动合并分支时- 必须先解决冲突:把
Git合并失败的文件手动编辑为我们希望的内容 - 解决冲突后,再提交,合并完成
- 必须先解决冲突:把
- 用
git log --graph命令可以看到分支合并图
3. 分支管理策略
Git分支十分强大,在团队开发中应该充分应用- 合并分支时
- 默认是
fast forward合并(如git merge dev)。合并后会删除分支dev,看不出来曾经做过合并 - 加上
--no-ff参数(即git merge --no-ff -m "merge with no-ff" dev)就可以用普通模式合并。合并后的历史有分支,能看出来曾经做过合并【√】
- 默认是
- 分支管理策略:
标签管理
Git的标签是版本库的快照,方便未来取出那个打标签的时刻的历史版本
1.创建标签
- 打标签
git tag v0.1
- 补打标签
- 找到历史提交的commit id
git tag v0.9 f52c633
- 创建带有说明的标签,用
-a指定标签名,-m指定说明文字git tag -a v0.1 -m "version 0.1 released" 1094adb
- 查看所有标签
git tag
- 查看某标签的说明内容
git show <tagname>
- 同步到github
- 某标签
git push origin <tagname>
- 所有标签
git push origin --tags
- 某标签
Git 常用命令速查表
当然,可以用 git help 非常方便地查看所有命令
git mv 命令
git mv 命令用于移动或重命名文件,目录或符号链接。
参考1:git mv命令 - 易百教程
官网:git-mv - Move or rename a file, a directory, or a symlink
Git 移动操作
在移动之前,确保已将所有更改添加到暂存区域,即先git add,否则会提示fatal: bad source,
若移动文件夹:
!git mv G:\2_git\a\case G:\2_git\case
若修改文件夹名字:
!git mv G:\我的写case参数 G:\case
(To be continued...)