Git
-
Git准备工作
- Git说明
- Git安装
-
Git创建仓库命令
- $mkdir learngit
- $cd learngit
-
$pwd
- /c/Users/jing
- 初始化一个Git仓库,使用git init命令。
-
其他
- Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的
- 跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等
-
命令
- 添加文件到仓库
-
为什么将文件添加到仓库中需要两步?1.因为commit可以一次性添加多个文件,即相当于每次都add 一个文件到一个list中,commit提交的时候就把刚刚list所有的文件都提交道仓库中 message提示信息即此次提交主要是干什么操作
-
1. git add readme.txt
-
fatal: not a git repository (or any of the parent directories)
-
Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的
- 创建仓库 git init
-
Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的
-
fatal: pathspec 'readme.txt' did not match any files
- 添加某个文件时,该文件必须在当前目录下存在,用ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。
-
fatal: not a git repository (or any of the parent directories)
- 2.git commit -m "message filelist"
-
1. git add readme.txt
-
版本回退
-
$vi readme.txt 编辑文件
- 编辑完成之后按esc 然后输入:wq 退出当前编辑
- 参考链接:https://blog.csdn.net/zym18351887819/article/details/80468525
- $Git log 查看版本历史记录
- $git log --pretty=oneline 格式化排版结构 查看里版本历史记录
-
$git reset --hard Head^ 回滚到上一个版本
- Head^上一个版本;
- Head^^上上一个版本
- Head~100 往上100个版本
- $cat readme.txt 读取文件的内容
-
$git reset --hard ed8ecd12 撤销回滚到上一个版本,还是想保留当前版本(重返未来)
- hard commit_id 不一定全部写完,但是要多些几位,因为数据庞大 不一定找得到
- $git reflog 查看命令历史,已确定要回到未来的哪一个版本
- $git status 读取文件状态,后面需要跟文件名
-
$vi readme.txt 编辑文件
-
工作区和暂存区
- git add 把文件添加到缓存区
- git commit 提交修改,把暂存区的所有内容提交到当前分支
- Git自动创建唯一一个master分支,所以,现在git commit 就是往master分之上提交更改
-
管理修改
- Git跟踪并管理的是修改过程,而不是文件
-
第一次修改--git add --第二次修改--git commit
- 因为第一次修改将文件add 提交到暂存区,在第二次修改之后commit 在工作区查看的版本是第一次修改之后的
- 如果要看第二次修改之后的 则需要提交 add 至缓存区然后再commit
-
撤销修改
-
修改了文件但是还没有Add
- git checkout -- readme.txt
-
修改了文件并且Add到暂存区
- git reset HEAD readme.txt 把暂存区的修改撤销掉
- git checkout -- readme.txt
- 修改了文件并提交到了版本库,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库
-
修改了文件但是还没有Add
-
删除文件
- rm text.txt 删除文件
- 从版本库中删除文件,git rm text.txt 并且git commit 提交
-
删除错了,需要还原
- git checkout -- text.txt
- 无论工作区的修改还是删除 都可以一键还原
-
远程仓库
-
创建SSH KEY
- 在用户主目录下,.ssh目录,id_rsa私钥 id_rsa.pub 公钥
-
如果没有SSH 则创建**
- ssh-****** -t rsa -C "[email protected]"
- 登录Gitee 或者GitHub 在设置里面 SSH Keys 页面 Add SSH Key 添加 id-rsa.pub内容
- Gitee或者GitHub 需要SSHKey 需要识别你推送的你提交的是你推送的,而不是别人冒充的,而Git支持SSH协议,所以GitHub只要知道你的公钥,就可以确认只有你自己才能推送
- Gitee 或者GitHub 允许添加多个key
-
添加远程库
-
添加新的仓库
-
GitHub
- 左上角:create a new repo
- 在 Repository name 填写learngit 其他保持默认设置,点击确认;则成功创建一个新的Git
- $git remote add origin [email protected]:jiangjing123/learngit.git
-
$ git push -u origin master
- 由于远程是空的,第一次推送master分支时,要加参数-u 参数,Git会把本地的master分支内容推送到远程,还会把本地master分支和远程master分支关联起来
- 把当前分支推送到远程
- $ git push origin master
-
Gitee
- 左侧添加仓库
- 在路径填写learngit 其他设置保持默认,点击确认:则成功创建一个新的主题
- $git remote add origin [email protected]:jing_all/learngit.git
-
$ git push -u origin master(第一次)
- 把当前分支推送到远程
- 由于远程是空的,第一次推送master分支时,要加参数-u 参数,Git会把本地的master分支内容推送到远程,还会把本地master分支和远程master分支关联起来
-
报错:fatal: Authentication failed for 'https://gitee.com/jing_all/learngit.git/' 修改了码云的登录密码,但是本地凭证没有进行修改
- 控制面板-用户账户-凭证管理-windows凭证
- 找到gitee密码并修改为现在的密码
- $ git push origin master (之后)
-
其他:
-
连接远程仓库时报错,fatal: remote origin already exists
- $ git remote rm origin
- $git remote add origin [email protected]:jing_all/learngit.git
-
如果执行 git remote rm origin 报错的话,我们可以手动修改gitconfig文件的内容
-
$ vi .git/config
- 把 [remote “origin”] 那一行删掉就好了。
-
$ vi .git/config
-
当第一次使用clone 或者push命令连接GitHub时,会得到警告:
-
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.RSA key fingerprint is xx.xx.xx.xx.xx.Are you sure you want to continue connecting (yes/no)?
- 第一次验证GitHub或者gitee 服务器的key时,需要yes确认
-
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.RSA key fingerprint is xx.xx.xx.xx.xx.Are you sure you want to continue connecting (yes/no)?
-
Git连接指定的仓库
-
添加指定仓库$ git remote add origin https://gitee.com/jing_all/learngit.git
- 报错:fatal: remote origin already exists.
- 查看远程库信息:$ git remote -v
-
解决方案:
- $ git remote rm origin (删除关联的orgin)的远程库
- $ git remote add origin [email protected]:jing_all/learngit.git :连接指定仓库
-
$ git remote rm origin
- error: Could not remove config section 'remote.origin'
-
解决方案:需要修改gitconfig 文件内容
- 方案1;
- $ vi .git/config
- 把 [remote “origin”] 那一行删掉就好了。
-
方案2:
- 找到github安装路径,
- 找到一个名为gitconfig的文件,打开它把里面的[remote "origin"]那一行删掉就好了
-
添加指定仓库$ git remote add origin https://gitee.com/jing_all/learngit.git
-
连接远程仓库时报错,fatal: remote origin already exists
-
GitHub
-
从远程库克隆
- $ cd F:/Program/1-Git/1-project 选择目录
- 克隆一个本地库 $ git clone [email protected]:jing_all/learngit.git
- 选择当前克隆的仓库learnGit目录:$ cd learngit
- 查看当前目录下文件: $ls
-
其他
- GitHub给出的地址不止一个,还可以用https://gitee.com/jing_all/learngit.git
- Git支持多种协议:默认的git://使用ssh,但也可以使用https等其他协议
- 使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令
-
分支管理
- 说明:提交效率,不冲突,不影响他人工作
-
创建并合并分支
-
原理
- master分支是一条线,Git用master指向最新提交,再用Head指向master,就能确定当前分支,以及当前分支的提交点
- 每次提交,master分支都会向前移动一步,master分支线越来越长
- 创建新的分支,例如dev时,Git新建了一个指针dev,指向master相同的提交,再把Head指向dev,就表示当前分支在dev上
-
创建dev分支
-
$ git checkout -b dev
- 1.$git branch dev
- 2.$git checkout dev
- 查看当前分支:$git branch
- $git add readme,txt
- $git commit -m "branch test"
-
$ git checkout -b dev
-
切换分支
- 切换分支master $git checkout master
- 合并分支 $git merge dev
- 合并完成后,删除分支dev $git branch -d dev
- 查看: $git branch
-
其他
-
切换分支
- git checkout <name>
- git switch <name>
-
查看分支
- git branch
-
创建分支
- git branch <name>
-
创建+切换分支
- git checkout -b <name>
- git switch -c <name>
-
合并某分支到当前分支
- git merge <name>
-
删除分支
- git branch -d <name>
-
切换分支
-
原理
-
解决冲突
-
原理
- 可以通过查看readme.txt 根据需要自动处理冲突文档内容
-
解决冲突
-
1.创建新的分支
- $ git switch -c featurel
- $ vi readme.txt 修改文件内容
- $ git add readme.txt
- $git commit -m "And simple"
-
2.切换maser分支
- $ git switch master
- $ vi readme.txt
- $ git add readme.txt
- $git commit -m "$ simple"
-
3.产生冲突
- $git merge featurel 快速合并
- $ git status 冲突文件
- $ vi readme.txt
- $ git add readme.txt
- $git commit -m "conflict fixed"
-
4.合并情况
- $ git log
- $ git log --graph --pretty=oneline --abbrev-commit 分支合并图格式化
- $ git branch -d feature1 删除分支
-
1.创建新的分支
-
原理
-
分支管理策略
- 原理
-
1.创建分支
- $ git switch -c dev
- vi readme.txt
- $ git add readme.txt
- $git commit -m "add merge"
-
2.切换分支
- $git switch master
-
$ git merge --no-ff -m "merge with no-ff" dev 请注意--no-ff参数,表示禁用Fast forward
- Fast forward模式:删除分支后,会丢掉分支信息。
- 本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
-
3.分支历史
- $ git log --graph --pretty=oneline --abbrev-commit
-
Bug分支
-
原理
- 修复bug时,会通过创建新的bug分支进行修复,然后合并,最后删除
-
1.“储藏”工作现场
- git stash
- $git status 查看工作区,没有被Git管理的文件,因此可以放心创建分支修复bug
-
2.确认分支位置
- $git checkout master 查看当前位置
- $git checkout -b issue-101 创建临时分支
-
3.修复bug
- $ git add readme.txt
- $ git commit -m "fix bug 101"
-
4. 切换分支位置
- $ git switch master 切换分支
- $ git merge --no-ff -m "merged bug fix 101" issue-101 完成合并后删除issue 101分支
-
5.返回“储藏”工作现场
- $ git switch dev
- $ git status
- $ git stash list :查看储藏位于哪
-
5.1
-
复制特定的提交到当前分支
- $ git branch
- $ git cherry-pick 4c805e2
-
复制特定的提交到当前分支
-
原理
-
Feature分支
-
原理
- 添加一个新功能,为了不把主分支搞乱,所以每添加一个新功能,最好新建一个feature分支,完成后,合并,再删除分支
-
1.创建新分支
- $git switch -c feature-vulcan
- $vi vulcan.py
- $ git add vulcan.py
- $ git status
- $git commit -m "add feature vulcan"
-
2.切回dev 分支 准备合并
- $ git switch dev
- 类似与bug 合并分支
-
3.销毁分支
-
$ git branch -d feature-vulcan
-
error: The branch 'feature-vulcan' is not fully merged. 销毁失败
-
因分支还没有合并,删除将丢失修改,如果强行删除 则
- $ git branch -D feature-vulcan
-
因分支还没有合并,删除将丢失修改,如果强行删除 则
-
error: The branch 'feature-vulcan' is not fully merged. 销毁失败
-
$ git branch -d feature-vulcan
-
原理
-
多人协作
- 原理
-
操作
-
多人协作
- 查看远程信息 $ git remote
- 查看远程详细信息 $ git remote -v
- 如果没有推送权限,就看不到push地址
-
推送分支
-
$ git push origin master
- master:分支名称
- master分支是主分支,时刻与远程分支同步
- dev是开发分支,团队所有成员都需要在上面工作,也需要远程同步
- bug分支只用于本地修复bug
- feature分支 取决于是否合作开发
-
$ git push origin master
-
抓取分支
- 原理:多人合作 往往会master和dev分支推送各自修改
- $ git clone [email protected]:jing_all/learngit.git 克隆
- $git branch 查看分支
-
操作人A:$ git checkout -b dev origin/dev 创建本地分支
- $ git add env.txt
- $ git commit -m "add env"
- $ git push origin dev 提交修改
-
操作人B 提交修改,产生冲突
- $ cat env.txt
- $ git add env.txt
- $ git commit -m "add new env"
-
$ git push origin dev 产生冲突
-
$ git pull 把最新的提交从origin/dev 抓取下来
- $ git branch --set-upstream-to=origin/dev dev 本地分支与远程分支链接
-
$ git pull
- 提示no tracking information
- 则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
- 合并有冲突 手动解决
- $ git commit -m "fix env conflict"
- $ git push origin dev
-
$ git pull 把最新的提交从origin/dev 抓取下来
-
多人协作
-
总结
- 可以试图用git push origin <branch-name>推送自己的修改
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功
-
总结
- 查看远程库信息:使用git remote -v;
- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
- 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
- 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突
-
Rebase :变基
- $ git rebase
- $ git log --graph --pretty=oneline --abbrev-commit
-
标签管理
- 原理
-
创建标签
-
切换到需要打标签的分支上
- $ git branch
- $ git checkout master
-
添加标签
- $ git tag v1.0
-
创建带有说明的标签,用-a指定标签名,-m指定说明文字:
- $ git tag -a v0.1 -m "version 0.1 released" 1094adb
-
标签历史数据
- $ git log --pretty=oneline --abbrev-commit
- 查找commit id 对应打标签$ git tag v0.9 f52c633
- 查看标签 $ git tag
-
查看标签信息
- $ git show v0.9
-
切换到需要打标签的分支上
-
操作标签
-
删除标签
-
本地标签
-
$ git tag -d v0.1
- 创建的标签 都只存储在本地,不会自动推送远程
-
$ git tag -d v0.1
-
远程标签
- 1.删除本地:$ git tag -d v0.9
- 2.删除远程 $ git push origin :refs/tags/v0.9
-
本地标签
-
推送标签到远程
- $ git push origin v1.0
- $ git push origin --tags 全部推送
-
删除标签
-
注意事项
- 标签不是按时间顺序列出,而是按字母排序