• Git分布式版本控制工具



    layout: post
    title: Git分布式版本控制工具
    description: Git分布式版本控制工具
    tag: 开发工具


    git 基本配置与指令

    设置用户信息

    设置用户信息:
    git config --global user.name "lewis"
    git config --global user.email "lewissince2022@163.com"
    查看用户信息:
    git config --global user.name
    git config --global user.email

    为常用指令设置别名

    有些常用指令可能参数很多,可以使用别名来简化命令。指令设置别名的具体方法如下:

    1. 打开用户目录,创建.bashrc文件,部分Windows系统不允许用户创建点开头的文件,可以打开gitbash,执行touch ~/.bashrc
    2. 在.bashrc文件中输入如下内容:
      语法格式:alias 简化指令=实际指令
    # 用于git提交日志
    alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
    # 用于输出当前目录所有文件及基本信息
    alias ll='ls -al'
    
    • 1
    • 2
    • 3
    • 4
    1. 打开gitbash,执行source ~/.bashrc,使得文件生效。

    解决gitbash乱码问题

    1. 打开gitbash执行下面命令
      git config --global core.quotepath fasle
    2. ${git_home}/etc/bash.bashrc (git_home即为git的安装目录)文件最后加入如下两行:
    export LAN="zh_CN.UTF-8"
    export LC_ALL="zh_CN.UTF-8"
    
    • 1
    • 2

    git的工作流程

    在这里插入图片描述

    工作区:编辑代码的地方
    index暂存区:执行完毕add后加入到暂存区
    本地仓库repository:执行commit后,本地进行提交
    远程仓库remote:执行push后,推送到远程仓库
    执行pull:将代码从远程拉取到本地工作区
    执行fetch/clone:将代码从远程拷贝到本地仓库
    执行checkout:将本地仓库的分支代码检出到工作区

    基础操作指令:初始化、添加到暂存区、提交到仓库、查看状态、日志

    在当前目录下初始化仓库:git init

    git中非常主要的两个指令git addgit commit
    在这里插入图片描述
    add将新建文件(未追踪)或修改过的文件(未暂存)提交到暂存区,commit则将暂存区的修改加入到仓库,称为一次提交。

    例子:

    1. 创建file01.txt:touch file01.txt
    2. 查看git状态(当前工作区文件的状态):git status
    3. 添加到暂存区(指定文件或者使用通配符’“.”添加所有):git add file01.txt或者git add .
    4. 再次查看状态:git status
    5. 提交到本地仓库,并添加注释为“add file01”:git commit -m "add file01"
    6. 再次查看状态:git status
    7. 查看git日志:git log

    git log [option]

    • –all 显示所有分支
    • –pretty=oneline 将提交信息显示为一行
    • –abbrev-commit 使得输出的commit更简短
    • –graph 以图的形式显示

    版本回退git reset

    撤销某次不想要的提交:git reset --hard commitID
    commitID使用git log查看
    撤销提交后在git log中将不再显示

    如果想要查看已经删除的记录
    git reflog该指令记录了所有的操作
    通过git reset --hard commitID可以再找回撤销前的版本

    配置.gitignore

    某些不想纳入Git管理的文件,可以在gitignore文件中列出需要忽略的文件模式
    创建.gitignore文件: tourch .gitignore
    编辑.gitignore:

    # no .a files
    *.a
    # but do track lib.a, even though you're ignoring .a files above
    !lib.a
    # only ignore the TODO file in the current directory, not subdir /TODO
    /TODO
    # ignore all files in the build/ directory
    build/
    doc/*.txt
    # ignore all pdf files in the doc/directory
    doc/**/*.pdf
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    分支

    分支创建、删除、合并、查看

    1. 查看分支:git branch
    2. 创建本地名为“dev01”分支:git branch dev01
    3. 再次查看分支:git branch
    4. 切换到分支dev01:git checkout dev01
    5. 创建分支dev02并切换到该分支:git checkout -b dev02
    6. 在dev02分支创建文件:tourch file02.txt
    7. 切换回master分支,合并dev02
      git checkout master
      git merge dev02
    8. 删除分支dev02:git branch -d dev02
      删除分支还有一个指令使用大写的D。
      大写的D是不检查,强制删除,小写的d删除时会检查分支是否还有未merge的提交。

    git merge和git rebase的区别

    git merge 保留了原有分支的结构(原有分支依旧存在),也保留了原有分支的时间顺序。
    在下面这幅图中:
    git merge develop 所得的8号节点是对3号节点,7号节点以及6号节点的一个合并。
    在这里插入图片描述
    git rebase 操作先找到两分支的公共祖先即3号节点,随后,将master分支在3号节点以后的(5和7),嫁接到develop分支的(4和6)之上,然后合并到3号节点。

    再来看 git rebase develop,可以翻译为:将当前分支重新以develop分支为基础。

    当然rebase后的5和7节点和之前的5和7是不一样的,因为来源不一致,也就是说用5’和7’来表示更加准确。

    rebase之后,整个分支结构只有一条了。

    在这里插入图片描述

    总结:git merge:两个人分别写代码,进行不同的修改,使用git merge整合时,对分支历史没有影响,可以退回到自己原有分支的节点。

    git rebase:消除了git merge操作所创建的没有必要的合并提交,使得项目提交历史变得非常干净整洁。但是它的安全性和可回溯性相对更差。因为git rebase 操作丢失了原有的分支提交的信息——所以你就无法知道develop分支是合适应用了master分支的变更。

    rebase操作黄金法则

    永远不要在公共分支上使用它

    如果在main分支上,重新以其他分支作为基础。
    在这里插入图片描述

    rebase命令会把main分支中所有的提交都放到feature分支的提交记录顶端。问题在于这个改变目前只出现在你的本地仓库,其他开发者仍然在原来的main分支上进行开发,由于rebase会产生新的提交记录,所以git会认为你在本地的分支与所有其他人的产生了分叉。

    因此任何时候,执行git rebase命令前,先确认是否有其他人也正在使用此分支,不然你把底下的东西换了,但是别人还不知道!

    git stash 相关操作

    工作区分为两个部分的文件,一部分是使用add跟踪了的,还有一部分是未追踪的。
    在这里插入图片描述
    git stash可以将当前暂存区和工作区改动的代码保存到一个git 栈里边。

    应用场景一:(分支切换)
    当前分支为A,突然老板让你展示bug分支B。怎么处理?

    1. git stash 保存当前分支A到git栈
    2. git check out B 检出分支B
    3. 在分支B处理完后,git check out A,检出分支A
    4. git stash pop,将之前的保存从git栈中弹出

    应用场景二:(解决分支冲突,避免远端冲突)
    当代码开发完毕准备提交:
    5. git stash,保存未提交的改动到git 栈
    6. git pull 拉下来远程
    7. git stash pop
    8. 本地处理可能出现的冲突
    9. git commit + git push

    git stash的操作:
    存(入栈):

    • git stash
    • git stash save ‘注释’ // 相对于git stash,会给入栈的版本添加一个说明的’注释’

    取(出栈)

    • git stash pop
    • git stash apply

    pop对应栈的pop(),取出来,而apply 对应栈的peek,不出栈

    清除

    • git stash drop + 栈索引 // 清空栈索引代表的那条记录
    • git stash clear // 清空整个git 栈

    查看

    • git stash list // 看整个栈中的所有记录,
    • git stash show + 栈索引 // 可以查看具体某条记录的所变动的代码

    git cherry-pick

    有时候我们合并代码时,只想合并另一个分支的某一个节点,就可以使用git cherry-pick(摘樱桃,一个节点就像一个樱桃)

    用法:
    git check-pick 4commit号 // 将4号更改合并到本分支上

    git check-pick 4commit号 8commit号 // pick不连续的提交,4号和8号

    如果是一段连续的提交,像上边一个一个列出就很麻烦,可以使用下面这个指令,pick一段连续的提交:
    git check-pick 4commit号 .. 8commit号 表示合并(4, 8]

    还可以使用
    git check-pick 4commit号 ^.. 8commit号 前边加了反v,表示左区间也为闭区间,合并[4, 8]
    在这里插入图片描述

    当然git cherry pick也可能出现冲突

    合并遇到冲突

    假定两个分支对于同一行代码进行了修改,git 在merge时将无法自动合并,需要人为手动调。
    在这里插入图片描述

    在这里插入图片描述

    远程仓库

    ssh公钥配置

    生成SSH公钥:

    • ssh-keygen -t rsa
    • 不断回车

    在Gitee设置账户公钥

    • 获取公钥 cat ~/.ssh/id_rsa.pub

    在这里插入图片描述

    • 验证是否配置成功ssh -T git@gitee.com

    git推送本地项目到远程的空仓库

    1- 在远程比如gitee建立空仓库,复制仓库地址,例如:https://gitee.com/lewissince2020/my-leet-code.git

    2- 在本地项目的根目录右键git bash here,进入git命令行,

    初始化:建立本地空仓库,自动生成.git文件夹,指令:

    git init

    3- 绑定远程项目orgin

    git remote add origin https://gitee.com/lewissince2020/my-leet-code.git

    4- 拉远程项目和本地合并

    git pull origin master --allow-unrelated-histories

    5- 添加待提交内容,‘.’的含义是所有文件

    git add .

    6- 提交到本地仓库,‘-m’的含义是本次推送的message说明

    git commit -m 'init'

    7- 推送到远程仓库

    git push origin master

    本地远程仓库操作

    推送到远程仓库

    • 推送命令:git push [-f] [--set-upstream] [远端名称][本地分支名][:远端分支名]
      • 如果远程分支名和本地分支名相同,则可以只写本地分支
        git push origin master
      • –set-upstream 推送到远端的同时并且建立和远端分支的关联关系
        git push --set-upstream origin master
      • 如果当前分支已经和远端分支关联,则可以省略分支名和远端名
        git push 将master分支推送到已经关联的远端分支
      • -f 是用本地分支强制覆盖远端分支的意思(假如远端和本地改变了同一程序的同一行发生冲突)
    • 查看本地分支与远端对应关系
      git branch -vv

    从远端克隆仓库

    克隆指令:git clone <仓库路径>[本地目录]
    本地目录可以忽略

    从远程仓库抓取和拉取

    • 抓取命令:git fetch [remote name][branch name]
      • 抓取命令是将仓库里的更新都抓取到本地,不会进行合并
      • 如果不指定远端名称和分支名则抓取所有分支(或者会抓取与本地关联的分支
    • 拉取命令:git pull [remote name][branch name]
      • 拉取命令就是将远端仓库的修改拉到本地并自动进行合并,等同于 fetch + merge
      • 如果不指定远端名称和分支名,抓取所有分支(或者会抓取与本地关联的分支

    从远端拉取发生冲突

    远端与本地冲突解决方法与之前分支合并冲突类似。Git无法自动合并,需要认为针对冲突文件进行选择修改,随后添加到暂存区,进行提交。
    在这里插入图片描述

    jetbrain配置Gitee插件

    下载Gitee插件

    在这里插入图片描述

    安装完成以后重启idea
    在设置里边搜gitee,在可视化控制(Version Control)里边找到刚刚下载的gitee插件
    然后添加账户,点击加号,login via gitee,弹框输入gitee的注册邮箱和密码,图中我已经添加完毕,可以看到已经显示了登录信息。
    在这里插入图片描述

    Gitee克隆云端仓库到本地

    在idea界面file/close project,重新建立项目,选择get from vcs
    在这里插入图片描述

    账号添加成功则可以看到你的gitee仓库:
    下边选择本地项目存放地址,需要一个空的文件夹,然后克隆仓库
    在这里插入图片描述

    克隆完成后,在打开的idea界面右下角选择仓库的分支:
    刚刚克隆下来的项目显示的是master分支,只包含两个readme文件

    点击那个分支树的图标选择我们当前开发的test分支,点击checkout(分支检出),切换到test分支:
    在这里插入图片描述

    Gitee协作

    主要记录一下idea的git操作
    Git选项栏在界面右上方:
    在这里插入图片描述

    蓝色下拉箭头:拉取远端仓库文件,点击后弹窗:
    我的理解这里merge是跟本地仓库融合,rebase是覆盖本地
    在这里插入图片描述

    绿色对勾是git commit操作的是本地库
    绿色上行箭头是git push是将本地库中的最新信息发送给远程库。
    每次操作最好三个图标按顺序来一遍,先跟新别人的操作融合到自己的仓库,然后提交自己的代码到本地仓库,再push到云端仓库。
    Push后在gitee可以看到自己的提交:
    在这里插入图片描述

  • 相关阅读:
    智慧公厕:细致入微的城市贴心服务与便捷方便的生活配套
    Java基础JDBC
    蒙特卡洛估计举例
    Web3 革命:揭示区块链技术的全新应用
    南开大学漏洞报送证书【文尾有福利】
    Java中transient关键字的详细总结
    全球手机一哥再度回归国内市场,国产手机品牌怕了么?
    Ubuntu下安装TexLive+TexStudio
    QT day 1
    ExtJS DOM操作-查询(DOM Query)
  • 原文地址:https://blog.csdn.net/baiduwaimai/article/details/127891484