日志篇 原生git笔记
说明
之前vs上面用码云的笔记(写得很草.....锁了)
本着"如无必要,勿增实体"的理念,所以尽可能用简短的语句说明原理.
本篇我不用什么小乌龟.我也不用什么IDE集成,这样c#的人看java用IDE集成的git教程是折磨.
单纯一点:原生的git.
想快速知道协作的开发流程
推荐教程,第二个必看:
第一
第二
对于小乌龟感兴趣的,可以看这个教程
准备工作
安装与卸载
卸载: 控制面板卸载之后,删除环境变量PATH中有关git字样的路径.
下载: 国外下载...国内镜像
安装: 那么最简单的安装,就是无脑下一步.
修改配置
鼠标右键Git Bash Here
,在黑窗上面输入.
0x01 中文乱码
参考 git status中文乱码进行设置:
git config --global core.quotepath false
右键黑窗,选项->文本->本地Locale,设置为zh_CN,而旁边的字符集选框选为 UTF-8
英文显示则是: Options->Text->Locale 改为 zh_CN,Character set 改为 UTF-8
0x02 忽略所有的安全目录
git config --global --add safe.directory "*"
0x03 修改邮箱
git config --global user.name "MyName" #设置git的用户名
git config --global user.email "xxxxxxxxx@qq.com" #设置git的邮箱
0x04 快捷命令
上面的命令行要敲,否则直接替换配置文件并不会有效:运行输入.
找到.gitconfig
注意: 名字和邮箱改成自己的,[alias]是git命令的别名(快捷命令),下面的资料都不会用到别名.
[user]
name = xxx
email = xxx@qq.com
[gui]
encoding = utf-8
# 代码库统一使用utf-8
[i18n]
commitencoding = utf-8
# log编码
[svn]
pathnameencoding = utf-8
# 支持中文路径
[core]
quotepath = false
autocrlf = true
safecrlf = false
# status引用路径不再是八进制(反过来说就是允许显示中文了)
[safe]
directory = *
[credential]
helper = store
[alias]
xm = remote -v #远程项目地址
xmyc = remote remove origin #移除原有远程仓库
xmjia = remote add origin #设置远程仓库(设置过要先移除原有)# remote add origin git@gitee.com:xx/xx.git
# remote show origin #查看当前仓库基本信息
ad = add . #全部添加到缓冲区
cxAdd = restore --staged #撤销add 某个文件,文件内容不变
cxAddqb = reset #撤销add 全部文件
hy = restore #还原 旧文件,撤销Add之后文件内容变为旧的
hy2 = checkout -- #还原 没add之前撤销,文件内容变为旧的
schc = rm --cached -r #缓存中删除,不删除物理文件,删除文件夹(路径/文件),文件内容不变
cm = commit -m #提交信息
cmxg = commit --amend #修改cm信息注意是push前
cmi = commit --interactive -c HEAD --reset-author
pl = pull --rebase #防止仓库冲突,顺带变基
ps = push #推送到远程仓库
# lgd = log -p --full-diff #看提交记录:看到每个文件
lg = log --pretty=oneline #看提交记录:只看序号
relog = reflog #看回滚记录
hgsc = reset --hard HEAD^ #回滚上次,不是回滚到修改文件的,而是commit之前的
# rsh = reset HEAD~ #回滚上次
# rss = reset --soft
qw = reset --hard #前往/回滚
fc = fetch #从另一个存储库下载对象和引用
st = status #查看当前修改了什么文件
br = branch #分支
fz = branch -vv #查看本地和远程跟踪信息
fzcj = switch -c #分支创建并切换本地分支,git checkout -b "分支"
fzqh = switch #分支切换
fzqb = branch -a #查看本地和远程所有分支
fzyc = branch -r #查看远程分支
fzhb = merge #分支合并
fzsc = branch -d #分支删除
fzsc2 = push --delete origin #删除远程分支 git push --delete origin oldName
fzgm = branch -m #分支改名 oldName newName
#上传新命名的本地分支 git push origin newName
fzzz = branch --set-upstream-to #分支追踪 参数填分支名 git branch --set-upstream-to origin/newName
fzql = remote prune origin #分支清理,如果远程分支删除了本地还有,就需要清理
brv = branch --v #查看分支
bs = bisect
config = config
geturl = config --get remote.origin.url
cfg = config --global
cfga = config --global alias.
lsr = ls-remote --heads
ls = ls-files -c #查看暂存区所有文件
ftg = fetch --tags
i = --interactive
cp = cherry-pick
cpx = cherry-pick -x
bl = blame
gk = gitk
lt = ls-tree -r HEAD~ --name-only
ltng = ls-tree -r HEAD~ --name-only |grep
yc = stash #隐藏文件,建议变基前
sf = stash pop #隐藏重新释放出来
ycsc = stash drop stash@{0} #隐藏删除一个
ycql = stash clear #隐藏删除列表全部
ycwj = stash list #隐藏文件列表
fanzuo = revert #反做版本;已经提交的不要reset而是使用反做回滚,否则记录没了
fanzuocx = revert --abort #反做撤销,本次反做回滚行为
dif = diff HEAD^ #查看pull的文件,也可以去网站上看
diff = diff #查看文件修改内容(如果只是删除空行,这里不会显示的)
difff = diff --cached #查看包含删除空行
#子模块教程 https://zhuanlan.zhihu.com/p/404615843?utm_id=0
#0x01 克隆的时候子模块一起下载 https://blog.csdn.net/yanlaifan/article/details/110942035
clone = clone --recurse-submodules
# 0x02 如果忘记设置分支,去.gitmodules添加
# [submodule"SubmoduleTestRepo"]
# path = SubmoduleTestRepo
# url = https://github.com/xxx/xxx.git
# branch = master
#0x03 添加子模块
#注意,最后的相对路径有问题,需要你进入到想要的目录,然后在此目录生成`相对目录`
#你必须要在你想要文件夹aa下面生成bb: git zmk jing git@gitee.com:vv/vv.git bb
#子模块下载之后出现警告,说明 https://www.jianshu.com/p/450cd21b36a4
#warning: in the working copy of '.gitmodules', LF will be replaced by CRLF the next time Git touches it
#可以1 提交检出均不转换 git config --global core.autocrlf false
zmk = submodule add -b #(三个参数: -b是分支名,子模块的github地址,保存在本项目的相对路径);
#更新子模块的方式是:前去子模块仓库进行git pull,
#不要用 git submodule update --remote 否则就会有游离分支
#然后使用下面的,进行更新主项目内子模块版本
gx = submodule update
zmkxz = submodule update --init --recursive #子模块下载,切换分支的时候没有子模块,就这样下载
zmkst = submodule status #子模块仓库信息
#git config receive.denyCurrentBranch ignore #如果你想两个文件夹相互推送,那么需要设置,它会修改项目内.git/config
# git默认开启SSL验证 https://blog.csdn.net/u013985241/article/details/109779359
# SSL验证关闭 git config --global http.sslVerify false
#保存git的密码 git config --global credential.helper store
#去掉每次window 安全中心验证 git credential -manager uninstall
#允许提交包含混合换行符的文件*
##git config --global core.safecrlf false
#拒绝提交包含混合换行符的文件
##git config --global core.safecrlf true
#提交包含混合换行符的文件时给出警告
##git config --global core.safecrlf warn
#游离分支合并 https://blog.csdn.net/u011240877/article/details/76273335
#git branch -v 查看当前领先多少,可以看到游离分支和最近一次
#git branch temp 创建一个分支储存游离分支提交
#git checkout temp 切换到这个分支
#git checkout jing 切换到目标分支
#git merge temp 在当前分支合并temp的过来
私钥和公钥
注册账号
首先注册一个gitee码云账号,qq关联登陆也可以, (github就不说了...会的自然会搜,甚至还会爬墙)
需要注意一下,名字最好和git配置上面的一样,不然你若在网站上面直接修改了文件,那么你再拉取下来之后,你会看到时间线上面你有两个名字...
找到一个自己想要测试的仓库,点Fork,就会成为自己账号内的仓库,之后我们就用账号的地址.
记住Fork是为了pr给上游仓库.见本文 协作的部分
※我们把原仓库叫"上游仓库"把Fork到自己账号的叫"远程仓库".
如果你在学习过程中遇到不顺利的,那就重新点这个圈圈同步回上游仓库
修改ssh
打开黑窗,克隆项目过来:
git clone https://gitee.com/JJbox/NFox.git #这种克隆是成功的,但是push的时候会提示你输入网站验证.(最好不要用...)
git clone git@gitee.com:JJbox/NFox.git #这种是失败的,因为提示要SHA256加密传输,设置SSH才能用,我们也必须去设置.(最好用这个)
通过注释可知,需要弄SSH,也就是公钥和私钥,
公钥和私钥存放在: 运行输入.
找到 .ssh
第一次删掉路径下所有文件就好了,然后重新用命令新建:
ssh-keygen -t rsa #一直回车下去就好了
#如果clone的时候仍然提示输入指纹验证,用这里: https://blog.csdn.net/anran0526/article/details/105603622
此时路径下多了两个文件: 公钥: id_rsa.pub
, 私钥: id_rsa
在gitee的信息上面,把 id_rsa.pub
内的全部字符粘贴到公钥位置,这就可以了.
cat ~/.ssh/id_rsa.pub #查看秘钥
从0开始学习
翻译几个名词:
workspace: 工作区
index/Stage: 暂存区
Repository: 本地仓库
Remote: 远程仓库
工作流程
想象邮局的工作流程
add . #是将多个文件放入快递邮件内
commit #是快递邮件放仓库.
#可以进行多次打包.....
push #就是把仓库的多个快递邮件用车给运送出去.
平时我们写的代码都是在工作区,执行 add . 命令后就是提交到了暂存区,
再执行 commit 命令后就把代码提交到了本地仓库了,
最后再执行 push 命令把本地代码提交到远程仓库.
从一个空白文件夹开始吧: 对着文件夹用鼠标右键 Git Bash Here
输入:
git init #初始化一个空的git仓库,然后这个仓库内是时间线和压缩每次本地提交的文件.
多了一个隐藏文件夹
几个重要的命令:
git status #查看文件在暂存区和工作区的状态,就是多了或者更改过的文件就会识别出来,让你commit前看的git add "file.xx" #将修改的内容增加到暂存区
git reset "file.xx" #反add
git add . #把所有文件提交到暂存区
git commit -m "描述" #从暂存区提交到本地仓库 -m 是message提交信息git push #发送到远程仓库
忽略文件和目录
一般我们都喜欢 git add .
并不会去一个个文件添加,但是它把所有的文件添加这样太强大了,
所以需要用 .gitignore
文件 忽略掉一些不需要的文件和目录.
这个文件大家去github或者gitee创建工程时候,选择visual studio就可以了自动增加一个,
而 https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 也提供了一个vs项目的.
使用.gitignore文件的说明:
*.txt 忽略所有.txt结尾的文件,这样的话上传就不会被选中!
!lib.txt 但lib.txt除外
/temp 仅忽略项目根目录下的文件,不包括其它目录temp.
build/ 忽略build/目录下的所有文件
doc/*.txt 会忽略doc/notes.txt但不包括doc/server/arch.txt
需要注意/的位置
(此时的文件夹)
处女作1:个人的新仓库提交
正常的流程
我们一般采用的是先在网站上配置好工程先,
然后 git clone
下来,这样你就有一份网站提供的 .git
文件夹,不需要你 git init
而你只需要把代码拷贝进去,然后
git clone git@gitee.com:JJbox/jjbox.git #克隆项目
#放入文件........
git add .
git commit -m "描述"
git push
这样即可,不需要强制推送的!
非正常流程
首先你新建了文件夹,然后放了".gitignore文件"和代码文件,此时你想提交你的代码上去.
这个时候你会遇到你远程仓库分支和你的不同,所以我们首先要"接触分支的概念",再是提交.
git init #初始化目录#放入文件.......
git add . #加入所有文件到暂存区
git commit -m "第一次提交" #暂存区提交到会到本地仓库
#此时去网站上右上角有个+加号,新建一个仓库,拿到地址,再通过下面的语句设置:
#git remote add origin git@gitee.com:JJbox/jjbox.git #设置远程仓库
#(如果设置过,需要git remote remove origin #移除原有的远程仓库)
git pull #先拉取一次远程仓库(意思是下载网站上面的内容到本地)
#通常网站创建的时候会有一个默认的master分支,
#它的回显信息,描述拥有新的分支
# * [new branch] master -> origin/master
#以及问你
# If you wish to set tracking information for this branch you can do so with
#如果要设置此分支的跟踪信息,可以使用
# git branch --set-upstream-to=origin/<branch> master
#
#这个时候用git branch -a就可以查看所有分支
#
#既然它说要你建立一个跟踪你就要按它的做
git branch --set-upstream-to=origin/master #设置当前分支和远程仓库的master分支做关联
#此时因为两个分支的历史无关,所以要强行推送,这就成功了...
git push -f #之后就正常提交git push就可以了
仔细想想,每次新仓库都需要做"强制推送"这个动作,怎么也不对啊.
所以说这个流程是不对的!
这个流程只适用于: 单机版本管理过,然后再上传到网站上.
仓库地址设置
网站提供的.git
文件夹和用git init
生成出来的有什么不同呢?
主要是网站的会根据当前git远程仓库地址,帮你设置了以下语句:
git remote add origin git@gitee.com:JJbox/jjbox.git #设置远程仓库(如果设置过,需要移除原有的远程仓库)
git remote -v #查看项目远程地址
git remote show origin #查看当前仓库基本信息
git remote remove origin #移除原有远程仓库
学到这里,大家已经学会了上传和下载文件了!也就是git常用的80%了!
而剩下的20%并不是很好掌握,所以下面的操作更多是"需要就来搜索"用的.
(但是我还是建议你全部看一遍....先知道汽车能在地上跑,再去研究引擎几个冲程....)
项目规范参考
有.git
隐藏文件夹的位置,称为工程目录.
这个工程目录主要是放一些 文档参考/readme.md/.gitignore/.gitattributes/
开源说明等等,
而源码存放在src文件夹下.反正大家都是这么用的,比较清晰和整洁..
可参考微软的WPF工程毕竟大厂有规范.
这里有个问题,.sln解决方案放什么地方好,
因为我习惯在vs的控制台上面用git,
所以我喜欢把它放在.git同目录,这样能够保证我用git bash黑窗和vs控制台都是同一个目录开始.
分支操作
查看分支信息
新手在这里话先fork+克隆一个项目先.因为这里是细致地讲述分支,和上面有重复的地方噢!
git pull #先拉取,我强烈建议把所有的pull改为git pull --rebase顺带变基(所以有快捷命令),具体在团队开发上面会遇到很多自动合并情况,会生成一条提示..
git branch -a #查看本地和远程所有分支
git branch -r #查看远程分支
git branch -vv #查看本地仓库分支跟踪远程仓库分支信息
若此时出现分支无关联需要怎么做呢?
分两种情况:
新仓库: 创建并切换,然后推送到远程仓库,关联仓库.
克隆下来的仓库: 用一条语句循环拿取,再创建关联的分支.
看下面:
创建本地分支并推送到远程分支
git checkout -b "winform版本" #首先要创建并切换本地分支,如果不加参数-b就不切换,则用 git checkout "winform版本" 这样切换
git push origin "winform版本" #推送该分支到远程仓库
git pull origin "winform版本" #测试从远程获取分支这个时候本地的分支和远程的分支并不关联(也叫跟踪).....可以用 git branch -vv 看git branch --set-upstream-to=origin/winform版本 #设置当前分支跟踪的目标,不设置的话,git push会提示要求你输入的.....(git branch --unset-upstream master #取消跟踪)现在随便修改一下工程文件的内容,然后git commit,git push,之后就可以直接提交到远程的新分支中,而不会是master
克隆项目关联分支
如果直接克隆项目下来后,只有一个master分支,但是人家的项目通常有很多分支的.
可用 git branch -a
查看得知,
但是 git branch -vv
查看关联却发现只有一个master分支在关联.
0x01 直接切换分支
git checkout 分支名 #不带origin/
0x02 循环创建关联分支
进入到工程目录(有.git)的文件夹下,运行以下命令,意思是循环拿远程分支名称再本地新建一个关联的.
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
0x03 创建关联的分支
git checkout -b 本地winform版本 origin/winform版本 #创建本地分支,用的远程仓库的分支,它可以继承分支跟踪
删除分支
git checkout master #首先不能占用要删除的分支,切换分支到master
git push origin --delete "winform版本" #删除远程分支,如果github上面也不能在此分支上,如果报错去网页上面切换...
git branch -d "winform版本" #删除本地分支git remote prune origin #如果远程仓库你在网站上删除,而工作区也手贱删除,但是本地仓库没有删除,就用它清理remotes/origin/的分支
合并分支
#先提交当前dev分支
git add .
git commit -m '备注'
git push -u origin dev
git checkout master #切换到需要合并的分支
git pull --rebase origin master #如果是多人开发的话,需要把远程master上的代码pull,顺便变基
git merge dev #然后把dev分支的代码合并到master上; git merge --abort #撤销合并
git status #检查冲突
git push origin master #最后执行下面提交命令
已经提交到网站,如何删除文件
当你已经成功提交了之后又想排除文件,这个时候使用.gitignore文件修改并不会起作用,当然你也需要修改它让其他人也排除:
.gitignore文件 :
.vs/
packages/
#这里是后加的
mullabel/bin/
mullabel/obj/
移除已经add的,-r是递归,--r是删除文件
git rm --cached -r .idea/ #移除文件夹,不删除物理文件,仅将该文件从缓存中删除
git rm --cached "文件路径" #移除文件,不删除物理文件,仅将该文件从缓存中删除
git rm --f "文件路径" #不仅将该文件从缓存中删除,还会将物理文件删除(不会回收到垃圾桶)
移除暂存区,但是工作区不物理删除的文件夹:
#带-r参数去递归之后的目录
git rm -r --cached *.rar #移除所有rar文件
git rm -r --cached mullabel/bin/
git rm -r --cached mullabel/obj/
git rm -r --cached \正则验证 #带中文路径
git commit -m "删除bin和obj目录"
git push
删除和恢复工作区文件
#删除工作区文件首先要提交过
git add "a.txt"
git commit -m "提交a.txt测试"
git rm "a.txt"
#恢复:恢复分支的文件git checkout master -- "a.txt"
版本回退
git log #查看版本号,也可以去github网站上面看,会卡住,按Q退出!!
git log --pretty=oneline #加参数可以看起来简单一点
0x01 回滚版本
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法.
git reset --hard 515b5a #利用前六位版本HEAD码回滚
git push -f #此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以我们要强制推上去
备注: 只要提交过的话,依然可以通过 git reflog
找回的,git操作的每一个动作都有记录
0x02 反做
git revert
是用于"反做"某一个版本,以达到撤销该版本的修改的目的.
使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交;
测试: 新建了三个文本(叫 版本一.txt、版本二.txt、 版本三.txt),分别git add .和git commit -m三次
git revert -n 8b8962
此时发现 "版本一.txt" 被删除了,但是保留了后面版本的文件.
可能会出现两个版本的文件冲突,需要手动修改冲突的文件,而且要git add文件名.
0x03 查看历史版本记录
如何放弃所有本地修改 说实话并不建议这样的操作,你大可放一个分支上面,然后切换回来此分支
#回到过去git checkout . #本地所有的修改,没有提交的,都返回到原来的状态
git stash #当本地文件修改之后,而进行了git pull提示不执行时候,此方法可以隐藏没有提交的修改(还原上次提交时候),
#用git stash pop 重新释放出来.
#用git stash list 查看现有的暂存文件
#用git stash drop stash@{0} 扔掉暂存的参看: https://www.cnblogs.com/tocy/p/git-stash-reference.html
git reset --hard HASH #返回到某个节点,不保留修改.
git reset --soft HASH #返回到某个节点,保留修改.
git log #可以查看 git commit 的历史记录及其 HASH ID,用q退出
git clean -f #删除当前目录下所有没有track过的文件. 它不会删除 .gitignore 文件里指定的文件夹和文件, 不管这些文件有没有被track过
#回到未来...
git reflog #看未来的版本号
git reset --hard HASH
处女作2:协作开发的流程
建议自行搜索gitflow
这个词语,然后看看视频,了解一下分支在项目使用中的步骤.
非共用仓库
这篇文章写了很多关键性的操作 https://www.cnblogs.com/javaIOException/p/11867988.html
首先是找到上游仓库,将它fork为你的远程仓库,在磁盘你喜欢的目录
没有冲突的代码就提交给上游仓库,进去网站上面进行...
共用仓库
在后台设置仓库管理员和开发者,这样大家的仓库信息都是一致的,
没有上面那么复杂的操作.
仓库的分支技巧
分开.git在不同的文件夹,然后使用不同的分支:
这样的两个文件夹,然后它们对应这相同的.git的不同分支
这样提交可以不受干扰,不用切换来切换去的.嘻嘻.
标签使用
参考
master,一般放的都是你要发布的代码,dev分支开发到一定程度,计划的功能和要修复的bug已经完成,那么就合并到master分支,
然后建个标签就是git tag
就可以做一个发行版,比如现在是1.0
这个时候如果大型的公司开发可能会在master上拉一个fix分支来修bug.
git tag #查看所有标签
git tag -l 'v1.0.*' #查看某个版本系列的tag
git tag -a v1.0.0 -m "内容:v1.0.0" #创建标签
git show v0.0.6 #查看标签的详情,可以看到你commit的内容
git push origin v1.0.0 #推送标签
git tag -d v1.0.0 #删除本地标签
git push origin :refs/tags/v1.0.0 #删除远程的标签
团队拉取和提交方式
0x01: 已经你当前的文件已经修改,但是想立马拉取
git stash #隐藏自己的修改
git pull --rebase #拉取代码,顺便变基
git stash pop #释放备份内容
git status #检查冲突,再打开每个文件,利用vs内置的git比较冲突.git add .
0x02: 如果你不正确的拉取了 =>此时非常多的冲突=>直接撤销pull=> git撤销pull
git reflog
git reset --hard HEAD@{n}
比较完之后保存文件,然后再检查下一个....ok就提交吧
另见本文的冲突总结.
协商问题
如果你看过微软的工程,那么会发现他们提交的"描述"是带一个编号的,点击这个编号还可以直接去到一个issue(问题)上.
https://gitee.com/help/articles/4141#article-header0 这是帮助文档
首先你要提一个issue(问题),获取生成的一个编号:
然后 commit 的时候把这个编号写上,这里还必须写引号,否则会切割括号作为标识符.
因为gitee和github的策略不一样.
gitee大小
20210227这一天,想把测试文件像微软文件结构放到gitee上面,结果报错了...
一查,github没有大小限制...gitee只有可怜的500M,总仓库容量为5G..我测试文件都放不进去...
删除方法
1. 查看哪个文件超过了100M
有可能错误直接爆出是哪个文件,也有可能只是爆出了该文件的代号。如果是代号需要先使用该语句查询具体是哪个文件
git rev-list --objects --all | grep xxx
2. 从缓存中删除
git filter-branch --tree-filter 'rm -f xxx' --tag-name-filter cat -- --all
这里的XXX替换成报错文件的具体路径(例如我这里的xxx是target/travel-0.0.1-SNAPSHOT.jar)
3.再次进行push操作
git push origin master
git打开对应的文件
ctrl+鼠标 对着git控制台可以打开对应的文件.
问题区
0x01 Another git process seems to be running in this repository
git add .太久,然后强行关掉会导致此问题:
Another git process seems to be running in this repository, e.g.
an editor opened by 'git commit'. Please make sure all processes
are terminated then try again. If it still fails, a git process
may have crashed in this repository earlier:
remove the file manually to continue
方法一:找到.git/index.lock文件,直接删除即可;
如果在linux上的话,执行rm删除命令:
rm -f .git/index.lock
方法二:执行git命令
git clean -f .git/index.lock
0x02 git pull时产生'Merge branch 'master' of
复现:
首先保证当前工程和远程仓库同版本,然后将工程文件夹(含有.git的)复制粘贴一次.
原本工程: 修改了代码,并在本地仓库 commit 一次,但并未 push 到远端仓库.
副本工程: 同样 commit 了一次并 push 到远端仓库.
那么这个时候,回到原工程,再 push 自己的代码就会发生窗口提示:
原因:
说明了当前仓库的版本号比较旧,但是当时也有改动了,就需要进行一次变基操作(rebase)
远程仓库比较新,pull下来之后会提示. 参考
解决方法:
先回车,保存,退出不了的时候输入q,然后看看是否已经存在一次提交,你可以选择版本回退,再拉取.
Git Bash:
git pull --rebase #如果拉取不产生冲突,会直接rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并.
GUI:
例如 TortoiseGit,可以先 fetch,再手动 rebase 就可以了.
或者直接填写参考
请输入提交消息来解释为什么这种合并是必要的.
1.按键盘字母 i 进入insert模式
2.修改最上面那行黄色合并信息,可以不修改,当然,不修改会显得自己很菜.
3.按键盘左上角"Esc"
4.输入":wq",注意是冒号+wq,按回车键即可
0x03 总结git冲突合并
昨天做了一个git测试,如果我已经git commit,线上的分支拉取之后存在冲突,那么我需要手动处理合并异常.
明知道会出现这样的情况,三种处理方式:
0x01:如上面题目操作一样...拉取之前,照常依照这个分支开发并commit,然后拉取,处理冲突.
0x02:拉取之前,本地弄到一个新分支开发并commit,然后拉取,再合并分支时候才遇到冲突,并处理掉.
0x03:从不commit,而是stash,然后拉取之后再释放出来.
0x03最简单,一不做二不休直接覆盖了事.(有时候就没有那么简单)
由于我的git pull --rebase
代替了git pull
,所以0x01还会遇到变基异常(这是和0x02的不同),处理完冲突之后需要再退出变基(退出方式命令行会提示)才能够推送...
0x01和0x02当冲突太多的时候,难以阅读(git相似度检查导致),
然后我就选择回滚pull前
版本,拷贝冲突区代码和线上代码出来,然后回滚pull后
用文件对比工具处理.
也可以直接利用vs的冲突检查看前后两份代码.
为了避免主干上面处理冲突,所以fork pr模式是不断让提交者返工来处理冲突.真是妙啊.
看完了跳转回去
子模块
随着工程越来越大,那么就需要分github工程,分工程之后,在本工程下面用子模块载入其他工程.
使用子模块很重要的一个原因是相对路径都在同一个项目内,可以把项目移动来移动去的,而且上传到github网站是不会连带它们的,只会有个超链接文件夹.
子模块创建
git submodule add -b #(参数1-b是子模块分支名,参数2子模块的github地址,参数3文件夹名)
注意,参数3需要你进入到想要的目录(git bash),然后参数3会生成文件夹(不要是路径)
文件夹assets下面生成文件夹projectname:
git submodule add -b fenzhiming git@gitee.com:xxxx/projectname.git projectname
这个文件夹projectname不能有个\否则有可能出错(所以说不要是路径)
子模块下载之后出现警告:
warning: in the working copy of '.gitmodules', LF will be replaced by CRLF the next time Git touches it
设置提交检出均不转换,更详细的说明
git config --global core.autocrlf false
子模块更新
直接去子模块文件夹上面使用git pull
然后回主仓库使用git submodule update
来更新主工程对他的引用
不要用git submodule update --remote
否则就会有怪怪的分支名
子模块删除
删除指定子模块生成的东西,打开并找到对应的文本
.git同目录的文件:.gitmodules
.git文件夹内:
- config
- .git\modules #文件夹内,找一下或者搜索指定子模块名称的.
子模块代码修改和提交
子模块是和主仓库分开管理的,它本身就是一个仓库,你有权限的话可以push的.
直接去子模块仓库内进行add,commit,push就好了
vs内的git
vs内嵌了git,但是没有右键?配置也要自己去找找?
vs2022 x64版本位置:
C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer\Git\mingw64\bin\git.exe
vs2019 x86版本位置:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\IDE\CommonExtension\Microsoft\TeamFoundation\Team Exlorer\Git\mingw2\bin\git.exe
(完)