github和git的简单使用

打印 上一主题 下一主题

主题 987|帖子 987|积分 2961

简介

github和git是每个程序员都必须把握的技能,在这里对两个工具作入门介绍。
github

github是代码托管平台,付费用户可以建立私人仓库,免费用户只能使用公共仓库,也就是代码要公开,它可以资助开辟者存储和管理其项目源代码。


  • 网址:https://github.com/
  • 中文社区:https://www.githubs.cn/,从这里进入github网站会快点
github和git的关系:github使用git作为版本管理工具。
简单使用

新建仓库:


  • 第一步:在欣赏器中输入 github.com,进入github。因为是英文界面,所以必要有肯定的英文基础。注册一个账号,必要提供自己的邮箱。
  • 第二步:点击sign in,登录到自己的页面
  • 第三步:点击左上角的New,新建一个仓库,建好后的仓库会在下方表现,点击就可进入。点击搜索框,可以搜索一些有用的项目
删除仓库:


  • 第一步:进入仓库内部,点击setting,翻到最下面,有删除按钮
搜项目的技巧

这里介绍一些实际的使用案例:


  • 搜索名称中包含sprint boot的项目:in:name sprint boot
  • 搜索收藏数目大于3000的项目:stars:>3000
  • 搜索分支数目大于100的项目 :forks:>100
  • 搜索readme中包含spring boot字眼的项目:in:readme spring boot
  • 搜索形貌中包含spring boot字眼的项目:in:description spring boot
  • 搜索使用java语言实现的项目:language:java
  • 搜索最近的更新日期在2019年3月3日之后的项目:pushed:>2019-09-03
git

简介

git是一个免费的、开源的分布式版本控制体系,诞生于2005年,早先是为了更好地管理Linux内核的开辟而建立的。
版本控制

版本控制:对文件的修改做记录,相称于文件备份,用户可以在必要时将文件切换到以前的版本。版本控制是由个人开辟过渡到团队协作过程中诞生出的产物,创建版本控制工具的目的就是为了方便多个开辟者对同一个项目举行开辟。
版本控制工具的必要提供的功能:


  • 汗青记录:将当地文件规复到某一个汗青状态
  • 分支管理:答应团队在工作过程中多条生产线同时推进任务
  • 权限控制
  • 协同修改:多人并行修改同一个文件,手动合并冲突或依据修改次序自动合并冲突
分布式版本控制:每个人都工作在通过克隆建立的当地版本库中,每个人都用于一个完备的版本库,所有操纵都直接在当地完成而不必要网络毗连
版本控制工具的汗青

最早是使用diff和patch两个命令,后来是CVS和SVN
diff、patch

diff:以举动单元比力多个文件之间的差异,也可以比力文件夹


  • 格式:diff [option …] files
patch:使用patch命令,根据diff命令生成的差异文件,来规复原始文件。这个命令使用比力复杂,而且如今用处不大,所以只是了解一下即可
CVS

Concurrent Versions System,版本控制工具,诞生于1985年,是早期的一款版本控制工具
SVN

subversion,诞生于2000年方一款版本控制工具
安装和设置

下载地址:http://git-scm.com/downloads。针对差别的平台,选择自己必要安装包
安装:下载完成后傻瓜式安装即可
设置git:在命令行实验如下命令


  • git config --global user.name "用户名":告诉git自己的用户名,–global选项,表现这台机器上的所有git仓库都会使用这个设置。如果去掉 --global 参数只对当前仓库有用。
  • git config --global user.email "邮箱名":告诉git自己的邮箱
  • git config --list:表现当前git的设置信息
git的设置文件:


  • 用户级别:用户目录下的 .gitconfig文件
  • 全局级别:安装目录下的 etc/gitconfig文件
  • 仓库级别:.git目录下的config文件,在使用git创建一个当地库后,会默认在当地库根目录下创建一个.git目录
入门案例

在这个入门案例中演示如何使用git来做版本管理,重要通过命令行来操纵git


  • 新建文件夹 learn_git
  • 初始化文件夹为代码库:打开终端控制工具,进入文件夹,实验命令 git init,此时,文件夹中会创建一个名为 ‘.git’ 的子文件夹,不可以修改这个文件夹中的内容,git正是通过它来实现对代码的版本管理。
  • 在工作区中编辑文件:工作区就是 learn_git文件夹下除了 .git 目录以外的地方,任意创建一个文件并编辑一些内容
  • 将工作区中的文件添加到暂存区: git add aa.txt
  • 把暂存区的文件提交到当地库:git commit -m '第一次提交'
  • 查看提交日志:git log
这里只演示最根本的使用,更加具体的操纵随后学习
代码库

代码库就是存储代码的地方,git的作用,就是管理代码库。
使用git,创建一个代码库,将自己的代码存放到代码库中,就可以对代码举行版本管理了。
代码库的构成



  • 工作区:working tree,用户在这个区域中编辑文件
  • 版本库:工作区下的 “.git” 目录

    • 暂存区:index/stage,位于版本库下的index文件中,编辑后的文件手动添加到暂存区,暂存区也叫做索引
    • 仓库:把暂存区域的文件手动提交到仓库,完成编辑。仓库是存储文件和修改记录的地方。git的数据库分为远程仓库和当地仓库。

      • 当地仓库:为了方便用户个人使用,在自己的机器上设置的仓库。
      • 远程仓库:配有专门的服务器,为了多人共享而建立的。

    • master:git自动为用户创建的第一个分支。
    • HEAD:实验当前位置的指针

对代码库举行版本管理的大致流程



  • 初始化代码库
  • 工作区:在工作区编辑文件
  • 暂存区:把文件保存到暂存区
  • 当地库:把暂存区的文件提交到当地库
  • 远程库:把当地库的文件提交到远程库
git的根本操纵

要在代码库中使用git命令才有意义
创建代码库



  • 初始化代码库:git init命令。在一个目录下实验git init命令,这个目录就会被设置为git的仓库,随后所有git命令的实验都要在代码库下实验才有意义。
  • .git目录:实验命令后,目录下会出现一个".git"目录,它是git的版本库,所有git必要的数据和资源都存放在这个目录中。代码库本质上是有’.git’子目录的文件夹。
  • 编辑设置文件:git config -e。使用git默认的编辑器,编辑当前的设置文件
操纵代码库

在工作区中编辑文件

工作区,就是和.git子目录平行的别的位置,在工作区中创建几个文件而且编辑一些样例数据。
把工作区中的文件添加到暂存区

使用add命令,把工作区中的文件添加到暂存区:git add <file1 .... | dir1 dir2 | .>,点代表所有文件
把暂存区中的内容提交到当地库

git commit [-a | -m <message>]


  • -m <message>:message是一些备注信息
  • -a:修改文件后不必要实验git add命令,直接来提交。例如:git commit -am ‘mes’,直接将工作区的文件提交到仓库,但是不建议使用,因为git add命令是为了追踪文件,直接跳过会导致文件缺乏追踪
  • --amend:修改上一次提交的message
查看提交日志

git log [--pretty=oneline | --oneline] [--stat] [file]:查看某个文件汗青提交记录,或所有的汗青提交记录


  • --oneline:每个提交记录只表现一行
  • --pretty=oneline:每个提交记录只表现一行
git reflog:简略地展示每次提交的信息,而且会额外展示当前指针指向的位置。
从版本库和工作区中删除文件



  • 使用rm命令删除工作区的文件,
  • 使用git rm <file>命令删除当地库的文件,
  • 实验 git commit -m "msg" 命令,就可以把删除动作提交到当地库,从当地库中删除文件
重命名文件

git mv 旧文件名 新文件名
比力文件的前后差异

git diff [--cached | HEAD] [file]:默认比力工作区和暂存区之间的文件的差别,字体的颜色,白色表现无变化,红色表现已删除,绿色表现已新增。


  • –cached:比力暂存区和当地库之间的文件的差别
  • HEAD:比力工作区和当地库之间的文件的差别
git blame <file>:以列表的情势表现某个文件的修改记录
版本的前进和后退

git reset HEAD~{1,2..} <file>:使用reset命令来实验版本的前进和后退。reset的含义是重新设置,设置当前HEAD指针到指定的阶段,HEAD指针是git创建的默认指向master分支的指针


  • –soft:仅仅移动当前head指针,不会改变工作区和暂存区的内容
  • –mixed:默认参数,移动head指针,改变暂存区内容,但不会改变工作区内容
  • –hard:当前head指针、工作区、暂存区的内容全部改变
reset命令的三种使用方式:


  • 基于索引值来前进或后退版本:

    • 第一步:实验命令:git reflog,查看每个版本的局部索引值;
    • 第二步:实验命令:git reset --hard <局部索引值>,把当前指针移动到索引值代表的版本,可以前进,也可以后退。

  • 使用异或符实验版本后退:git reset --hard HEAD^^^,只可以后退,有几个异或符,表现后退几步
  • 使用 ~(波浪线)的情势实验版本后退:git reset --hard HEAD~3,只可以后退,数字是几,表现后退几步
查看工作区和暂存区的当前状态

git status [-s | -b]


  • -s:输出简要信息
  • -b:展示分支信息
查看资助信息

git help:在命令行查看简单的资助信息
git 子命令 --help:会打开一个网页,网页中的内容是当前命令的具体信息
忽略某些在工作区但是不必要举行版本管理的文件

.gitignore文件:在工作中,并不是所有的文件都必要保存到版本库中,例如 target 目录下的文件九可以忽略。在git工作区的根目录下,创建一个特殊的 .gitignore 文件,在这个文件中,每一行指定一个忽略规则。前面的规则会覆盖反面的规则
忽略规则的语法:


  • # :注释使用 # 开头
  • / :以斜杠/开头表现目录
  • * :以星号通配多个字符。pattern中有/的时间不匹配/,pattern中没有/的时间*可以匹配/
  • ** :匹配完备路径,它不管什么斜杠不斜杠的,所有字符通吃
  • ? :以问号?通配单个字符
  • [] :以方括号[]包含单个字符的匹配列表
  • ! :取反,不忽略匹配到的文件
最好在初始化当地库之后就创建 .gitignore 文件并订定忽略规则,在2.x版的git中,如果文件没有被add,而且它符合随后创建的忽略规则,那么它会自动被忽略
git分支

分支:可以明白为代码的差别版本,差别的人操纵差别的分支,末了再合并分支。分支可以用于并行推进任务,而且一个任务的失败不会影响到另一个任务,可以增加效率
之前所有的操纵都是在同一个分支下举行的,但是在实际开辟中,开辟者通常是在自己的分支下开辟代码,开辟完成后,把自己的代码提交到主分支中
master分支:git自带的分支,默认的主分支
新建分支

git branch <分支名>:如果没有任何参数,表现查看当前所有分支,哪个分支开头带 *,当前就在哪个分支


  • -v :表现表现具体信息
  • <分支名>:创建分支
  • -D <分支名>:删除某个分支
  • -M <分支名>:修改当前分支的分支名
  • -r:查看远程分支
切换分支

git checkout <分支名>切换到指定的分支


  • -b:以当前分支为基础新建分支
  • – file:丢弃工作区的修改,让文件回到最近一次git commit或git add的状态
在当前分支中合并别的分支

git merge <分支名>,在当前分支中合并指定分支的内容。如果修改有冲突,会集并失败。
git合并分支时遇到的两种情况:fast-forward和Three-way merge。


  • fast-forward:例如,从master分支中开辟出某个分支,分支的代码举行了提交,但是master分支没有动,此时,master分支合并开辟出的分支,就是 fast-forward 的情况
  • three-way merge:例如,从master分支中开辟出某个分支,分支的代码举行了提交,master分支也提交了自己的修改,此时就有可能产生冲突。当两个分支产生冲突时,git会找到它们共同的祖先,
解决当地合并冲突


  • 第一步:如果合并过程中出现冲突,出现冲突的文件中会有一些特殊符号,标明了冲突的位置和内容
  • 第二步:编辑文件,删除特殊符号,把文件修改到满足的程度,可以在当前分支修改,也可以切换分支修改,在某个分支的修改不会影响另一个分支的内容
  • 第三步:git add 文件名
  • 第四步:git commit -m “message” ,此时commit不能带文件名。解决冲突后,会自动完成合并
当地库和远程库的交互

之前所有的操纵都是在当地库,在实际开辟中,所有开辟者从远程库获取代码,开辟完成后,必要把代码上传到远程库,然后其他人再从远程库中拉取代码,获取最新的修改
在这里,当地库是使用git维护的当地仓库,远程库是在github上创建的仓库
创建远程库

在github上创建一个仓库,本文件之前的内容中有讲
克隆远程库到当地

git clone <uri>:它会完备的把远程库下载到当地、创建远程库别名、初始化当地库,在实验命令之前,不消特意创建一个文件夹,这个命令会自动创建文件夹。在github的仓库页面上可以找到代表仓库的uri。
为当地库关联一个远程库

git remote add <name> <url>,


  • name:通常叫origin
  • url:远程库的url,例如:https://github.com/wuyaojun108/storage-code.git,在github页面上可以找到。
如果远程仓库是空的,当地的内容可以直接提交到远程仓库,如果远程仓库有内容,应该先把远程仓库的内容clone下来
当地库的代码推送到远程库

查看当地库管理的远程库地址:git remote -v
实验推送命令:git push [<远程库别名>] [<当地库分支>],默认的远程库别名是当前关联的远程库,默认的分支是当前分支
从远程库拉取代码

第一步:git fetch <远程库别名> <当地库分支> ,拉取分支信息
第二步:git pull [<远程仓库名>] [<远程分支名>]:[<当地分支名>]:默认从当前当地库对应的远程库下同步文件,如果当地分支名是当前分支,可以省略不写。如果pull时报[rejected]错误,表现远程仓库的分支和当地分支出现了冲突,建议修改当地仓库,以和远程仓库保持一致
使用github

在github上创建分支

第一种方式:点击搜索框 - view all branch - create new branch,创建新的分支
第二种方式:也可以在当地创建分支,然后把当地分支提交到github上,提交命令:git push <远程库名称> <当地库分支>,如果远程库没有相同的分支,默认会创建一个
在github上约请开辟者

在仓库界面:settings - collaborators - add people,约请开辟者后,别的开辟者也可以为当前项目提交代码
github中的fork和pull request

fork:复制目标仓库到自己的github账户下
pull request:合并别的人的提交,用户跨团队协作
git中的tag

tag是版本库的一个标记,指向某次提交的指针,是静态的、不可移动的。它重要用于标识重要的快照,例如线上发布时使用的版本
注意:tag是针对某次提交的,如果打tag时当前有未提交的代码,未提交的代码不会被包含在tag中,tag没有与分支直接关联。如果tag关联的提交被回退了,tag也会正常存在,但通常不会在开辟中打tag,都是上线前为稳定的代码打一个tag。
使用案例:每次发布都使用tag来打发布包,如果要回滚,就使用上一个tag打包,所以tag通常指向一个稳定的代码版本。
操纵tag



  • 列出所有tag:git tag:按字母排序,罗列当前分支上的所有标签。分支差别,tag差别
  • 查看tag信息:git show <tagName>:表现标签的详情,包罗tag所属分支、提交信息、tag创建者和创建时间等。如果tag打在了当前查看的分支,就会查到tag详情;否则,提示非常信息
  • 创建tag:git tag <tagName> [-m <message>],例如 git tag v1.0,给当前代码打上v1.0的标签
  • 推送tag:git push <远程库名> <tagName>
  • 删除tag:git tag -d <tagName>
  • 切换tag:git checkout <tagName>
  • 拉取远程分支的最新tag:git fetch,这个命令用于拉取元数据
tag和分支之间的关系

独立性:tag和分支是两种差别的git引用范例


  • 分支:一个可移动的指针,通常用来指向项目的开辟历程,答应变化和增长。
  • tag:一个固定的指针,用于标记代码汗青上一个已知稳定或重要的状态。
用途:


  • 分支:用于开辟新特性,维护差别的开辟线。在分支上可以举行一系列的提交和更改。
  • tag:用于对开辟过程中的重要点举行标记,例如发布的版本,保持这些状态的不可变性和可追溯性。
操纵差异:


  • 分支:可以被修改、删除、合并master、从master中创建出一个分支
  • tag:tag的创建是为了标记一个固定的点,一旦创建一般不会改变
maven 使用tag打发布包

第一步:将代码切换到某个tag git checkout <tagname>
第二步:打包 mvn clean package
使用某个分支打包也一样,将代码切换到分支,然后实验maven的打包命令
git stash命令

git stash:将当地没有提交的内容举行缓存并从当前分支移除,缓存的数据结构为栈,先辈后出。
作用:当用户拉取远程分支的代码,但是当前分支已经作出一些修改时,可以使用git stash命令,隐蔽当前分支的修改,然后拉取远程分支,然后再通过git stash命令,弹出刚才的修改,弹出后可能必要合并冲突
git stash命令的使用



  • git stash [ save ‘xxx’ ]:加上自己的注解举行缓存
  • git stash list:查看缓存列表
  • git stash pop:将堆栈中最新的内容pop出来应用到当前分支上,且会删除堆中的记录
  • git stash apply:与pop相似,但它不会在堆栈中删除这条缓存
变基操纵 rebase

一种将一系列提交从一个分支上摘下来,然后再应用到另一个分支上的机制。这个操纵常用于清理提交汗青,使得项目的汗青变得更加线性和易于明白。变基可以用来整合两个分支的更改,或者将当地分支上的更改重新基于远程分支的最新状态。
变基会改变提交的哈希值,因为它实际上是创建了一个新的提交序列。这意味着变基是一种“粉碎性”操纵,应该谨慎使用。
变基是一种强大的工具,可以资助用户维护一个干净有序的项目汗青,但在使用时必要考虑到团队协作的影响。在团队中使用变基之前,最好与团队成员沟通,确保各人对变基的操纵和影响有共同的明白。
不要在已经推送到远程仓库的分支上举行变基:如果已经将分支推送到了远程仓库,然后对分支举行了变基并再次推送,这可能会给其他协作者带来麻烦,因为他们必要处置处罚非快进更新。
git的使用经验

使用git的精确步骤

先拉取当前分支的最新代码,然后开辟代码、提交自己的代码。如果合并到master分支时发现冲突,把master分支的代码合并到当前分支
取消ssl校验

如果设置了ssh,可能会报错,fatal: unable to access 'https://github.com/wuyaojun108/storage-code.git/': OpenSSL SSL_read: Connection was reset, errno 10054。这是服务器的SSL证书没有经过第三方机构的签订,所以报错。实验命令:git config --global http.sslVerify "false",取消ssl校验,可以解决这个题目。
根据管理器:点击左下角的win图标,输入根据管理器,然后打开
切换分支时报错

切换分支:git checkout -b <当地分支名> origin/<远程分支名>
报错:fatal:‘xxx’ is not a commit and a branch ‘xxx’ cannot be created from it
缘故原由:因为远程新建的分支没有更新到当地,用checkout命令是从当地仓库找分支的,当地仓库只有在举行网络请求时才会跟远程仓库交互,应该先实验git fatch命令
在IDEA中使用git

设置git和github

设置git:file - settings - version control - git,在 path to git executable 对话框中,选择 git.exe 地点的路径
设置github:file - settings - version control - github,重要是设置仓库地址和github账号,点击 + 号,选择 log in with token,点击 generate,登录github,生成 token,复制到IDEA中,点击add account
使用经验

解冲突

如果两个分支对于相同的依靠做了差别的升级:


  • 如果依靠是当前项目中的,比如一个模块依靠另一模块,选自己的,合并完成后重新打包。因为同一个项目中,合并代码时会把所有模块的代码都合并,两个分支的改动合并完成后,选择自己的版本号即可
  • 如果依靠是第三方的,必要商量
对于代码冲突,如果是差别功能,只是代码恰好在一个类中,merge即可,否则必要和同事商量
回退到某个版本

我遇到的题目是,我修改了两个文件,把它们发到了线上,但是随后发现文件里有错误,造成了题目,盼望可以或许回退到这两个文件之前的版本。
方法1:force push,先在当地回退到想要的版本,然后点击force push,逼迫提交当地代码,远程分支也会回退,使用force push比力危险,它会修改远程分支的提交汗青,必要先和同事打声招呼。(IDEA中,点击push图标旁边的倒三角,就可以看到force push)
方法2:show repository at revision,查看某次提交时的仓库信息,从仓库中找到文件,根据文件中的内容举行回退
第一步:show repository at revison:

第二步:仓库快照信息。在左侧会表现仓库这次提交的快照信息,根据快照中的文件来修改代码,让后重新提交

查看一个分支从哪个分支中被check出来的

git reflog show ${branch-name},查看分支的提交汗青
查看某个commit的详情,根据commitId

git show ${commit-id}
diff命令 比力两分支之间的不一致

git diff --name-only ${commitId1} ${commitId2}
报错记录

pull代码失败 报错 You have divergent branches and need to specify how to reconcile them.

解决方法:在当地实验git命令 git config pull.rebase false,它用来设置pull操纵的默认举动,实验这个命令后,Git会将合并作为拉取远程分支更新时的默认计谋,而不是变基(rebase)。
从 Git 2.27 版本开始,Git引入了一个新特性,要求用户明确指定在拉取操纵中如何处置处罚已经偏离的分支。这意味着如果用户没有明确设置 pull.rebase 的值,Git 会表现警告信息,并要求用户设置一个默认举动。这样做的目的是为了克制在没有明确意图的情况下不小心覆盖掉分支上的提交汗青。
在 Git 的早期版本中,当用户实验 git pull 命令时,如果没有指定特定的计谋,Git 默认会尝试快进合并(fast-forward merge)。如果快进合并不实用,Git 会实验一个普通的三方合并,创建一个新的合并提交。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

张春

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表