目录
一、Git基础知识介绍
1、Git的优势:分布式,分支管理
2、Git应用软件:Github、Git-lab、"码云"、Git-bash、TortoiseGit(建议先熟悉了命令)
3、git 的3层结构(工作区域)
(1)工作区working directory:添加、编辑、修改文件等动作
(2)暂存区-staging index:暂存已经修改的文件最后统一提交到git仓库中
(3)版本库(git本地仓库)-git directory(Repository):工作区的隐藏目录【git】,最终确定的文件保存到仓库,成为一个新的版本,并且对他人可见
把一个文件放到Git仓库只需要两步:
第一步:git add file 添加文件到暂存区
第二步:git commit -m "message" 提交版本库
4、git 的四种状态
- untracked 未被追踪
- modified 工作区修改了某个文件但还没有添加到暂存区
- staged 工作区修改的文件已添加到暂存区但还没提交到版本库
- committed 数据已存储到本地仓库仓库中
5、Git远程仓库
使用远程仓库的目的:备份,实现代码的集中化管理,代码共享。
5.1 本地Git仓库和GitHub仓库之间的传输是通过SSH加密,所以需要进行如下配置
(1)创建SSH key '
ssh-keygen -t rsa -C "youremail@example.com"
把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可.
在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
(2)登陆GitHub,打开“Account settings”,“SSH Keys”页面
填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
5.2 仓库关联
方式一:最好的方式是先创建远程库,然后,从远程库克隆。
Git支持多种协议,包括https,但ssh协议速度最快。克隆远程仓库的两种方式
(1)git clone https://github.com/maidu-xbd/git-learn2.git
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
(2)使用ssh协议 git clone git@github.com:maidu-xbd/git-learn2.git
方式二:先有本地库,后有远程库的时候,如何关联远程库。
要关联一个远程库,使用命令git remote add origin git@github.com:maidu-xbd/learnSpace.git;
关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
git remote rm <name> 删除远程库
git remote -v 查看远程库信息
二、git操作大全
git基本命令
命令 | 说明 |
mkdir git-space | 创建名为git-space目录 |
cd git-space | 进入到git-space目录 |
git init | 初始化git仓库,把当前目录变成Git可以管理的仓库 |
touch a.txt | 新建文件 |
vi a.txt | 进入a.txt文件,可以进行内容编辑 vi/vim 文本编辑器,基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。用户刚刚启动 vi/vim,便进入了命令模式 (1)按【i】键,进入insert输入模式 (2)写入merge信息 (3)按【Esc】键,退出insert模式 (4)按【shift】+【:】键,切换到底线命令模式 (5):wq保存并关闭文件 或 :q!不保存关闭文件 或 :w保存文件不关闭文件 (6)enter |
git clone 远程仓库地址 | 将远程仓库代码复制到本地仓库 |
git status | 查看工作区的状态 |
git diff | 查看修改内容 |
git log | 查看从近到远的提交日志 |
git reflog | 记录每一次命令 |
添加操作
git add [dir] | 添加指定目录到暂存区 |
git add [file1] [file2] ... | ... 添加一个或多个文件到暂存区 |
git add . | 添加当前目录下的所有文件到暂存区 |
删除操作
rm file | 删除文件 |
git rm file | 删除文件 |
git rm --cached filename | 删除暂存区的文件 |
git rm -f filename | 会在工作区(本地文件) 和 暂存区 中删除filename 文件,风险较大要慎用 |
git mv oldname newname | 重命名文件 |
比较差异操作
git diff | 比较工作区和暂存区文件差异 |
git diff --staged | 比较暂存区与版本库文件差异 |
git diff HEAD -- file | 查看工作区和版本库里面最新版本的区别 |
git diff 版本号 版本号 | 比较分支内两个版本的差异 |
git diff 分支 分支 | 比较两个分支的最新提交版本的差异 |
撤销操作
git commit --amend | 撤销上一次提交,并将暂存区的文件重新提交 |
git checkout -- file | 把文件在工作区的修改全部撤销,这里有两种情况: 一种是文件自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; 一种是文件已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。 总之,就是让这个文件回到最近一次git commit或git add时的状态。 注意:git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令 |
git reset HEAD <file> | 把暂存区的修改撤销掉(unstage),重新放回工作区 |
git reset --hard HEAD^ | 回退上一个版本(HEAD指针指向当前版本,上上一个版本表示为HEAD^^,往上n个版本,记为HEAD~n) |
git reset --hard 版本号 | 回退到指定版本,版本号没必要写全,前几位就可以了,Git会自动去找。 |
分支操作
分支操作 | 命令 | 说明 |
查看分支 | git branch | 查看分支,列出所有分支, 当前分支前面会标一个*号 |
创建分支 | git branch dev | 创建dev分支 |
修改分支名称 | git branch -m oldname newname |
|
切换分支 | git checkout dev | 切换到dev分支 |
git switch dev | 切换到dev分支 | |
创建+切换分支 | git checkout -b dev | 创建并切换到dev分支 |
git switch -c dev | 创建并切换到dev分支 | |
合并分支 | git merge dev | 合并dev分支到当前分支,fast forward模式 |
git merge --no-ff -m "merge with no-ff" dev | 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。 | |
git log --graph | 查看分支合并的情况 | |
删除分支 | git branch -d dev | 删除dev分支 |
git branch -D dev | 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除 | |
bug分支操作 | (1)git stash 把当前工作现场“储藏”起来,等以后恢复现场后继续工作 (2)在需要修复bug的分支上(如master分支)新建bug分支,修复bug后提交合并 (3)git stash pop 回到工作现场 (4)git cherry-pick commit 把bug提交的修改“复制”到当前分支,避免重复劳动。 | |
git stash list git stash apply stash0 应用 git stash drop stash0 删除 |
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
标签管理
(1)创建标签
git tag <tagname> 用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."可以指定标签信息;
git tag 查看所有标签。
git show <tagname> 查看标签信息
(2)操作标签
创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
git tag -d v1.0 删除标签v1.0
git push origin <tagname>可以推送一个本地标签;
git push origin --tags可以推送全部未推送过的本地标签;
git tag -d <tagname>可以删除一个本地标签;
git push origin :refs/tags/<tagname>可以删除一个远程标签。
三、操作实例如下
1.作为普通开发人员,得到开发任务时,务必要同步远程仓库(通常拉取master分支),拉取最新代码。
git clone #只有第一次获取代码需先clone
git pull #拉取远程仓库最新代码
2.得到远程最新代码后,在本地创建开发分支dev。
git checkout -b dev #创建并切换到dev分支
3.在本地dev分支中进行代码开发。
4.在本地dev分支中完成开发后,提交本地的开发内容到本地仓库。
git status -----查看状态,当前属于自己的开发分支dev
git add . -----添加到暂存区
git commit -m "新增功能" -----提交到本地仓库
5.切换到master分支,此时应该再次pull远端仓库进行同步,因为团队其他人员可能向远端提供了新代码。然后再将dev分支合并到master分支,如果远端有人修改,合并会产生冲突,此时务必解决冲突再合并。
git checkout master -----切换到master分支
git pull -----pull远程仓库进行同步
git merge --no-f -m "新增功能" dev -----合并dev分支到master分支
7.将本地仓库最新代码推送到远程仓库。
git push ----将本地代码同步到git远程仓库
8.切换到dev分支进行开发
git checkout dev ------在自己的本地分支dev中进行自己的开发
参考:https://www.liaoxuefeng.com/wiki/896043488029600/897013573512192