zoukankan      html  css  js  c++  java
  • git 学习

    git的优势特点:分布式非集中式。Git比其他版本控制系统设计得优秀,因为Git跟踪并管理的是修改,而非文件

    git的下载安装,环境变量设置:用户与系统环境变量的区别是影响的用户不一样。

     二 git能管理的文件类型和编码问题:git主要用来管理文本文件(编码强烈建议使用标准的UTF-8 without bom编码),图形或二进制也能管理但只能跟踪文件大小的改变,windows默认的TXT会有问题(每个文件开头添加了0xefbbbf(十六进制)的字符,具体可百度),word是二进制文件。

    三 创建文件仓库(即该文件夹下所有的文件都可以被GIT管理起来)

     在一个文件上右键->git bash here,可打开bash,然后git init,可以在该文件夹下出现.git的文件夹。.若没有显示则在资源管理器上依次点击,查看-显示隐藏即可。

    四 文件操作:

    • git add filename :添加文件到暂存区,如果不添加到暂存区,修改就没法递交;也可以多次添加,最后一次递交;-f参数会将一些忽略的文件强制添加
    •  git commit -m "注释“  :将暂存区的所有添加内容递交给仓库的主分支,并备注。注意修改后要重复添加和递交动作
    • git status:查看状态;git diff:比较不同
    • git log --pretty=oneline  查看修改历史,后面参数可以以更简洁的形式显示历史信息
    •  git reset --hard HEAD^:回退到上一版本,HEAD^也可以写成HEAD~1,上上版本为HEAD^^或HEAD~2
    •  git reset --hard commit_id  :回退后再前进一个版本,前提是需要知道其修改ID版本号(不需要很全),如果当前bash命令行窗口还没有被关掉,找到其ID后可恢复;若已经关闭则用git reflog查询版本号

     五 撤销操作:工作区-暂存区-本地递交-远程推送

    • 未添加到暂存区时(只对工作区的修改进行撤销):用命令git checkout -- file。注意--不能省否则就是切换分支了
    • 添加到了暂存区但未本地递交,分两步:第一步git reset HEAD <file>将暂存区内容退回工作区;第二部git checkout -- file撤销对工作区的修改
    • 本地递交,但未远程推送: git reset --hard HEAD^或 git reset --hard commit_id 进行版本回滚;
    • 远程推送了:那就没着了。

     六 远程仓库:github/gitee(国内速度快,码云的免费版本也提供私有库功能,只是有5人的成员上限),本地库可以同时与github和gitee两个远程库同步,但要注意不能同名。

      github上托管的都是公有的,所以不要托管私密信息。变私有的2种方法:交费用或者自己架设git服务器(公司做法)。本地库和远程库之间是通过SSH协议保密通讯,在gitHUB上托管的方法步骤:

    • 第1步:创建SSH Key.在本地仓库目录下通过BASH执行ssh-keygen -t rsa -C "youremail@example.com",即可创建.ssh目录,里面有id_rsaid_rsa.pub两个文件(该2个文件分别对应私钥和公钥。
    • 第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面,添加私钥id_rsa.pub

         gitee上托管的步骤:

    • 创建SSH Key. 选择右上角用户头像 -> 菜单“修改资料”,然后选择“SSH公钥”,填写自己的id_rsa.pub作为公钥,出现以下内容时多次回车ssh key已经生成。在目录c/Users/username/.ssh/id_rsa下面可以用cat 查看。

                Generating public/private rsa key pair.

                Enter file in which to save the key (c/Users/username/.ssh/id_rsa):

            注意:仓库的 SSH Key 和账户 SSH Key 的区别

    • 创建一个新的项目,选择右上角用户头像 -> 菜单“控制面板”,然后点击“创建项目
    • 建立关联:可以将远程仓库克隆下来;也可以将本地建好的库与其关联。其中后者方法如下:
      git remote   add gitee git@gitee.com:liaoxuefeng/learngit.git    

                 git remote add github git@github.com:michaelliao/learngit.git

              而克隆的方法如下:http协议或则ssh协议

                git clone https://github.com/michaelliao/gitskills.git或者

                git clone git@github.com:michaelliao/gitskills.git

             也可参考:Git配置多个SSH-Key

          其它指令:

    • 删除远程库:git remote rm origin
    • 查看远程库:git remote -v
    • 本地推送到远程库:git push -u libname master。其中-u参数表示不但将本地仓库主分支推送上去,还建立关联,以后再推送拉取就简便多了。注意远程推送需要推送电脑的SSH Key公钥在远程仓库的账户列表中。
    • gitee添加SSH-KEY后的验证:ssh -T git@gitee.com

     

     git登录账号密码错误remote: Incorrect username or password (access token)

    分支管理

      为什么要有分支:首先功能不完整的代码时不能推送到远程库,因为这样会给他人造成困扰。但我又怕已经完成的代码如果因为意外损坏或者覆盖无法进行过程管控,那么就用分支吧,它即可以将你功能未开发完成的代码也管控起来,同时也不会给他人造成困扰,在完成后,将分支合并到主分支,然后在删除分支。整个过程就像什么没发生一样。并且创建合并删除分支只是进行指针的操作非常迅速,所有非常有用。

    如上图所示,

    • master仅用来发布新版本,平时不能在上面干活;
    • dev为开发分支,合作开发的都会合并到这里;
    • 以下时每个人自己的开发分支。
    • bug分支:每个人的功能还未完善是不能合并的,当此时发现主分支有bug必须先处理时,可以先git stash储藏目前开发,切换到主分支,创建bug-id分支修改问题后合并到主分支并删除bug-id分支;然后在切换自己的分支用git stash pop复原储藏前的状态(也可以通过git stash list看stashid,然后git stash apply stash@{id}来复原指定的储藏版本。又因为dev分支是基于master的,master有bug,dev肯定也存在,此时可以通过可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
    • 如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除

    分支管理常用命令如下:

    查看分支:git branch,会列出所有分支并且,带*号的是当前分支

    创建分支:git branch <name>

    切换分支:git checkout <name>或者git switch <name>

    创建+切换分支:git checkout -b <name>或者git switch -c <name> 推荐用后者

    合并某分支到当前分支:git merge <name>

    删除分支:git branch -d <name> 注意默认Fast forward模式,删除分支后,会丢掉分支合并的信息,而加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并

    查看分支合并图:git log --graph --pretty=oneline --abbrev-commit

    仓库的管理:

    成员管理:每个仓库有一个所有者(默认也是管理者),还可以添加管理者开发者,观察者等。只有管理者或开发者列表中的成员才可以访问仓库,默认所有者

    • 向远程仓库推送同步要指明同步哪个分支:git push 【origin master】/origin dev在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!
    • 多人协作的步骤:
    1. 管理者将新人添加到仓库人员列表中,将其公钥也添加进去;
    2. 新人得到库URL后进行git clone拷贝整个库,但此时其它人是看不到新人的dev分支的,通过git branch可以看到只有master分支。
    3. 先通过git remote add origin git@*.git建立远程库和本地的关联,再用git checkout -b dev origin/dev ,创建并切换基于远程dev分支的本地库dev分支;

      如果远程仓库存在dev分支,而你的本地不存在dev,那么最好是先git pull一下,然后再执行:$ git checkout -b dev origin/dev 就可以自动关联分支dev;而如果本地已经有了dev分支但还未与远程仓库关联,则用git branch --set-upstream-to=origin/dev dev建立关联。

    4. 新人每次用用git push origin <branch-name>来推送,当发现冲突git pull,同步更新下本地库,然后,在本地合并,解决冲突,再推送。
    5. rebase操作可以把本地未push的分叉提交历史整理成直线;rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

    git公司服务器搭建

    权限管理:默认git不支持权限权力(与开源精神违背),但可以通过Gitolite管理。

    公钥管理:人员不多时可通过收集所有人的公钥放到服务器的/home/git/.ssh/authorized_keys文件里;人数多时可以通过可以用Gitosis来管理公钥。

         

    • git config -l查看当前账户配置信息
    • git config --global user.name<username> /user.email<useremail>加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用

    版本的标签管理:

      必要性:Git的标签是版本库的快照,但其实它就是指向某个commit的指针commit号是一长串编码不好记忆,tag就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

                        标签默认都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。也可以将标签推送远程库,

           操作方法:默认标签是打在最新提交的commit上的,如git tag v1.0,但也可以补打,方法是先找到历史提交的commit id,然后git tag v0.9 commit id;查看git tag会列出所有版本历史(不是按时间顺序)。

          其它命令:

    •      git tag -a v0.1 -m "version 0.1 released" commit id,用-a指定标签名,-m指定说明文字:
    • git show <tagname>  查看版本信息。
    • git tag -d<tagname>  删除版本信息。但若已经推送了该标签到远程,则删除时还要git push origin :refs/tags/<tagname>操作。
    • git push origin <tagname> 将标签推送到远程库;或者git push origin --tags一次性推送所有本地未推送的标签

     其它特殊操作:

    • 一些特殊文件让git忽略递交:在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件(当然git add -f filename中的-f可以强制递交即使忽略的文件)。然后把.gitignore也提交到Git,可以通过git status命令是不是说working directory clean。通过git check-ignore<filename>可以查看该文件违反了哪个规则。注意:window是下新建.gitignore文件时系统会很弱智提示你必须输入文件名,此时可以打开文本文件通过保存为.gitignore就可以了。忽略文件的原则及模板:
    1. 忽略操作系统自动生成的文件,比如缩略图等;
    2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
    • 命令别名:
    1. git config --global alias.<st>  <status>;
    2. git config --global alias.unstage 'reset HEAD'将添加到暂存区的修改撤销的别名。
    3. git config --global alias.last 'log -1'用git last显示最后递交信息
    4. 删除别名:先找到配置文件,然后再别名下删除对应别名命名即可,cat .git/config查看配置文件,当前用户配置文件cat .gitconfig放在用户主目录下的一个隐藏文件.gitconfig中。

       gitGUI的使用:自带GUI的使用Git可视化极简易教程 — Git GUI使用方法

       Git自带的Git GUI使用

      Git有很多图形界面工具,这里我们推荐SourceTree,它是由Atlassian开发的免费Git图形界面工具,可以操作任何Git库。官网下载地址

    下载安装后,通过2种方法建立本地库与远程库的联系:

    • 如果还未建立本地库,“New”-“Clone from URL”直接从远程克隆到本地。
    • 如果本地库已经创建,可以直接从资源管理器把文件夹拖拽到SourceTree上,就添加了一个本地Git库。

    ********************************************************************************

    1分支的删除:分支只有合并后才删除,若还没合并就删除就报错,可以用-D参数来删除。
    2功能分支:增添新功能需要另建分支
    3查看与本地对应的远端仓库:git remote  /git remote -v
    4将该分支的本地所有推送到远端:git push origin 分支名
    5多人协作模式:5.1 git push origin 分支名;2若推送失败说明远端比自己版本新可以先 git poll;3若pull也失败了,原因是没有指定本地dev与远程分支的链接。origin/dev分支的链接 git branch --set-upstream 本地分支 origin/dev;
                    5.4创建并切换与远端对应分支。5如何再pull合并,有冲突先解决冲突,然后commit ,最后推送远端。
    6标签管理:git tag -a v1.0 -m "说明"commitID  .若commitID缺省则指的是当前,否则查明并确定commitID;查看标签:git tag /git show V1.0;-a指定版本;-s可以PGP私钥签名;-d删除标签;-m添加说明。
    7删除和推送标签:标签不会自动推送,推送git push v1.0/--tags,--tags表明所有标签;远端标签删除先删除本地标签,然后git push origin :refs/tags/v0.9。
    8参与网上的开源项目:先从别人主页fork一个仓库到自己的远端服务器,然后在本地clone自己的远端仓库,并向自己的远端库push。如果你希望bootstrap的官⽅库能接受你的修改,你就可以在GitHub上发起⼀个pull request。当然,对⽅是否接受你的pull request就不⼀定了。
    9自定义GIT:
    9.1让Git显⽰颜⾊,会让命令输出看起来更醒: $ git config --global color.ui true
    10忽略文件的处理:对中间生成的文件、自己的敏感信息文件虽然放在本地git但不希望远传又不希望commit提示,此时可以建立.gitignore文本文件,在其中配合要忽略的文件名或文件类型。
                        Windows系统在资源管理器中新建.gitignore文本文件时必须指定名字,但在另存为时可以不写。
    11别名:--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都适用。
            $ git config --global alias.co checkout
            $ git config --global alias.ci commit
            $ git config --global alias.br branch
            $ git config --global alias.unstage 'reset HEAD'
            $ git config --global alias.last 'log -1'
            $ git config --global alias.lg "log --color --graph -- pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
    12自建服务器:用ubuntu/debian安装git 建立目录,收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导到/
    home/git/.ssh/authorized_keys中,一行一个或者用Gitosis工具进行公钥管理;创建一个裸仓库,禁用shell登录;
    13权限管理:Git继承了开源社区的精神,不支持权限控制。不过,因为Git支持钩子(hook),所以, 可以在服务器端编写一系列脚本来控制提交等操作,达到权限
    控制的目的。 Gitolite就是这个工具。

  • 相关阅读:
    dedecms 织梦本地调试 后台反映非常慢的处理办法
    phpcms前端模板目录与文件结构分析图【templates】
    phpcms 思维导图
    Linux下文件的复制、移动与删除
    动态加载dll中的函数
    ava中关于String的split(String regex, int limit) 方法
    java.io.File中的 pathSeparator 与separator 的区别
    如何删除输入法记忆的词汇
    zip4j -- Java处理zip压缩文件的完整解决方案
    file.separator 和 / 区别
  • 原文地址:https://www.cnblogs.com/jieruishu/p/7928127.html
Copyright © 2011-2022 走看看