• 日志篇 原生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

    准备工作

    安装与卸载

    下载: 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引用路径不再是八进制(反过来说就是允许显示中文了)
    View Code

    修改邮箱

    如果你喜欢在黑窗输入用户名和邮箱,也是可以的...

    新建一个文件夹,对着文件夹右键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的策略不一样....)

    (完) 

  • 相关阅读:
    10. 正则表达式匹配
    svn 类似.gitignore功能实现
    GF学习未解之谜
    cocos
    unity 编辑器内对Game视图进行截图
    Roughlike游戏里面的随机数种子
    网站推荐——游戏图标网
    Unity 使用image绘制线段 直线
    c# unity 异步任务队列
    Unity编辑器调用外部exe程序 和 windows文件夹
  • 原文地址:https://www.cnblogs.com/JJBox/p/13876501.html
Copyright © 2020-2023  润新知