日志篇 原生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的策略不一样....)

(完) 

原文地址:https://www.cnblogs.com/JJBox/p/13876501.html