之前vs上面用码云的笔记(写得很草.....)
本着"如无必要,勿增实体"的理念,可视化比原生的git的流程化学习麻烦,所以尽可能用简短的语句说明原理.
本篇我不用什么小乌龟.我也不用什么IDE集成,这样c#的人看java用IDE集成的git教程是折磨.单纯一点:原生的git.
如果你想快速知道<和他人协作的开发流程>可以直接拉到最下面看!
本篇文章的着色:
黑色: git的命令
焦橙色: "所有引号的内容均是用户填写的,git可以不写引号,但是为了区分"
海绿色: origin master upstream 填写的分支,也是用户来决定的
灰色: #注释说明
推荐两个教程,第二个必看:
https://www.bilibili.com/video/BV1FE411P7B3
https://www.bilibili.com/video/BV1BE411g7SV
对于小乌龟感兴趣的,可以看这个教程:
https://www.bilibili.com/video/BV1fK4y1b7XL
准备工作
安装与卸载
下载: https://git-scm.com/downloads
安装: 那么最简单的安装,就是无脑下一步.
卸载: 控制面板卸载之后,删除环境变量PATH中有关git字样的路径.
修改配置
由于git支持汉化,可以参考[git status 显示中文和解决中文乱码]进行设置,
我已经提供了一个 .gitconfig 文件,(若缺失信息,请依照原文设置)
win10系统下,修改配置文件 C:UsersLQH.gitconfig 自己的用户名记得改一下.
注意: 名字和邮箱改成自己的.(别用我的...) [alias]是git命令的别名,下面的资料都不会用到别名,放心~

[user] name = liuqihong email = 540762622@qq.com [alias] ad = add . cm = commit -m lg = log rlg = reflog co = checkout cob = checkout -b cod = checkout develop com = checkout master fc = fetch st = status pl = pull ps = push cmd = commit --amend staust = 'gitst' cf = config ft = fetch fh = fetch br = branch brv = branch --v geturl = config --get remote.origin.url bs = bisect cfg = config --global cfga = config --global alias. ps = push lsr = ls-remote --heads udc = reset HEAD~ ftg = fetch --tags am = commit -amend rsh = reset HEAD~ cmi = commit --interactive -c HEAD --reset-author i = --interactive rss = reset --soft rmc = rm --cached cp = cherry-pick cpx = cherry-pick -x bl = blame gk = gitk ltn = ls-tree -r HEAD~ --name-only lt = ls-tree -r HEAD~ --name-only ltng = ls-tree -r HEAD~ --name-only |grep lgd = log -p --full-diff [gui] encoding = utf-8 # 代码库统一使用utf-8 [i18n] commitencoding = utf-8 # log编码 [svn] pathnameencoding = utf-8 # 支持中文路径 [core] autocrlf = false quotepath = false # status引用路径不再是八进制(反过来说就是允许显示中文了)
修改邮箱
如果你喜欢在黑窗输入用户名和邮箱,也是可以的...
新建一个文件夹,对着文件夹右键Git Bash Here,打开黑窗.
然后输入:
git config --global user.name "MyName" #设置git的用户名 git config --global user.email "xxxxxxxxx@qq.com" #设置git的邮箱
注册账号
首先注册一个gitee码云账号,qq关联登陆也可以, (github就不说了...会的自然会搜,甚至还会爬墙)
需要注意一下,名字最好和git配置上面的一样,不然你若在网站上面直接修改了文件,那么你再拉取下来之后,你会看到时间线上面你有两个名字...
找到一个自己想要测试的仓库,点Fork,就会成为自己账号内的仓库,之后我们就用账号的地址.
※我们把原仓库叫"上游仓库"把Fork到自己账号的叫"远程仓库".
点这个强制刷新,不然你远程仓库同步失败.
如果你在学习过程中遇到不顺利的,那就重新点这个圈圈同步回上游仓库
下载项目和公钥
打开黑窗,克隆项目过来:
git clone https://gitee.com/JJbox/NFox.git #这种克隆是成功的,但是push的时候会提示你输入网站验证.(最好不要用...) git clone git@gitee.com:JJbox/NFox.git #这种是失败的,因为提示要SHA256加密传输,设置SSH才能用,我们也必须去设置.(最好用这个)
然后弄SSH公钥私钥,在本机 C:UsersLQH.ssh 删掉多余的文件,第一次就删掉全部好了.
ssh-keygen -t rsa #一直回车下去就好了
此时新建了两个文件,
公钥:id_rsa.pub
私钥:id_rsa
在码云注册之后,在自己的信息上面找SSH公钥,把 id_rsa.pub 内的全部字符粘贴到公钥位置,这就可以了,
cat ~/.ssh/id_rsa.pub # 查看秘钥
从0开始学习
几个名词翻译:
workspace: 工作区
index/Stage: 暂存区
Repository: 本地仓库
Remote: 远程仓库
平时我们写的代码都是在工作区,执行 add . 命令后就是提交到了暂存区,
再执行 commit 命令后就把代码提交到了版本库了,最后再执行 push 命令把本地代码提交到远程版本库..
现在忘掉刚刚的克隆,来一个空白文件夹开始吧..
在黑窗输入:
git init #初始化一个空的git仓库
多了一个隐藏文件夹
这里还有几个重要的命令:
git status #查看文件在暂存区和工作区的状态,就是多了文件就会识别出来,让你add前看看的...
git add "file.xx" #将修改的内容增加到暂存区 git reset "file.xx" #反add git add . #把所有文件提交到暂存区 git commit -m "描述" #从暂存区提交到本地仓库 -m 是message提交信息
一般我们都喜欢 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
需要注意/的位置
主要源码存放目录在src文件夹下,所以要建设一个scr文件夹
处女作:个人的新仓库提交
非正常流程
首先你新建了文件夹,然后放了代码文件,你想提交你的代码上去.
这个时候你会遇到你远程仓库分支和你的不同,
所以我们首先要接触分支的概念,
再是提交.
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 clone下来,这样你就有一份网站提供的 .git文件夹,不需要你 git init
而你只需要把代码拷贝进去,
然后git add .
git commit -m "描述"
git push
这样即可,不需要强制推送的!
分支操作
查看分支信息
git pull #先拉取 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)的文件夹下,运行以下命令,意思是循环拿远程分支名称再本地新建一个关联的.
git branch -r | grep -v '->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
拉取指定远程分支(废弃,通过"克隆项目跟踪分支"可以解决)
git init #初始化目录
git remote add origin ssh://liuqihong@10.244.72.140:29418/解决方案_mullabel.git #先远程仓库建立连接
git fetch origin winform版本 #再将远程分支拉到本地
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 origin master #如果是多人开发的话 需要把远程master上的代码pull下来 git merge dev #然后把dev分支的代码合并到master上 git status #检查冲突 git push origin master #最后执行下面提交命令
已经提交到网站,如何删除文件
当你已经成功提交了之后又想排除文件,这个时候使用.gitignore文件修改并不会起作用,当然你也需要修改它让其他人也排除:
例如 .gitignore文件 :
.vs/ packages/ #这里是后加的 mullabel/bin/ mullabel/obj/
然后你还需要使用git移除暂存区,但是工作区不移除的文件夹:
#带参数去递归之后的目录
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 pull时产生'Merge branch 'master' of...问题
复现:
首先保证当前工程和远程仓库同版本,然后将.git文件夹的工程复制粘贴一次:
原本工程: 修改了代码,并在本地仓库 commit 一次,但并未 push 到远端仓库.
副本工程: 同样 commit 了一次并 push 到远端仓库.
那么这个时候,回到原工程,再 push 自己的代码就会发生窗口提示:
说明了当前仓库的版本号比较旧,但是当时也有改动了,就需要进行一次变基操作(rebase)
原因:
远程仓库比较新,pull下来之后会提示. https://www.cnblogs.com/Sinte-Beuve/p/9195018.html
解决方法:
Git Bash:
git pull --rebase #如果拉取不产生冲突,会直接rebase,不会产生分支合并操作,如果有冲突则需要手动 fix 后,自行合并.
GUI:
例如 TortoiseGit,可以先 fetch,再手动 rebase 就可以了.
或者直接填写:
请输入提交消息来解释为什么这种合并是必要的. 1.按键盘字母 i 进入insert模式 2.修改最上面那行黄色合并信息,可以不修改,当然,不修改会显得自己很菜. 3.按键盘左上角"Esc" 4.输入":wq",注意是冒号+wq,按回车键即可
参考自: https://www.jianshu.com/p/2dc3bddff5f7
版本回退
https://blog.csdn.net/yxlshk/article/details/79944535
git log #查看版本号,也可以去github网站上面看,会卡住,按Q退出!!
git log --pretty=oneline #加参数可以看起来简单一点
方法一:
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法.
git reset --hard 515b5a #利用前六位版本HEAD码回滚
git push -f #此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧,所以我们要强制推上去
备注:这里有点误区,其实哪怕是强硬修改,只要提交过的话,依然可以通过 git reflog 找回的,git操作的每一个动作都有记录
方法二:
git revert是用于"反做"某一个版本,以达到撤销该版本的修改的目的.
使用“git revert -n 版本号”反做,并使用“git commit -m 版本名”提交;
测试: 新建了三个文本(叫 版本一.txt、版本二.txt、 版本三.txt),分别git add .和git commit -m三次
git revert -n 8b8962
此时发现 "版本一.txt" 被删除了,但是保留了后面版本的文件.
可能会出现两个版本的文件冲突,需要手动修改冲突的文件,而且要git add文件名
git add .
git commit -m "revert add text.txt" #提交 git push #推送
查看历史版本记录
Git 如何放弃所有本地修改(摘录)
#回到过去
git checkout . #本地所有的修改,没有提交的,都返回到原来的状态 git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复 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
远程仓库处理
查找原有
git remote -v #查看项目远程地址
git remote show origin #查看当前仓库基本信息
移除原有
git remote remove origin #移除原有远程仓库
处女作2:协作开发的流程
非共用仓库
这篇文章写了很多关键性的操作 https://www.cnblogs.com/javaIOException/p/11867988.html
首先是找到上游仓库,将它fork为你的远程仓库,
在电脑桌面,右键--Git Bash Here:
git clone git@gitee.com:JJbox/NFox.git #将项目clone克隆下来. #.git隐藏文件夹,这里面是有每次提交的信息,所以很重要,时间线在里面. #添加上游仓库,上游仓库的表示为upstream,远程仓库表示为origin. git remote -v #查看已有的origin远程仓库 git remote remove origin #移除原有的远程仓库 git remote add origin git@gitee.com:JJbox/NFox.git #设置远程仓库,你自己fork的 git remote add upstream git@gitee.com:vicwjb/NFox.git #设置上游仓库,被fork的 git pull #拉取所有的分支下来 git branch -a #查看所有分支 git branch -vv #查看所有分支的追踪
#若本地分支没有追踪到远程分支,那么需要如下:
git branch -r | grep -v '->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
#再检查一下分支跟踪
git add . #然后增删文件,此过程省略
git commit -m "提交内容" #提交到本地仓库
git pull upstream master #提交远程之前都从上游仓库拉取一下最新的代码,保证了与上游仓库的联动性.
#再将改动同步到自己的远程仓库中,处理完冲突之后....
git push
没有冲突的代码就提交给上游仓库,进去网站上面进行...
共用仓库(推荐)
在后台设置仓库管理员和开发者,这样大家的仓库信息都是一致的,
没有上面那么复杂的操作.
仓库的分支意义
标签使用: https://blog.csdn.net/jdsjlzx/article/details/98654951
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 #删除远程的标签
比较冲突
当前已经有文件修改,但是没有git add和git commit,
那么此时你拉取了代码,是会被git阻止的,所以你需要临时备份.
git stash #备份当前的工作区的内容
git pull #拉取代码
git stash pop #释放备份内容
git status #检查冲突,再打开每个文件,利用vs内置的git比较冲突.
git add .
比较完之后保存文件,然后再检查下一个....ok就提交吧
协商问题
如果你看过微软的工程,那么会发现他们提交的"描述"是带一个编号的,点击这个编号还可以直接去到一个issue(问题)上.
https://gitee.com/help/articles/4141#article-header0 这是帮助文档
首先你要提一个issue(问题),获取生成的一个编号:
然后 commit 的时候把这个编号写上,这里还必须写引号,否则会切割括号作为标识符....
这是彩蛋(因为gitee和github的策略不一样....)
(完)