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 relog # k
理论
### 生成版本
生成的版本不影响原来的版本
对原版本的修改可以被 git status检测到,依然通过git add . 将修改增加到版本管理,然后再对其进行版本生成
分区介绍
工作区;暂存区;版本库
工作区即为当前工作目录;分为已管目录和新文件/修改区【红色】;
git add .
将文件转交到暂存区【绿色】
git commit -m '版本描述'
将文件转交到版本库
版本回退
git log # 查看日志
git reset --hard fe47e11aafeb736cc05551f5c0dda24a3a2e6e1b # 指定版本识别码
# 第二种方法
git reset --hard HEAD ^ (该符号的个数决定回溯的版本数)
如果当前回退版本过多则可以使用数字代替 ^
# 参考与引用
```https://blog.csdn.net/weixin_44614772/article/details/103839263```
版本前进
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 # 合并指定分支
git merge --abort
理论—工作流
###工作流
将项目推到Github
1, 本地创建版本
git init
git add .
git commit -m "20210708_v1"
2, 创建公钥
cd ~/.ssh
ssh-keygen -t rsa -C "xxxxxxxxx@qq.com"
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCucgPhSB5WvH2XwD+Zyx/VZRNEz8GuFDvzZsl10ECbBNgiYmZssu4qj+I1pVhM5cB+bP411Uo+8Bfo8Omm8= xxxxxxxxx@qq.com
3, 开始上传
ls
git remote add origin https://github.com/Caesar-Victory/Django-basical-knowledge.git
git 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
标签相关设置
# 设置标签及描述
git tag -a v1.4 -m "description"
# 为特定版本设置标签
git tag -a v1.2 9fceb02
# 查看标签及描述
git show v1.4
# 提交特定标签
git push origin v1.4
# 提交所有标签
git push origin --tags
# 删除标签
git tag -d v1.4-lw
# 同步删除标签的两种方法
git push origin :refs/tags/v1.4-lw
git push origin --delete <tagname>
查看标准化提交记录
git log --pretty=oneline
删除指定版本
# 如果创建顺序和版本分别是1, 2 那么commitid应该是2,在2才能删除1,commitid为版本记录中的hash值部分
git rebase -i commitid
# vim编辑配置文件,将指定版本的pick 修改为 drop
# 参考链接 : ```https://www.cnblogs.com/ikai/p/14256800.html```
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 threads
Compressing 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 0
remote: Resolving deltas: 100% (6/6), done.
To https://github.com/Caesar-Victory/experiencing-function-of-Git.git
* [new branch] master -> master
Branch '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 threads
Compressing 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 0
remote:
remote: Create a pull request for 'dev' on GitHub by visiting:
remote: https://github.com/Caesar-Victory/experiencing-function-of-Git/pull/new/dev
remote:
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 dev
2. 把master分支合并到dev
git merge master
3. 修改代码
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 threads
Compressing 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 0
remote: Resolving deltas: 100% (1/1), done.
To https://github.com/Caesar-Victory/experiencing-function-of-Git.git
e244a99..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.php
This 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
* master
git branch dev
git checkout dev
Switched to branch 'dev'
git branch
* dev
master
创建文件且提交版本
new-item dev.py -type file
Directory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebase
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2021/7/8 19:55 0 dev.py
git status
On branch dev
Untracked files:
(use "git add <file>..." to include in what will be committed)
dev.py
nothing added to commit but untracked files present (use "git add" to track)
git branch
* dev
master
git add .
git commit -m "dev branch"
[dev 213ce9c] dev branch
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dev.py
切换主分支且提交版本
git checkout master
Switched to branch 'master'
git branch
dev
* master
new-item master.py -type file
Directory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebase
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2021/7/8 19:59 0 master.py
git add .
git commit -m "master function"
[master a8f1b6f] master function
1 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 f365ae4e03518dcc1918bd385ebb7759cb8b68d5
Author: Caesar-Victory <419997284@qq.com>
Date: Thu Jul 8 19:04:53 2021 +0800
v1
格式化显示版本信息
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 v1
git branch
dev
* master
git checkout dev
Switched to branch 'dev'
git merge master
Updating 213ce9c..757e6a7
Fast-forward
master.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 master.py
tree /f
文件夹 PATH 列表
卷序列号为 0832-D49B
C:.
1.py
2.py
3.py
4.py
dev.py
master.py
在dev分支新建文件【dev1.py】,然后提交版本【dev branch commit 1】
new-item dev1.py -type file
Directory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebase
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2021/7/8 20:42 0 dev1.py
git add .
git commit -m "dev branch commit 1"
[dev bd9561e] dev branch commit 1
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dev1.py
主分支创建文件【master1.py】并且提交版本【master 111】
git checkout master
Switched to branch 'master'
new-item master1.py -type file
Directory: C:\Users\41999\Documents\luffycity\sanlitun\pro_rebase
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2021/7/8 20:47 0 master1.py
git add .
git commit -m "master 111"
[master d9e1950] master 111
1 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分支变基master
git checkout dev
Switched to branch 'dev'
git rebase master
Successfully rebased and updated refs/heads/dev. -
### 切换到master然后合并分支
git checkout master
Switched to branch 'master'
git merge dev
Updating d9e1950..77851fc
Fast-forward
dev1.py | 0
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 dev1.py -
### 查看版本记录
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 mergetool file
Mac下配置方法
git config --local merge.tool bc3
git 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 bc4
git config --global difftool.bc4.path "C:\Program Files\Beyond Compare 4\bcomp.exe"
#mergeftool 配置
git config --global merge.tool bc4
git 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-help
git mergetool --tool-help
'git difftool --tool=<tool>' may be set to one of the following:
vimdiff
vimdiff1
vimdiff2
vimdiff3
The following tools are valid, but not currently available:
araxis
bc
bc3
bc4
codecompare
deltawalker
diffmerge
diffuse
ecmerge
emerge
examdiff
guiffy
gvimdiff
gvimdiff1
gvimdiff2
gvimdiff3
kdiff3
kompare
meld
nvimdiff
nvimdiff1
nvimdiff2
nvimdiff3
opendiff
p4merge
smerge
tkdiff
winmerge
xxdiff
权限不足的解决策略
修改文件权限,步骤依次为:属性—>安全—>权限编辑—>完全控制
命令总结
### 添加远程连接
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拉取仓库dev
git pull origin dev
小弟分支的操作
git clone # 本地文件夹直接克隆,无需生成git
git log # 查看项目情况
### 切换到开发分支
git checkout dev
### 创建斗地主分支
git checkout -b ddz
### 检查分支情况
git branch
### 创建并且提交斗地主功能开发,以及上传仓库
touch 斗地主.py
git add .
git commit -m "斗地主功能开发中"
git push origin ddz
<------------------------------------->
vim 斗地主.py
git 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版本合并到dev
git 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/config
git 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 bc3
git config --local mergetool.path '/user/local/bin/bcomp'
git config --local mergetool.keppBackup false
git remote add origin 地址 # 默认添加在本地配置文件中(--local)
免密登录
URL中体现
原来的地址
https://github.com/Caesar-Victory/Stacer.git
修改的地址
https://用户名:密码@github.com/Caesar-Victory/Stacer.git
git remote add origin https://用户名:密码@github.com/Caesar-Victory/Stacer.git
git push origin master
# 或者修改本地配置文件
SSH实现
1, 生成公钥和私钥(默认生成在~/.ssh)
ssh-keygen -r ssa
2, 拷贝公钥的内容并且设置到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 status
git status
更多规则参考:[https://github.com/github/gitignore]
意义:忽略关键文档,防止泄密
任务管理相关
issues 文档及任务管理
### 标签 9 labels
#bug
something isn't working
#documentation
lmprovements or additions to documentation
#duplicate
This issue or pull request already exists
#enhancement
New feature or request
#good first issue
Good for newcomers
#help wanted
Extra attention is needed
#invalid
This doesn't seem right
#question
Further information is requested
#wontfix
This will not be worked on
wiki 项目文档
自行添加m
环境保持
致谢
感谢武沛齐老师及路飞学城的无私分享,场景化,独特的教学方式使得学生学完印象深刻,感谢他们的开源精神。
附上哔哩哔哩Git教程视频链接
参考与引用
[powershell]:
[教程]:
[教程]:
[rebase教程]:
[俩种版本回退的方法]: