之前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命令的别名,下面的资料都不会用到别名,放心~~
这样就不用在黑窗输入.

  1. 之前vs上面用码云的笔记(写得很草.....)
  2. 本着"如无必要,切勿增知识"的理念,可视化比原生的git的流程化学习麻烦,所以尽可能用简短的语句说明原理.
  3. 本篇我不用什么小乌龟.我也不用什么IDE集成,这样c#的人看java用IDE集成的git教程是折磨.单纯一点:原生的git.
  4. 如果你想快速知道<和他人协作的开发流程>可以直接拉到最下面看!
  5. 本篇文章的着色:
  6. 黑色: git的命令
  7. 焦橙色: "所有引号的内容均是用户填写的,git可以不写引号,但是为了区分"
  8. 海绿色: origin master upstream 填写的分支,也是用户来决定的
  9. 灰色: #注释说明
  10. 推荐两个教程,第二个必看:
  11. https://www.bilibili.com/video/BV1FE411P7B3
  12. https://www.bilibili.com/video/BV1BE411g7SV
  13. 对于小乌龟感兴趣的,可以看这个教程:
  14. https://www.bilibili.com/video/BV1fK4y1b7XL
  15. [准备工作1]
  16. 下载: https://git-scm.com/downloads
  17. 安装: 那么最简单的安装,就是无脑下一步.
  18. 卸载: 控制面板卸载之后,删除环境变量PATH中有关git字样的路径.
  19. 安装之后,win10系统下,修改配置文件 C:\Users\LQH\.gitconfig 自己的用户名记得改一下
  20. 注意: 名字和邮箱改成自己的.(别用我的...) [alias]是git命令的别名,下面的资料都不会用到别名,放心~~
  21. 这样就不用在黑窗输入.

如果你喜欢在黑窗输入用户名和邮箱,也是可以的…
新建一个文件夹,对着文件夹右键Git Bash Here,打开黑窗.
原生git笔记 - 图1

然后输入:

  1. git config --global user.name "MyName" #设置git的用户名
  2. git config --global user.email "xxxxxxxxx@qq.com" #设置git的邮箱

[准备工作2]

首先注册一个gitee码云账号,qq关联登陆也可以, (github就不说了…会的自然会搜,甚至还会爬墙)
第一次fork项目到自己的账号内,成为自己的仓库..然后要一直用这个仓库的地址.
原生git笔记 - 图2
第一次一定要在你码云fork项目上面,点这个强制刷新,不然你远程仓库同步失败….
如果你在修改过程中遇到不顺利的,那就重新点这个圈圈同步回去来源的仓库…..
原生git笔记 - 图3

[准备工作3]

这是一个学习的步骤……温馨提示: 黑窗的整行删除是ctrl+c,和cmd一样呢,嘿嘿..

克隆项目过来:

  1. git clone https://gitee.com/JJbox/NFox.git #这种克隆是成功的,但是push的时候会提示你输入网站验证.(最好不要用...)
  2. git clone git@gitee.com:JJbox/NFox.git #这种是失败的,因为提示要SHA256加密传输,设置SSH才能用,我们也必须去设置.(最好用这个)

然后弄SSH公钥私钥,在本机 C:\Users\LQH.ssh 删掉多余的文件,第一次就删掉全部好了.

  1. ssh-keygen -t rsa #一直回车下去就好了

此时新建了两个文件,
公钥:id_rsa.pub
私钥:id_rsa
在码云注册之后,在自己的信息上面找SSH公钥,把 id_rsa.pub 内的全部字符粘贴到公钥位置,这就可以了,

  1. cat ~/.ssh/id_rsa.pub # 查看秘钥

原生git笔记 - 图4

这个时候好像才真正的完成了准备工作………………………………………………………………………………

[从0开始学习]

几个名词解释:
workspace: 工作区
index/Stage: 暂存区
Repository: 本地仓库
Remote: 远程仓库

平时我们写的代码都是在工作区,
执行add.命令后就是提交到了暂存区,
再执行commit命令后就把代码提交到了版本库了,最后再执行push命令把本地代码提交到远程版本库..

现在忘掉刚刚的克隆,来一个空白文件夹开始吧..
在黑窗输入:

  1. git init #初始化一个空的git仓库

原生git笔记 - 图5多了一个隐藏文件夹

这里还有几个重要的命令:

  1. git status #查看文件在暂存区和工作区的状态,就是多了文件就会识别出来,让你add前看看的...
  2. git add "file.xx" #将修改的内容增加到暂存区
  3. git reset "file.xx" #反add
  4. git add . #把所有文件提交到暂存区
  5. git commit -m "描述" #从暂存区提交到本地仓库 -m 是message提交信息

一般我们都喜欢 git add . 但是它把所有的文件添加这样太强大了,
所以需要用 .gitignore文件 忽略掉一些,
关于这个文件大家去github或者gitee创建工程时候选择visual studio就可以了自动增加一个,
https://github.com/github/gitignore/blob/master/VisualStudio.gitignore 也提供了一个.

  1. 使用.gitignore文件的说明:*.txt 忽略所有.txt结尾的文件,这样的话上传就不会被选中!
  2. !lib.txt lib.txt除外
  3. /temp 仅忽略项目根目录下的文件,不包括其它目录temp
  4. build/ 忽略build/目录下的所有文件
  5. doc/*.txt 会忽略doc/notes.txt但不包括doc/server/arch.txt
  6. 需要注意/的位置主要源码存放目录在src文件夹下,所以要建设一个scr文件夹

原生git笔记 - 图6

[处女作:个人的新仓库提交]

首先你新建了文件夹,然后放了代码文件,
然后在gitee,github之类的网站新建了一个仓库,
这个仓库叫远程仓库,如果工作模式下还有一个叫上游仓库,现在先不管上游仓库,想现在就知道的拉到最下面!
你想提交你的代码上去.
这个时候你会遇到你远程仓库分支和你的不同,所以我们首先要接触分支的概念,再是提交.

  1. git init #初始化目录
  2. git add . #加入所有文件到暂存区
  3. git commit -m "第一次提交" #暂存区提交到会到本地仓库
  4. git remote add origin git@gitee.com:JJbox/jjbox.git #设置远程仓库
  5. (如果设置过,需要git remote remove origin #移除原有的远程仓库)
  6. git pull #先拉取一次远程仓库,获取远程仓库的分支 (意思是下载网站上面的仓库分支到本地,只有下载了才能比较)
  7. 通常网站创建的时候会有一个默认的master分支,
  8. 它的回显信息,描述拥有新的分支
  9. * [new branch] master -> origin/master
  10. 以及问你
  11. If you wish to set tracking information for this branch you can do so with
  12. 如果要设置此分支的跟踪信息,可以使用
  13. git branch --set-upstream-to=origin/<branch> master
  14. 这个时候用git branch -a就可以查看所有分支
  15. 既然它说要你建立一个跟踪你就要按它的做
  16. git branch --set-upstream-to=origin/master #设置当前分支和远程仓库的master分支做关联
  17. 此时因为两个分支的历史无关,所以要强行推送,这就成功了...
  18. git push -f之后就正常提交git push就可以了

[分支操作]

  1. git pull #先拉取
  2. git branch -a #查看本地和远程所有分支
  3. git branch -r #查看远程分支
  4. git branch -vv #查看本地仓库分支跟踪远程仓库分支信息

创建本地分支,创建远程分支

  1. git checkout -b "winform版本" #首先要创建并切换本地分支,不加参数-b就不切换,需要用 git checkout "winform版本" 这样切换
  2. git push origin "winform版本" #推送该分支到远程仓库
  3. git pull origin "winform版本" #测试从远程获取分支这个时候本地的分支和远程的分支并不关联(也叫跟踪).....可以用 git branch -vv 看
  4. git branch --set-upstream-to=origin/winform版本 #设置当前分支跟踪的目标,不设置的话,git push会提示要求你输入的.....
  5. (git branch --unset-upstream master #取消跟踪)
  6. 现在随便修改一下工程文件的内容,然后git commit,git push,之后就可以直接提交到远程的新分支中,而不会是master

原生git笔记 - 图7

[新建克隆项目的所有分支]

直接克隆的项目下来后,只有一个master分支,但是人家的项目通常有很多分支的,
可以用上面的git branch -a查看,
进入到项目文件下(有.git)的文件夹下,运行以下命令,意思是循环拿远程分支名称再本地新建一个关联的.

  1. git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

拉取指定远程分支

  1. git init #初始化目录
  2. git remote add origin ssh://liuqihong@10.244.72.140:29418/解决方案_mullabel.git #先远程仓库建立连接
  3. git fetch origin winform版本 #再将远程分支拉到本地
  4. git checkout -b 本地winform版本 origin/winform版本 #创建本地分支,用的远程仓库的分支,因为它可以继承分支跟踪,推荐使用!

[删除分支]

  1. git checkout master #首先不能占用本地分支,切换分支到master
  2. git push origin --delete "winform版本" #删除远程分支,如果github上面也不能在此分支上,如果报错去网页上面切换...
  3. git branch -d "winform版本" #删除本地分支
  4. git remote prune origin #如果远程仓库手动删除,而工作区删除,但是本地仓库没有删除,就用它清理remotes/origin/的分支

[合并分支]

  1. #先提交当前dev分支
  2. git add .
  3. git commit -m '备注'
  4. git push -u origin dev
  5. git checkout master #切换到需要合并的分支
  6. git pull origin master #如果是多人开发的话 需要把远程master上的代码pull下来
  7. git merge dev #然后把dev分支的代码合并到master上
  8. git status #检查冲突
  9. git push origin master #最后执行下面提交命令

[已经提交到网站,如何删除文件]

当你已经成功提交了之后又想排除文件,这个时候使用.gitignore文件修改并不会起作用,当然你也需要修改它让其他人也排除:
例如 .gitignore文件 :

  1. .vs/
  2. packages/
  3. #这里是后加的
  4. mullabel/bin/
  5. mullabel/obj/

然后你还需要使用git移除暂存区,但是工作区不移除的文件夹:

  1. #带参数去递归之后的目录git rm -r --cached *.rar #移除所有rar文件
  2. git rm -r --cached mullabel/bin/
  3. git rm -r --cached mullabel/obj/git rm -r --cached \正则验证 #带中文路径
  4. git commit -m "删除bin和obj目录"
  5. git push

[删除和恢复工作区文件]

  1. #删除工作区文件首先要提交过
  2. git add "a.txt"
  3. git commit -m "提交a.txt测试"
  4. git rm "a.txt"
  5. #恢复:恢复分支的文件git checkout master -- "a.txt"

提交到远程仓库,请看上面[处女作.执行拉取提交]

(由于本文撰写时间不同,补充了一些资料,之前没有git语句不同,下面用来给人查错搜索用……)
然后是push提交到远程仓库,给自己设定一些场景先,首先你本地没有任何项目,你现在的项目是这样的,
而你远端有个仓库,这个仓库内自带一些东西
原生git笔记 - 图8

  1. git init #初始化目录
  2. git remote remove origin #移除原有远程仓库,可能没有而警告,第一次设置基本可以跳过不理这行
  3. git remote add origin git@gitee.com:JJbox/NFox.git #设置拉入点(也就是远程仓库)
  4. git add . #加入暂存区
  5. git commit -m "aaaa" #提交到本地仓库d
  6. git pull origin master #这里将会是埋坑的地方

到这里一切都相安无事.
然后要push(推出去)了,但是push会遇到先pull(拉取)的问题,pull又会遇到分支不相干的问题..
如此错误:
到这里一切都相安无事.
然后要push(推出去)了,但是push会遇到先pull(拉取)的问题,pull又会遇到分支不相干的问题..
如此错误:

  1. $ git push
  2. fatal: The current branch master has no upstream branch.
  3. To push the current branch and set the remote as upstream, use
  4. git push --set-upstream origin master
  1. $ git push --set-upstream origin master
  2. To gitee.com:JJbox/NFox.git
  3. ! [rejected] master -> master (non-fast-forward)
  4. error: failed to push some refs to 'gitee.com:JJbox/NFox.git'
  5. hint: Updates were rejected because the tip of your current branch is behind
  6. hint: its remote counterpart. Integrate the remote changes (e.g.
  7. hint: 'git pull ...') before pushing again.
  8. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

你项目此时是这样的:
原生git笔记 - 图9
这个时候就需要用这种方法会出黑框,所以最好不用这样的方法(用我最上面提及的[处女作.执行拉取提交])

  1. git pull origin master --allow-unrelated-histories #把两段不相干的 分支进行强行合并
  2. 这种问题一般发生在第一次连接本地和远程仓库,后续不会有这样的问题。

原生git笔记 - 图10
出现了这个黑框 Please enter a commit message to explain why this merge is necessary.
搜索了一番 https://www.jianshu.com/p/2dc3bddff5f7

  1. 请输入提交消息来解释为什么这种合并是必要的。
  2. 我不是第一次遇到这个问题,之前是直接解决,没想过为什么,但现在觉得只知其然不知其所以然其实是件很坑自己的事情。所以专门找文档看了下,总算明白了。记下来以防忘记。也希望能帮到有同样疑惑的小伙伴们。
  3. 1.按键盘字母 i 进入insert模式
  4. 2.修改最上面那行黄色合并信息,可以不修改,当然,不修改会显得自己很菜......
  5. 3.按键盘左上角"Esc"
  6. 4.输入":wq",注意是冒号+wq,按回车键即可

我实际的操作是: 按两下shitf+1,输入了感叹号,再删掉感叹号,输入wq,回车
原生git笔记 - 图11
原生git笔记 - 图12
项目此时是这样的:
原生git笔记 - 图13
再推送就好了.

  1. git push --set-upstream origin master


这个时候你可能想问,如果不拉取再推送,会更新远程仓库吗?
答案是你会停留在这个错误上面,令你动弹不得…..

  1. $ git push --set-upstream origin master
  2. To gitee.com:JJbox/NFox.git
  3. ! [rejected] master -> master (non-fast-forward)
  4. error: failed to push some refs to 'gitee.com:JJbox/NFox.git'
  5. hint: Updates were rejected because the tip of your current branch is behind
  6. hint: its remote counterpart. Integrate the remote changes (e.g.
  7. hint: 'git pull ...') before pushing again.
  8. hint: See the 'Note about fast-forwards' in 'git push --help' for details.

[版本回退]

https://blog.csdn.net/yxlshk/article/details/79944535

  1. git log #查看版本号,也可以去github网站上面看,会卡住,按Q退出!!
  2. git log --pretty=oneline #加参数可以看起来简单一点

方法一:
如果想恢复到之前某个提交的版本,且那个版本之后提交的版本我们都不要了,就可以用这种方法.

  1. git reset --hard 515b5a #利用前六位版本HEAD码回滚
  2. 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三次

  1. git revert -n 8b8962

此时发现 “版本一.txt” 被删除了,但是保留了后面版本的文件.
可能会出现两个版本的文件冲突,需要手动修改冲突的文件,而且要git add文件名

  1. git add .
  2. git commit -m "revert add text.txt" #提交
  3. git push #推送

查看历史版本记录

Git 如何放弃所有本地修改(摘录)

  1. #回到过去
  2. git checkout . #本地所有的修改,没有提交的,都返回到原来的状态
  3. git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop恢复
  4. git reset --hard HASH #返回到某个节点,不保留修改。
  5. git reset --soft HASH #返回到某个节点,保留修改。
  6. git log #可以查看 git commit 的历史记录及其 HASH ID,用q退出
  7. git clean -f #删除当前目录下所有没有track过的文件. 它不会删除 .gitignore 文件里指定的文件夹和文件, 不管这些文件有没有被track过
  8. #回到未来...
  9. git reflog #看未来的版本号
  10. git reset --hard HASH

[查找原有远程仓库]

  1. git remote -v #查看项目远程地址
  2. git remote show origin #查看当前仓库基本信息

[移除原有远程仓库]

  1. git remote remove origin #移除原有远程仓库

[处女作2:和他人协作的开发流程]

这篇文章写了很多关键性的操作 https://www.cnblogs.com/javaIOException/p/11867988.html
首先是找到上游仓库,将它fork为你的远程仓库,
新建文件夹,

  1. git init #初始化(直接下载压缩包或者克隆就行忽略)
  2. git clone git@gitee.com:JJbox/NFox.git #然后将项目clone克隆下来(如果直接下载压缩包就行忽略)
  3. #把人家的替换过来你的文件夹内部,人家也会上传它的.git隐藏文件夹,这里面是有每次提交的信息,所以很重要,时间线在里面,你需要用它的.
  4. #添加上游仓库,上游仓库的表示为upstream,远程仓库表示为origin;
  5. #克隆了之后替换了文件,就在.git文件夹位置重启一次黑窗
  6. git status #查看文件内容
  7. git remote -v #查看已有的origin远程仓库
  8. git remote remove origin #移除原有的远程仓库
  9. git remote add origin git@gitee.com:JJbox/NFox.git #设置远程仓库,你自己fork的
  10. git remote add upstream git@gitee.com:vicwjb/NFox.git #设置上游仓库,被fork的
  11. git pull #拉取所有的分支下来
  12. git branch -a #查看所有分支
  13. git branch -vv #查看所有分支的追踪
  14. git checkout -b 本地winform版本 origin/winform版本 #依照远程仓库的分支创建本地分支,它可以继承分支跟踪(这里每个分支都要在本地创建一次...)
  15. git add . #然后增删文件,此过程省略
  16. git commit -m "提交内容" #提交到本地仓库
  17. git pull upstream master #提交远程之前都从上游仓库拉取一下最新的代码,保证了与上游仓库的联动性.
  18. #再将改动同步到自己的远程仓库中,处理完冲突之后....
  19. git push

没有冲突的代码就提交给上游仓库,进去网站上面进行…
原生git笔记 - 图14
也可以在后台设置仓库管理员和开发者,这样他们就可以push你的仓库了.
原生git笔记 - 图15

[分支说明]

标签使用: https://blog.csdn.net/jdsjlzx/article/details/98654951
master,一般放的都是你要发布的代码
比如说,你的dev分支开发到一定程度,计划的功能和要修复的bug已经完成,那么就合并到master分支,
然后建个标签就是git tag
然后就可以做一个发行版,比如现在是1.0
这个时候如果大型的公司开发可能会在master上拉一个fix分支来修bug.

  1. git tag #查看所有标签
  2. git tag -l 'v1.0.*' #查看某个版本系列的tag
  3. git tag -a v1.0.0 -m "内容:v1.0.0" #创建标签
  4. git show v0.0.6 #查看标签的详情,可以看到你commit的内容
  5. git push origin v1.0.0 #推送标签
  6. git tag -d v1.0.0 #删除本地标签
  7. git push origin :refs/tags/v1.0.0 #删除远程的标签

[比较冲突]

当前已经有文件修改,但是没有git add和git commit,
那么此时你需要拉取代码.

  1. git stash #备份当前的工作区的内容
  2. git pull #拉取代码
  3. git stash pop #释放备份内容
  4. git status #检查冲突,再打开每个文件,利用vs内置的git比较冲突.
  5. git add .

比较完之后保存文件,然后再检查下一个….ok就提交吧
原生git笔记 - 图16

[与他人协商问题]

首先你要提一个issue,获取生成的一个编号
原生git笔记 - 图17


https://gitee.com/help/articles/4141#article-header0 这是帮助文档

然后 commit 的时候把这个编号写上,
这里还必须写引号,否则会切割括号作为标识符….
原生git笔记 - 图18