git简介
分布式版本控制软件
本地:一个文件,多个控制文件
集中式版本控制:历史版本在中心
分布式:历史版本在各自电脑均有一份
意义
版本回退;
多次多方修改;
操作逻辑
本质
git管理文件夹
步骤
进入要管理的文件夹(进门)
初始化(提名)
管理
生成版本
命令解读
git status # 查看文件状态
git add "" # 添加管理对象
git add . # 管理所有文件
个人信息配置(用户名和邮箱)
git config --global user.email "419997284@qq.com"git config --global user.name "Caesar-Victory"
git commit -m 'v1' # 生成版本信息
git status # 查看状态---无分支无版本信息
git log # 查看版本记录
理论
### 生成版本生成的版本不影响原来的版本对原版本的修改可以被 git status检测到,依然通过git add . 将修改增加到版本管理,然后再对其进行版本生成
分区介绍
工作区;暂存区;版本库工作区即为当前工作目录;分为已管目录和新文件/修改区【红色】;git add .将文件转交到暂存区【绿色】git commit -m '版本描述'将文件转交到版本库
版本回滚(溯源)
git log # 查看日志git reset --hard fe47e11aafeb736cc05551f5c0dda24a3a2e6e1b # 指定版本识别码
版本回滚(迈进)
git reflog # 查看重置日志git reset --hard eedd185 # 指定版本号
剔除修改检测
git checkout -- index.html # 指定文件(包含后缀),注意横线和文件名的空格
git reset HEAD index.html # 暂存区(绿色)--> 回退到工作区(红色)[能够检测修改的红色]
理论
### 版本控制原理保存修改部分,相当于系统快照基于主线可以创建多个分支,不同分支之间可以合并注意在适当的版本中创建分支(分支基于当前版本)
分支管理
git branch # 查看当前分支
创建分支
git branch [dev] # 创建分支
切换分支
git checkout dev # 切换分支
在主分支上合并版本【可能冲突,合并前解决】
git checkout master # 切换回主干git merge dev # 合并指定分支
理论—工作流
###工作流
将项目推到Github
1, 本地创建版本
git initgit add .git commit -m "20210708_v1"
2, 创建公钥
cd ~/.sshssh-keygen -t rsa -C "xxxxxxxxx@qq.com"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCucgPhSB5WvH2XwD+Zyx/VZRNEz8GuFDvzZsl10ECbBNgiYmZssu4qj+I1pVhM5cB+bP411Uo+8Bfo8Omm8= xxxxxxxxx@qq.com
3, 开始上传
lsgit remote add origin https://github.com/Caesar-Victory/Django-basical-knowledge.gitgit push -u origin master # 被推送对象git push -u origin dev # 推送其他分支
4,合并逻辑
先从本地拉取仓库数据,合并添加进入同一个版本,再次push
拉取指定分支
git clone -b master https://github.com/Caesar-Victory/Django-basical-knowledge.git
特殊命令
强制合并
$git pull origin master --allow-unrelated-histories
2.6 进军三里屯
###给远程仓库起别名git remove add origin 远程仓库地址[克隆时自动添加别名]### 向远程推送代码git push -u origin master [分支名称]### 克隆远程仓库代码git clone 远程仓库地址### 切换分支git checkout 分支
仓库密钥保存位置
C:\Users\41999\.ssh\id_rsa.pub
远程推送地址
C:\Users\41999\Documents\luffycity\dbhot>git remote add origin https://github.com/Caesar-Victory/experiencing-function-of-Git.git
主分支代码推送
C:\Users\41999\Documents\luffycity\dbhot>git push -u origin master
推送过程
Enumerating objects: 21, done.Counting objects: 100% (21/21), done.Delta compression using up to 8 threadsCompressing objects: 100% (14/14), done.Writing objects: 100% (21/21), 1.91 KiB | 977.00 KiB/s, done.Total 21 (delta 6), reused 0 (delta 0), pack-reused 0remote: Resolving deltas: 100% (6/6), done.To https://github.com/Caesar-Victory/experiencing-function-of-Git.git* [new branch] master -> masterBranch 'master' set up to track remote branch 'master' from 'origin'.
推送到其他分支
git push origin dev
推送过程(无则新增)
Enumerating objects: 4, done.Counting objects: 100% (4/4), done.Delta compression using up to 8 threadsCompressing objects: 100% (2/2), done.Writing objects: 100% (3/3), 318 bytes | 318.00 KiB/s, done.Total 3 (delta 0), reused 0 (delta 0), pack-reused 0remote:remote: Create a pull request for 'dev' on GitHub by visiting:remote: https://github.com/Caesar-Victory/experiencing-function-of-Git/pull/new/devremote:To https://github.com/Caesar-Victory/experiencing-function-of-Git.git* [new branch] dev -> dev
家庭环境拉取特定版本
git init # 初始化git remote add origin https://github.com/Caesar-Victory/experiencing-function-of-Git.git # 添加远程路径git pull origin dev # 先拉去主分支,再拉去dev分支git pull origin dev # 拉取指定分支、git branch dev # 在本地创建dev分支touch a2.py # 创建了新文件git add . # 将更新纳入版本git commit -m "在家里开发的a2功能"git push origin dev # 向远程推送更改
在公司开发
1. 切换到dev分支进行开发git checkout dev2. 把master分支合并到devgit merge master3. 修改代码4. 提交代码git add .git commit -m ""git push origin dev
开发完毕,进行发布(进入公司)
git branch # 检查当前所处分支touch a3.py # 创建新文件git add .git commit -m "开发完毕"git checkout master # 切换分支,开始合并git merge dev # 完成版本合并git push origin master # 将公司代码推送到仓库matser分支
推送过程
Enumerating objects: 6, done.Counting objects: 100% (6/6), done.Delta compression using up to 8 threadsCompressing objects: 100% (4/4), done.Writing objects: 100% (5/5), 509 bytes | 509.00 KiB/s, done.Total 5 (delta 1), reused 0 (delta 0), pack-reused 0remote: Resolving deltas: 100% (1/1), done.To https://github.com/Caesar-Victory/experiencing-function-of-Git.gite244a99..0428ad9 master -> master
对dev版本进行上云
git pull origin dev # 将远程dev拉去下来### 等价命令git fetch origin dev # 从仓库拉取到版本库git merge origin/dev # 从版本库与分支合并--------------------------------------------------git push origin dev # 将远程和本地差异化文件全部推送至远程
rebase版本合并
第一种 线性合并
- 两种版本选取方式
### 第一种git rebase -i HEAD~3 #从最后一个版本算起,合并最近三个版本### 第二种git rebase -i[startpoint][endpoint] # 起止为识别码
针对特定版本的修改命令及其意义
pick:保留该commit(缩写:p)reword:保留该commit,但我需要修改该commit的注释(缩写:r)edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)squash:将该commit和前一个commit合并(缩写:s)fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)exec:执行shell命令(缩写:x)drop:我要丢弃该commit(缩写:d)作者:liqingbiubiu链接:https://www.jianshu.com/p/4a8f4af4e803来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
合并后修改注释
#This is a combination of 3 commits.# The first comnit's message is:add b.phpThis is the 2nd commit message: # 这是合并后的提交注释信息发布文,根据自己需求,修改注释add c.php#This is the 3rd commit message:add d.php#Please enter the commit message for your changes. Lines starting# with'#' will be ignored,and an empty message aborts the commit.#口的定找们本次rebase操作包含的所有提交,下面注释邯分是gi为我们提供的命令说明。每一个# Date: 星期,月份,日 511:03:02 2018 +0800#interactive rebase in progress; onto 36224db# Last commands done (3 commands done):# s 90bc004 add c.phpnrnit的注释(缩写:r)# s 45edfda add d.php# No commands remaining.# You are currently editing a commit while rebasing branch 'ssss' on '36224db'.#和前一个commit合并,但我不要保留该提交的注释信息((缩写:f)# Changes to be committed:# new file: b.php# new file:c.php# new file: d.php
注意
保存命令为vim
:q!强制放弃并且退出:wq 保存并且退出
第二种 跨分支合并(场景构建)
dev分支的修改
git branch* mastergit branch devgit checkout devSwitched to branch 'dev'git branch* devmaster
创建文件且提交版本
new-item dev.py -type fileDirectory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebaseMode LastWriteTime Length Name---- ------------- ------ -----a--- 2021/7/8 19:55 0 dev.pygit statusOn branch devUntracked files:(use "git add <file>..." to include in what will be committed)dev.pynothing added to commit but untracked files present (use "git add" to track)git branch* devmastergit add .git commit -m "dev branch"[dev 213ce9c] dev branch1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 dev.py
切换主分支且提交版本
git checkout masterSwitched to branch 'master'git branchdev* masternew-item master.py -type fileDirectory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebaseMode LastWriteTime Length Name---- ------------- ------ -----a--- 2021/7/8 19:59 0 master.pygit add .git commit -m "master function"[master a8f1b6f] master function1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 master.py
图形化查看日志的方式
git log --graph* commit 757e6a7a03647270de5ded81677caeb716a52e44 (HEAD -> master)|\ Merge: a8f1b6f 213ce9c| | Author: Caesar-Victory <419997284@qq.com>| | Date: Thu Jul 8 20:04:46 2021 +0800| || | Merge branch 'dev'| || * commit 213ce9ce04ba7d5ac567b138ff1455945f45fef8 (dev)| | Author: Caesar-Victory <419997284@qq.com>| | Date: Thu Jul 8 19:56:46 2021 +0800| || | dev branch| |* | commit a8f1b6f938b019c3c68690928b3edd32eba8193d|/ Author: Caesar-Victory <419997284@qq.com>| Date: Thu Jul 8 20:00:01 2021 +0800|| master function|* commit edb2c676cade83839c5e24f851e594a517aaf3d5| Author: Caesar-Victory <419997284@qq.com>| Date: Thu Jul 8 19:05:54 2021 +0800|| v2 & v3 & v4|* commit f365ae4e03518dcc1918bd385ebb7759cb8b68d5Author: Caesar-Victory <419997284@qq.com>Date: Thu Jul 8 19:04:53 2021 +0800v1
格式化显示版本信息
git log --graph --pretty=format:"%h %s" # h表示hash值,s指的是版本记录* 757e6a7 Merge branch 'dev'|\| * 213ce9c dev branch* | a8f1b6f master function|/* edb2c67 v2 & v3 & v4* f365ae4 v1
dev合并master分支
* f365ae4 v1git branchdev* mastergit checkout devSwitched to branch 'dev'git merge masterUpdating 213ce9c..757e6a7Fast-forwardmaster.py | 01 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 master.pytree /f文件夹 PATH 列表卷序列号为 0832-D49BC:.1.py2.py3.py4.pydev.pymaster.py
在dev分支新建文件【dev1.py】,然后提交版本【dev branch commit 1】
new-item dev1.py -type fileDirectory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebaseMode LastWriteTime Length Name---- ------------- ------ -----a--- 2021/7/8 20:42 0 dev1.pygit add .git commit -m "dev branch commit 1"[dev bd9561e] dev branch commit 11 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 dev1.py
主分支创建文件【master1.py】并且提交版本【master 111】
git checkout masterSwitched to branch 'master'new-item master1.py -type fileDirectory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebaseMode LastWriteTime Length Name---- ------------- ------ -----a--- 2021/7/8 20:47 0 master1.pygit add .git commit -m "master 111"[master d9e1950] master 1111 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 master1.py
分别检查dev 和 master 版本信息
### dev 分支git log --graph --pretty=format:"%h %s"* bd9561e dev branch commit 1* 757e6a7 Merge branch 'dev'|\| * 213ce9c dev branch* | a8f1b6f master function|/* edb2c67 v2 & v3 & v4* f365ae4 v1### master 分支git log --graph --pretty=format:"%h %s"* d9e1950 master 111* 757e6a7 Merge branch 'dev'|\| * 213ce9c dev branch* | a8f1b6f master function|/* edb2c67 v2 & v3 & v4* f365ae4 v1
合并分支分步骤进行
### 站在dev分支变基mastergit checkout devSwitched to branch 'dev'git rebase masterSuccessfully rebased and updated refs/heads/dev.
### 切换到master然后合并分支git checkout masterSwitched to branch 'master'git merge devUpdating d9e1950..77851fcFast-forwarddev1.py | 01 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 dev1.py
```bash
查看版本记录
git log —graph —pretty=format:”%h %s”
- 77851fc dev branch commit 1
- d9e1950 master 111
- 757e6a7 Merge branch ‘dev’ |\ | * 213ce9c dev branch
- | a8f1b6f master function |/
- edb2c67 v2 & v3 & v4
- f365ae4 v1 ```
2.6.9 快速解决冲突
处理逻辑
- 安装beyond compare
- 在Git中配置
- 应用beyond compare解决冲突
- 参考信息
[配置指南]:git配置Beyond Compare - - php中文网博客
[未经验证的配置方案]:Windows平台下使用Beyond Compare作为GIT默认的比对与合并工具 - HTL - 博客园 (cnblogs.com)
git mergetool file
Mac下配置方法
git config --local merge.tool bc3git config --local mergetool.path 'C:\Program Files\Beyond Compare 4\BCompare.exe'git config --local mergetool.keppBackup false # 备份文件无需保留
Windows10 配置方案
### 源:https://blog.csdn.net/weixin_30453491/article/details/113566354#difftool 配置git config --global diff.tool bc4git config --global difftool.bc4.path "C:\Program Files\Beyond Compare 4\bcomp.exe"#mergeftool 配置git config --global merge.tool bc4git config --global mergetool.bc4.cmd "C:\Program Files\Beyond Compare 4\bcomp.exe"
配置文件新增内容
文件路径
C:\Program Files\Git\etc\gitconfig
配置信息
[diff]tool = bc4[difftool "bc4"]cmd = "\"C:/Program Files/Beyond Compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\""[merge]tool = bc4[mergetool "bc4"]cmd = "\"C:/Program Files/Beyond Compare 4/bcomp.exe\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""
查看电脑当前的配置
git difftool --tool-helpgit mergetool --tool-help'git difftool --tool=<tool>' may be set to one of the following:vimdiffvimdiff1vimdiff2vimdiff3The following tools are valid, but not currently available:araxisbcbc3bc4codecomparedeltawalkerdiffmergediffuseecmergeemergeexamdiffguiffygvimdiffgvimdiff1gvimdiff2gvimdiff3kdiff3komparemeldnvimdiffnvimdiff1nvimdiff2nvimdiff3opendiffp4mergesmergetkdiffwinmergexxdiff
权限不足的解决策略
修改文件权限,步骤依次为:属性—>安全—>权限编辑—>完全控制
命令总结
### 添加远程连接git remote add origin 地址### 推送代码git push origin 分支### 拉取代码git pull origin 分支 # 等价于 git fetch origin dev + git merge origin /dev### 下载代码git clone 地址### 变基git rebase### 记录图形展示git log --graph --pretty=format:"%h %s"### 合并命令git merget### 移除远程仓库git remote rm origin # 需管理员权限### 关闭SSL认证git config --global http.sslVerify "false"
团队协作逻辑
主要分支
master:主分支,也可以称为基分支,发布分支
dev: 开发分支
release:预发布版本主要负责修复bug,code review
dev-branch:合作开发分支,团队成员从dev开发分支copy一个分支用于功能开发
主管操作
### 给版本打标签git tag -a v1 -m "第一版"### 将tag推送至仓库git push origin --tags### 创建并且切换至dev版本git checkout -b dev### 将dev推送至仓库git push origin dev### 在小弟提交pull request之后审核同意,本地拉取合并后的代码git branch # 查看分支状态,在dev拉取仓库devgit pull origin dev
小弟分支的操作
git clone # 本地文件夹直接克隆,无需生成gitgit log # 查看项目情况### 切换到开发分支git checkout dev### 创建斗地主分支git checkout -b ddz### 检查分支情况git branch### 创建并且提交斗地主功能开发,以及上传仓库touch 斗地主.pygit add .git commit -m "斗地主功能开发中"git push origin ddz<------------------------------------->vim 斗地主.pygit add .git commit -m "加班完成开发"git push origin ddz<------------------------------------->
项目主管的release工作
### 在dev分支创建release分支git checkout -b release### 向仓库推送release分支git push origin release### 主管已经完成release分支代码审核工作,将其合并给master 并且删除release分支### 切换分支到dev[以下均为本地操作]git checkout dev### 将release版本合并到devgit merge release### 删除release分支git branch -d release### 拉取仓库master分支,生成v2版本git pull origin master### 本地生成标签git tag -a v2 -m "第二个版本 增加斗地主功能"### 将本地标签推送至仓库git push origin --tags
注意
可能产生冲突,自行解决后合并
2.9 第七阶段:给开源软件贡献代码
- fork源代码
将别人源代码拷贝到我的远程仓库; - 在自己仓库进行修改代码
- 给源代码的作者提交修复bug的申请(pull request)
3.0 配置文件
### 配置文件位置:vim .git/configgit config --local user.name "Caesar"git config --local user.email "123456789@qq.com"
### 配置文件位置:~/.gitconfig[当前用户所在目录]git config --global user.name "Caesar"git config --global user.email "123456789@qq.com"
### 配置文件位置:/etc/.gitconfig### 需要root权限git config --system user.name "Caesar"git config --system user.email "123456789@qq.com"
git config --local merge.tool bc3git config --local mergetool.path '/user/local/bin/bcomp'git config --local mergetool.keppBackup falsegit remote add origin 地址 # 默认添加在本地配置文件中(--local)
免密登录
URL中体现
原来的地址https://github.com/Caesar-Victory/Stacer.git修改的地址https://用户名:密码@github.com/Caesar-Victory/Stacer.gitgit remote add origin https://用户名:密码@github.com/Caesar-Victory/Stacer.gitgit push origin master# 或者修改本地配置文件
SSH实现
1, 生成公钥和私钥(默认生成在~/.ssh)ssh-keygen -r ssa2, 拷贝公钥的内容并且设置到Github中3,在git本地中配置SSH地址git remote add origin git@github.com:Caesar-Victory/Stacer.git
- git自动管理凭证
Git忽略文件
让Git不再管理当前目录下的某些文件
### vim 编辑vim .gitignore文件内写入文件名和后缀,跨行书写*.h凡此后缀,均不管理.gitignore 免除对文件本身的管理files/忽略该目录所有文件!a.h 除该文件以外*.py[c|a|b] 同时忽略.pyc/.pya.pyb### 再次git statusgit status
更多规则参考:[https://github.com/github/gitignore]
意义:忽略关键文档,防止泄密
任务管理相关
issues 文档及任务管理
### 标签 9 labels#bugsomething isn't working#documentationlmprovements or additions to documentation#duplicateThis issue or pull request already exists#enhancementNew feature or request#good first issueGood for newcomers#help wantedExtra attention is needed#invalidThis doesn't seem right#questionFurther information is requested#wontfixThis will not be worked on
wiki 项目文档
自行添加m
环境保持
参考与引用
[powershell]:Release v7.1.3 Release of PowerShell · PowerShell/PowerShell (github.com)
[教程]:git push后出现src refspec dev does not match any_kevin的博客-CSDN博客
[教程]:在《Pro Git》引用格式推送这节中出现 fatal: invalid refspec ' topic:refs/remotes/origin/topic' 报错_Wis Yoong 的博客-CSDN博客 fatal%3A invalid refspec ‘ topic%3Arefs%2Fremotes%2Forigin%2Ftopic’ 1 因为在,Git 的提交。 结果 报错 。 查看Tortoise Git ->Settings:发现这里环境变量和设置的环境变量不一致,猜测是注册表的问题。)
[rebase教程]:【Git】rebase 用法小结 - 简书 (jianshu.com)
致谢
感谢武沛齐老师及路飞学城的无私分享,场景化,独特的教学方式使得学生学完印象深刻,感谢他们的开源精神。
附上哔哩哔哩Git教程视频链接
点击查看【bilibili】
