Linux下Git的基本使用

  金牌会员 | 2024-8-12 00:32:38 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 646|帖子 646|积分 1938

认识Git

   先基于Windows下的git操纵,熟悉了git的基本概念和使用,直接参考这几篇文章:
  Git概述、安装与本地堆栈的基本操纵-CSDN博客
  Git本地堆栈与远程堆栈的交互-CSDN博客
  GtiHub远程堆栈之间的交互-CSDN博客
  Git堆栈的分支操纵-CSDN博客
  堆栈交互时出现的版本冲突问题-CSDN博客
  GIT:使用TortoiseGit进行分支的操纵-CSDN博客
  git clone指定分支拉代码、版本回退-CSDN博客
    然后简单看一个在线代码库的大致情况,以GitLab为例,直接参考这篇文章:
  GitLab使用教程(具体)-CSDN博客
  一般注意两点即可:
  通常我们都会基于SSH协议来让本地堆栈和远程堆栈交互,以是必要设置SSH秘钥;
  在线代码库通常都会提供clone和直接下载的功能,二者有何区别?
  

  采用git clone的项目包含.git目录,这里面有堆栈的历史版本信息。
  采用下载zip文件的是没有.git版本历史信息的,就是单纯的最新文件,不再归git管理了。
  Gerrit 

   了解下Gerrit:
  Gerrit工作流程及使用手册-CSDN博客
  

  使用过git的同学,都知道,当我们git add --> git commit --> git push 之后,你的代码会被直接提交到repo,也就是代码堆栈中,就是图中橘红色箭头指示的那样。
  那么gerrit就是上图中的那只鸟,普通成员的代码是被先push到gerrit服务器上,然后由代码审核人员,就是左上角的integrator在web页面进行代码的审核(review),可以单人审核,也可以邀请其他成员一同审核,当代码审核通过(approve)之后,这次代码才会被提交(submit)到代码堆栈(repo)中去。
  Linux下Git的安装

   对于安装来说,只必要一步即可,那就是
  sudo apt install git
  如何确认安装乐成?
  您可以通过运行此命令并收到雷同于以下内容的输出来确认您已正确安装 Git:
  git --version
  假如出现版本信息,说明安装乐成。
  

  假如没安装,会出现以下提示
  

  更多参考:
  Ubuntu 18..04安装Git_ubuntu 怎么自带git-CSDN博客
  设置SSH Key

   要想从远程堆栈clone代码,就必要设置SSHKey
  该秘钥一开始是没有的,必要在本地生成,然后填到远程堆栈中。
  直接参考这篇文章:
  Linux基础-- Git SSH key生成与设置_linux ssh key 存储-CSDN博客
  注意:
  上方参考文章里,开头和第一步是查看,还没到设置步骤,说的是已经生成秘钥的情况。
  假如还没设置,就必要按照第二步来设置下。
  

  然后cat查看pub秘钥,复制文件内所有内容
  如下:
  

  将该文件所有内容都复制粘贴到代码库的对应设置处,粘贴过后会自动识别
  

  Git常用操纵

   直接参考:
  手把手教你入门Git --- Git使用指南(Linux)_linux 用git-CSDN博客
  操纵分为本地操纵以及远程操纵。
  通常,我们只必要从远程堆栈clone代码到本地;然后将本地修改的commit提交,接着再push到远程堆栈。
  比如:
  git clone https://github.com/Adenialzz/learnGit.git
  后面的地址就是远程堆栈的地址
  ssh地址大概http地址
  

  

    通常情况下,远程操纵的第一步,是使用git clone从远程主机克隆一个版本库到本地。
  本地修改代码后,每次从本地堆栈push到远程堆栈之前都要先辈行git pull操纵,保证push到远程堆栈时没有版本冲突。
  

  git常用命令大全
  Git 常用命令大全 (runoob.com)
  

  git remote show origin
  

  注意:不实行“git remote show origin”查看状态,而是直接实行“git pull origin”也是可以的,后面这个命令会自动检查,有更新它就会下载更新部分,没有更新也会提示你。
  git pull origin
  

  另外,git log和git status都是查看本地堆栈的信息。
  git log是查看版本提交信息;git status是查看文件提交情况;另外,git diff查看具体细节。
    关于初始化init,克隆clone和拉取pull
  git clone之前有没有必要git init_假如文件有git堆栈,下载后还必要git init 吗-CSDN博客
  git初始化与克隆(git init 与 git clone)-菜鸟笔记 (coonote.com)
  git pull和git clone都是拉代码,它们有什么区别呢? - 掘金 (juejin.cn)
  git clone是拉到本地堆栈;git pull是拉到本地工作区。
    git pull的用法
  git pull的用法-CSDN博客
  git pull时,可以让远程分支和本地的指定分支归并。
  git pull 命令 | 菜鸟教程 (runoob.com)
  假如不指定,那默认就是和当前所处的分支进行归并。 
    通例流程,clone-本地修改-(有新文件就必要add)-commit-pull-push? 
  得申请个自己的github,然后验证下。
  待完善。。。
    重要的本地操纵
  改代码之前一定要先备份。
  熟悉Linux下git的本地操纵。
  Git实用教程(三) | Git本地库操纵(堆栈初始化、提交修改)-腾讯云开发者社区-腾讯云 (tencent.com)
  注意,假如是本地从头开始进行git init,可以在初始化时指定主分支名称
  git | 指定 git init 的分支名_git init main-CSDN博客
  但是,要注意一个问题,那就是从头开始时,git init之后,假如用git branch查看分支,会发现没有任何分支,并且,假如试图强行创建一个分支,也会报错:
  Git 新建分支出现报错:“fatal: Not a valid object name: ‘master‘.“_idea 新建git分支报错-CSDN博客
  这是因为主分支也要有一次完整的commit之后才会生成,具体参考上述文章。
  注意,git commit时假如没有写评论,会弹出窗口让你填,下面的提示是操纵,^这个符号表示ctrl,别搞蒙了。
    没有branch的情况下,许多git操纵就没法操纵,比如刚拉下来的代码,还没有提交过的话,一般是没有本地分支的。 
    假如没添加到暂存区就提交,会报错
  

  提示修改没在暂存区用于提交。
    分支的查看和创建
  Git具体教程(五):查看分支、创建分支、归并分支_git 查看所有分支-CSDN博客
  分支的归并 git merge
  【Git】如何进行分支归并_git 分支归并-CSDN博客
  git merge归并,肯定是归并两个分支。
  其实,每个人的本地堆栈相对远程堆栈来说,都是一个本地分支。
  假如两个相同的文件在同一个目录下,正常情况肯定是不允许的,但是在git管理下,可以处于差异的分支,然后通过归并可以成为一个完整的项目。
  归并后,只会剩下一个分支,要留下哪个,就切到哪个分支下,然后实行归并操纵,归并另外一个分支到当前的分支。
  更多参考:
  彻底明白git 本地分支与远程分支,以及git pull与git fetch的区别, 以及git status输出的“Your branch is behind xxx”-CSDN博客
  弄明白如下信息:假如从当前分支A基础上创建一个分支B,那么,B的内容和A的内容在一开始时是一样的,之后,各自更改各自的内容,对方都是不可见的;直到归并两个分支,两个分支的内容才合在一起成为一个文件。
    进行分支操纵时,发现一个问题,基于master分支创建了dev分支,然厥后回切换,在各自的分支上修改,发现不管怎么切换,两个分支的内容都能被两个分支所看见,也就是说,分支是切换了,但是内容竟然是一样的。啥情况?
  百度了下
  git修改一个分支的内容其他分支也同步被修改_git在当前分支上的修改是否会影响另一个分支-CSDN博客
  git切换分支时,该分支的修改被带到另一个分支_git,在本地一个分支上修改了一点点东西,切换到另外一个分支,为什么会自动归并-CSDN博客
  重点就是:
  每次切换分支之前,都要commit一下。
    git匿名分支
  Git实用教程 7.2:匿名分支_你有1个未毗连到任何分支的分离提交-CSDN博客
  git branch HEAD~可以切换到匿名分支;
  

  切换到匿名分支后,就可以删除其他所有的分支了
  之后,使用git branch时,就只能看到匿名分支了
  

    git无分支
  要和这种情况作区分:
  

  Git 分支 (no branch)|极客笔记 (deepinout.com)
  假如你在 “(no branch)” 状态下继续提交,这些提交将会以匿名分支保存,但你可能很难回到这些提交。
  Git 分支 (无分支)|极客教程 (geek-docs.com)
  其实就是,没有分支时,最好自行创建一个分支大概几个分支。审慎对待匿名分支大概无分支状态。
    repo无分支
  repo sync同步后,repo branch和所有堆栈实行git branch 都显示no branches
  2022-01-06 repo sync同步后,repo branch和所有堆栈实行git branch 都显示no branches,先repo start master --all 建分支才能开发_repo sync后如何创建git分支-CSDN博客
  

  【git】repo init和sync下载代码后,没有指定分支,后面push产生冲突的惨痛办理_repo sync 指定分支-CSDN博客
  无branch,后续必须实行repo start 分支名  --all 建分支才能开发,比如:
  

  repo创建的分支会应用到其管理的所有的堆栈,然后,各堆栈也能独立地创建堆栈,比如repo branch显示如下:
  

  当服务器有新的更新后,直接repo sync就可以同步了
    git删除分支
  Git 删除分支——如何删除本地或远程分支_git 删除本地分支-CSDN博客
  git branch -d 分支名
  我们刚刚使用的删除本地分支的命令并非在所有情况下都有效。
  假如分支包含未归并的更改和未推送的提交,则该-d标记将不允许删除本地分支。
  这是因为任何其他分支都看不到提交,并且 Git 正在掩护您免于意外丢失任何提交数据。
  假如你实验这样做,Git 会显示一个错误:
  

  正如错误所暗示的那样,您必要改用该-D标记:
  git branch -D local_branch_name
  -D带有大写-- delete --force字母D(它是 的别名)的标记会强行删除本地分支,无论其归并状态如何。
  但请注意,您应该审慎使用此命令,因为没有提示要求您确认您的操纵。
  仅当您绝对确定要删除本地分支时才使用它。
  假如您没有将其归并到另一个本地分支或将其推送到代码库中的远程分支,您将面对丢失所做的任何更改的风险。
    关于冲突出现的机遇:
  Git pull的时间,会先fetch,然后再merge,fetch一般不会有问题,重要是merge的时间可能会出现冲突。
  那什么时间会出现merge呢?重要有三种情况:
  因为pull是直接pull到工作区,以是,当直接pull的时间,假如本地和远程都修改了同一份文件,本地文件假如没有加入暂存区大概提交,就会在工作区merge的时间发生冲突;
  假如本地已经加到暂存区了,那么pull的时间不会提示冲突,但是,把本地暂存区的内容释放出来,然后在工作区merge的时间,就会产生冲突;
  假如本地的内容已经commit提交了,那么pull的时间也不会产生冲突,但是,当再次提交时,因为待提交的内容和已提交的内容有冲突,此时的merge也会产生冲突;
  也就是说,只要修改了同一份文件,就会产生冲突,只是在什么时间merge,就什么时间发生冲突,这种情况,冲突一定会发生,只是发生的机遇不一样。
  直接pull时,产生冲突,会导致pull失败;本地提交,然后再pull,会导致本地有许多提交颗粒;建议使用第二种,pull之前,先stash本地,然后pull完成之后,再办理冲突,这样,既能乐成pull,还可以淘汰提交的颗粒。
  注意:办理冲突后,正常add和commit即可。
  git stash办理git pull和本地文件的冲突_git stash git pull-CSDN博客
  别忘了提交完成后,删除stash。
  总之,上述的过程的关键是要知道有三种空间,提交的堆栈、暂存区、工作区。
  注意,加入到stash后,git status就看不到状态了,因为git status看的是工作区的状态信息。
  注意:先commit再pull有个好处就是,假如pull大概修改的内容要回退,可以直接回退到某个commit版本,但是另外两种方式就不行了。固然提交的颗粒度较多,但是和安全性相比,就显得不那么重要了。
  本人建议先commit然后再pull,这种情况,其实工作区的变动就相称于是新的修改,我们可以下次再提交。
    办理冲突
  归并差异的文件是没什么问题,假如多个分支修改了同一个文件,当归并时就会出现冲突。
  详情参考:
  详解Git归并冲突——问题重现、原因及办理 “Automatic merge failed; fix conflicts and then commit the result.“_automatic merge failed; fix conflicts and then com-CSDN博客
  

  一般,从云拉到本地,HEAD里面是本地的内容,后面的是云端的内容。
  必要先办理这些冲突才能实行其他操纵,可以实行git merge --abort退出归并的中间状态
  

  注意,办理冲突后的文件就相称于处于工作区的一个新文件,按照通例来实行add和commit,就可以了。
    办理冲突之后git add和git commit,但还是有问题
  git status查看,提示如下: 
  interactive rebase in progress; onto 796e78f
  办理如下:
  git status 堕落 interactive rebase in progress; onto 796e78f_interactive rebase in progress; onto-CSDN博客
  git rebase参考:
  git rebase详解(图解+最简单示例,一次就懂)-CSDN博客
    Git回退到某个版本
  git回滚到之前某次提交(本地+远程)_git 本地和远程 同时回滚上一次提交-CSDN博客
    git diff
  Git基础-git diff 比较文件的差异-CSDN博客
  git diff 版本号1 版本号2 --stat
  加了--stat可以只看摘录,也就是改动了哪些文件,不看文件的改动细节。
    其他一些常用的命令
  git add
  git commit
  git branch
  git fetch
  等等。。。
  更多参考:
  Git 显示两个版本之间修改了哪些文件|极客教程
  Git – Fetch命令|极客教程 (geek-docs.com)
    git的设置文件
  要验证本地堆栈的Git设置,请使用以下命令: git config –list
  Git提供了git config工具,允许您设置设置变量。Git将所有全局设置存储在位于您的主目录中的.gitconfig文件中。要将这些设置值设置为全局变量,请添加–global选项,假如省略–global选项,则您的设置将仅适用于当前的Git堆栈。
  您还可以设置体系范围的设置。Git将这些值存储在/etc/gitconfig文件中,该文件包含体系上每个用户和堆栈的设置。要设置这些值,您必须具有root权限并使用–system选项。
  repo工具

   
除了使用git,我们还可以使用repo工具来管理堆栈,进行堆栈的初始化和同步。

  
Git、Gerrit、Repo三者的区别及使用_gerrit repo-CSDN博客

  使用sudo apt-get install repo 命令直接安装
  repo可以看做是对git的封装。
  常用操纵参考以下文章:
  repo使用教程_repo init-CSDN博客
  使用示例:
  

  补充:
  Manifest文件详解_manifest file-CSDN博客
    repo init会初始化一个.repo堆栈管理文件
  

  repo是多个git的管理,一种应用场景是,整个工程用repo来管理,然后工程里面的各个文件夹都用git管理。
  repo入门和基本用法_repo start-CSDN博客
  Repo工作原理及常用命令总结——2023.07(下)-阿里云开发者社区 (aliyun.com)
  
    不提交git就没有版本信息,就没法回退。改完想要再改返来就很麻烦。
  假如改完后有问题,难道再一个地方一个地方地去改吗?显然是不可行的。 
    repo sync  ##默认同步所有仓,可以指定project 。
  假如是第一次运行 repo sync ,则相称于 git clone,会把server所有内容都拷贝到本地。根据manifests中的xml文件中git的commit进行同步,这个xml文件在repo init的时间指定;
  假如不是第一次运行 repo sync ,则相称于 git remote update ;  git rebase origin/branch 将server上的code与本地归并;假如在rebase 的过程中出现冲突,这必要手动办理冲突,然后运行:git  rebase --continue
  非初次运行repo sync时,会有如下操纵:
  

  Git fetch 和 git checkout 与仅实行 git checkout 的区别|极客教程 (geek-docs.com)
  git pull好像是git fetch和git merge的综合操纵,和repo sync略有区别。
  Git 归并和切换命令的先容|极客教程 (geek-docs.com)
  反应底层都会拉代码以及归并,就不要过分纠结了。
  克制冲突的根本方法:
  明白分工,相同文件,尽可能只由一个人操纵 (根本上办理问题)
    注意,repo init只是初始化一个.repo,并不能下载程序,下载程序必要repo sync,别搞错了。。。。。。 
  XML和manifest文件

   XML(Extensible Markup Language)是一种雷同于 HTML,但是没有使用预界说标记的语言。XML 是一种可扩展标记语言,用于形貌数据的布局,而不是显示数据。XML 文件以 .xml 扩展名存储,可以用差异的方式打开,如本地欣赏器或在线查看器。XML 标签没有预界说,可以根据必要自行界说。
  在repo堆栈管理中,通常就是用manifest的xml文件来形貌目录布局
  参考:
  一张图让你把握清单文件manifest.xml的重点_repo project-objects-CSDN博客
  注意,是manifest,不是main.... 
  补充

   怎么看diff文件?
  diff命令--输出格式解读_diff format-CSDN博客
  从实用角度出发看懂和使用diff、git diff的归并格式 (lksr.net)
  读懂diff(转载) - michael111 - 博客园 (cnblogs.com)
  重点关注git格式的归并diff,重要是在第三篇参考文章的最后一小节讲到了。
  其实,只用看文件和加减的地方即可。
    git打补丁patch
  Git版本控制中的补丁(patch)是什么|极客教程 (geek-docs.com)
  注意,假如补丁本身还没有被提交,是不能被下载的。
    许多时间,不想让某些文件参与到git的管理之中,可以将这些文件类型加到一个.gitignore文件中
  .gitignore 文件——如何在 Git 中忽略文件和文件夹具体教程-CSDN博客
  但是要注意,假如你发现加了之后还没什么效果
  【问题分析办理】git添加.gitignore后不见效问题_gitignore文件不见效-CSDN博客
  

  很有可能是你加入的一些文件在之前就已经被git进行track跟踪了,此时,可以先将这些文件从跟踪列表中移除
  Git中如何跟踪或取消跟踪文件或文件夹-CSDN博客
  在git是用过程中,可能碰到以下情况:
  1、被跟踪文件里面有不想跟踪的文件。
  2、每次用git status查看状态时总是列出未被跟踪的文件。
  办理方法:
  1、当被跟踪的文件里面有不想跟踪的文件时,使用命令git rm删除文件。如:
  git rm --cached readme1.txt    删除readme1.txt的跟踪,并保存在本地。
  git rm --f readme1.txt    删除readme1.txt的跟踪,并且删除本地文件。
  然后git commit即可。但是git status查看状态时还是会列出来。
  2、每次用git status查看状态时总是列出未被跟踪的文件,可以通过.gitignore文件到达目的。
  也就是git add的反向操纵。
  注意,移除之后,要实行一次git commit来使其见效。
    先pull还是先commit
  Git commit与pull的先后顺序_git先pull再commit-CSDN博客
  一般是先pull,再commit,再push
  假如先pull再commit,则pull时可能会出现冲突,必要先办理冲突。
  不过,先commi再pull,至少可以保证自己的代码不会丢失,而先pull再commit,有可能导致自己的代码丢失。我推荐先commit再pull。
    git cherry-pick
  git cherry-pick命令用法详解-CSDN博客
  想在某个稳定版本上,添加一个刚开发完成的版本中的功能。就可以使用 Cherry-pick 命令,将这个功能相关的 commit 提取出来,合入稳定版本的分支上。
  对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。
  通常开发时分两种情况:
  必要将某一个分支的所有代码变动,那么就采用归并(git merge)
  只必要某一个分支的部分代码变动(某几个提交),这时可以采用 Cherry pick
  cherry-pick 和它的名称翻译一样,精心挑选,挑选一个我们必要的 commit 进行操纵。它可以将在其他分支上的 commit 修改,移植到当前的分支。
  git cherry-pick命令的作用,就是将指定的提交(commit)应用于其他分支。
  git cherry-pick <commitHash>
  上面命令会将指定提交的commitHash应用于当前分支。此时在当前分支产生一个新的提交,新提交代码的哈希值会和之前的不一样。
    git config命令
  Git---git config操纵大全 查看和操纵设置参数_git config --list-CSDN博客
    【git问题】couldn‘t find remote ref
  【git问题】couldn‘t find remote ref_couldn't find remote ref-CSDN博客
    git放弃当前的修改
  git放弃本地文件修改 - 简书 (jianshu.com)
  放弃修改是相对最近一次提交来说的。
    建议每次新增功能,都新建一个开发分支,假如开发没问题再合入到主分支上。
  要否则修改了,然后要恢复,很麻烦。省得老是整个复制代码去备份,而且容易出现问题,比如路径更改引起的问题。
  通常,本地操纵时,在某个分支上开发完功能,再合入到master时,不会有冲突,因为开始时分支就是基于master的,只要master没改动,就不会有冲突,细致体会下。
    不建议一次性add所有文件,而是一个一个地add,然后再commit,要否则一些过程文件被加进去,然后又在.gitignore里不好屏蔽,就容易干扰正常的开发。究竟上,哪些文件有改动,我们都是知道的。以是,建议手动添加文件。
    【Git】git commit --amend 追加提交_git commit 追加-CSDN博客
    windows和ubuntu下git commit提交后如何保存和退出,回到命令行 - wuguoxing - 博客园 (cnblogs.com)
    注意:repo下各git堆栈可以独立操纵。也有一些操纵可以repo直接针对所有的堆栈。 
  一个很重要的概念,那就是repo可以用来管理多个堆栈,其实所谓的多个堆栈,就是多个git堆栈,repo可以通过manifest文件来指定堆栈的目录布局分布以及所属的远程分支等信息。
  每个repo管理有一个.repo文件,只在最上层;
  每个堆栈有一个.git文件;偶然候,我们可以看到一个.git地点的目录下面还有.git,这种情况下,每一层的.git其实只负责当前目录层的git管理,是看不到其他层git的变化情况的。假如到了某一层,再往下就没有.git了,那么这个最下层的.git就负责其下所有文件的git管理。以是,偶然候,你发现明显改动了一些文件,然后git status大概git diff却发现没有任何变化,那是因为你没有在对应的.git层来操纵;大概偶然候,你拉了一些代码下来,发现只提示部分文件没有commit,明显你还修改了其他的文件,那是因为,你拉的代码是属于其中某一个堆栈的,以是,只会提示跟该堆栈有关的内容的改变。也就是说,假如只是针对某个堆栈做的改变,可以不必repo sync来同步所有的堆栈,而只用在对应的堆栈下进行git pull即可。
  总之,细细体会一番。
    无分支大概匿名分支切换到正常分支之后,原来无分支大概匿名分支状态下的修改全没了。以是,repo拉下来之后建议第一时间就repo start,然后再开发。 

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

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表