之前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
[准备工作1]
下载: https://git-scm.com/downloads
安装: 那么最简单的安装,就是无脑下一步.
卸载: 控制面板卸载之后,删除环境变量PATH中有关git字样的路径.
安装之后,win10系统下,修改配置文件 C:\Users\LQH.gitconfig 自己的用户名记得改一下
注意: 名字和邮箱改成自己的.(别用我的…) [alias]是git命令的别名,下面的资料都不会用到别名,放心~~
这样就不用在黑窗输入.
之前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
[准备工作1]
下载: https://git-scm.com/downloads
安装: 那么最简单的安装,就是无脑下一步.
卸载: 控制面板卸载之后,删除环境变量PATH中有关git字样的路径.
安装之后,win10系统下,修改配置文件 C:\Users\LQH\.gitconfig 自己的用户名记得改一下
注意: 名字和邮箱改成自己的.(别用我的...) [alias]是git命令的别名,下面的资料都不会用到别名,放心~~
这样就不用在黑窗输入.
如果你喜欢在黑窗输入用户名和邮箱,也是可以的…
新建一个文件夹,对着文件夹右键Git Bash Here,打开黑窗.
然后输入:
git config --global user.name "MyName" #设置git的用户名
git config --global user.email "xxxxxxxxx@qq.com" #设置git的邮箱
[准备工作2]
首先注册一个gitee码云账号,qq关联登陆也可以, (github就不说了…会的自然会搜,甚至还会爬墙)
第一次fork项目到自己的账号内,成为自己的仓库..然后要一直用这个仓库的地址.
第一次一定要在你码云fork项目上面,点这个强制刷新,不然你远程仓库同步失败….
如果你在修改过程中遇到不顺利的,那就重新点这个圈圈同步回去来源的仓库…..
[准备工作3]
这是一个学习的步骤……温馨提示: 黑窗的整行删除是ctrl+c,和cmd一样呢,嘿嘿..
克隆项目过来:
git clone https://gitee.com/JJbox/NFox.git #这种克隆是成功的,但是push的时候会提示你输入网站验证.(最好不要用...)
git clone git@gitee.com:JJbox/NFox.git #这种是失败的,因为提示要SHA256加密传输,设置SSH才能用,我们也必须去设置.(最好用这个)
然后弄SSH公钥私钥,在本机 C:\Users\LQH.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 也提供了一个.
使用.gitignore文件的说明:*.txt 忽略所有.txt结尾的文件,这样的话上传就不会被选中!
!lib.txt 但lib.txt除外
/temp 仅忽略项目根目录下的文件,不包括其它目录temp
build/ 忽略build/目录下的所有文件
doc/*.txt 会忽略doc/notes.txt但不包括doc/server/arch.txt
需要注意/的位置主要源码存放目录在src文件夹下,所以要建设一个scr文件夹
[处女作:个人的新仓库提交]
首先你新建了文件夹,然后放了代码文件,
然后在gitee,github之类的网站新建了一个仓库,
这个仓库叫远程仓库,如果工作模式下还有一个叫上游仓库,现在先不管上游仓库,想现在就知道的拉到最下面!
你想提交你的代码上去.
这个时候你会遇到你远程仓库分支和你的不同,所以我们首先要接触分支的概念,再是提交.
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 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语句不同,下面用来给人查错搜索用……)
然后是push提交到远程仓库,给自己设定一些场景先,首先你本地没有任何项目,你现在的项目是这样的,
而你远端有个仓库,这个仓库内自带一些东西
git init #初始化目录
git remote remove origin #移除原有远程仓库,可能没有而警告,第一次设置基本可以跳过不理这行
git remote add origin git@gitee.com:JJbox/NFox.git #设置拉入点(也就是远程仓库)
git add . #加入暂存区
git commit -m "aaaa" #提交到本地仓库d
git pull origin master #这里将会是埋坑的地方
到这里一切都相安无事.
然后要push(推出去)了,但是push会遇到先pull(拉取)的问题,pull又会遇到分支不相干的问题..
如此错误:
到这里一切都相安无事.
然后要push(推出去)了,但是push会遇到先pull(拉取)的问题,pull又会遇到分支不相干的问题..
如此错误:
$ git push
fatal: The current branch master has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin master
$ git push --set-upstream origin master
To gitee.com:JJbox/NFox.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'gitee.com:JJbox/NFox.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
你项目此时是这样的:
这个时候就需要用这种方法会出黑框,所以最好不用这样的方法(用我最上面提及的[处女作.执行拉取提交])
git pull origin master --allow-unrelated-histories #把两段不相干的 分支进行强行合并
这种问题一般发生在第一次连接本地和远程仓库,后续不会有这样的问题。
出现了这个黑框 Please enter a commit message to explain why this merge is necessary.
搜索了一番 https://www.jianshu.com/p/2dc3bddff5f7
请输入提交消息来解释为什么这种合并是必要的。
我不是第一次遇到这个问题,之前是直接解决,没想过为什么,但现在觉得只知其然不知其所以然其实是件很坑自己的事情。所以专门找文档看了下,总算明白了。记下来以防忘记。也希望能帮到有同样疑惑的小伙伴们。
1.按键盘字母 i 进入insert模式
2.修改最上面那行黄色合并信息,可以不修改,当然,不修改会显得自己很菜......
3.按键盘左上角"Esc"
4.输入":wq",注意是冒号+wq,按回车键即可
我实际的操作是: 按两下shitf+1,输入了感叹号,再删掉感叹号,输入wq,回车
项目此时是这样的:
再推送就好了.
git push --set-upstream origin master
这个时候你可能想问,如果不拉取再推送,会更新远程仓库吗?
答案是你会停留在这个错误上面,令你动弹不得…..
$ git push --set-upstream origin master
To gitee.com:JJbox/NFox.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'gitee.com:JJbox/NFox.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
[版本回退]
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 init #初始化(直接下载压缩包或者克隆就行忽略)
git clone git@gitee.com:JJbox/NFox.git #然后将项目clone克隆下来(如果直接下载压缩包就行忽略)
#把人家的替换过来你的文件夹内部,人家也会上传它的.git隐藏文件夹,这里面是有每次提交的信息,所以很重要,时间线在里面,你需要用它的.
#添加上游仓库,上游仓库的表示为upstream,远程仓库表示为origin;
#克隆了之后替换了文件,就在.git文件夹位置重启一次黑窗
git status #查看文件内容
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 checkout -b 本地winform版本 origin/winform版本 #依照远程仓库的分支创建本地分支,它可以继承分支跟踪(这里每个分支都要在本地创建一次...)
git add . #然后增删文件,此过程省略
git commit -m "提交内容" #提交到本地仓库
git pull upstream master #提交远程之前都从上游仓库拉取一下最新的代码,保证了与上游仓库的联动性.
#再将改动同步到自己的远程仓库中,处理完冲突之后....
git push
没有冲突的代码就提交给上游仓库,进去网站上面进行…
也可以在后台设置仓库管理员和开发者,这样他们就可以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 stash #备份当前的工作区的内容
git pull #拉取代码
git stash pop #释放备份内容
git status #检查冲突,再打开每个文件,利用vs内置的git比较冲突.
git add .
[与他人协商问题]
首先你要提一个issue,获取生成的一个编号
https://gitee.com/help/articles/4141#article-header0 这是帮助文档
然后 commit 的时候把这个编号写上,
这里还必须写引号,否则会切割括号作为标识符….