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-keygen -t rsa -C "443267325@qq.com"
- 登录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 git@github.com:jiangjing123/learngit.git
- $ git push -u origin master
- 由于远程是空的,第一次推送master分支时,要加参数-u 参数,Git会把本地的master分支内容推送到远程,还会把本地master分支和远程master分支关联起来
- 把当前分支推送到远程
- $ git push origin master
- Gitee
- 左侧添加仓库
- 在路径填写learngit 其他设置保持默认,点击确认:则成功创建一个新的主题
- $git remote add origin git@gitee.com: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 git@gitee.com: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 git@gitee.com: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
- 添加新的仓库
- 创建SSH KEY
- 从远程库克隆
- $ cd F:/Program/1-Git/1-project 选择目录
- 克隆一个本地库 $ git clone git@gitee.com: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 git@gitee.com: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 全部推送
- 删除标签
- 注意事项
- 标签不是按时间顺序列出,而是按字母排序