• 13.git的简单使用


    安装

    https://git-scm.com/downloads

    一直点下一步就可以,安装完后打开方法:‘开始菜单’-->'Git'-->''Git Bash

    安装完成后设置名字和电子邮件

     bash基本操作

    1)、cd : 改变目录。
    2)、cd . . 回退到上一个目录,直接cd进入默认目录
    3)、pwd : 显示当前所在的目录路径。
    4)、ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
    5)、touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
    6)、rm: 删除一个文件, rm index.js 就会把index.js文件删除。
    7)、mkdir: 新建一个目录,就是新建一个文件夹。
    8)、rm -r : 删除一个文件夹, rm -r src 删除src目录, 好像不能用通配符。
    9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
    10)、reset 重新初始化终端/清屏。
    11)、clear 清屏。
    12)、history 查看命令历史。
    13)、help 帮助。
    14)、exit 退出。
    15)、#表示注释
    命令

    创建仓库

    1.切换目录

    2.通过  git init 命令把当前目录变成git可以管理的仓库

    会生成一个.git目录,如果没有看见运行  ls -ah 就可以查看到

    hello.html内容“hello world”

    把文件提交到仓库

    -m 后面输入的是本次提交的说明

    查看配置

    git config -l   查看git环境详细配置

    git config --global --list    查看当前用户配置

    git操作

    更改hello.html内容为 'hello git!'

    运行git status  查看状态

    git diff hello.html   查看哪里做了修改

    知道哪里修改后在提交  git add hello.html     git commit -m "add distributed"
    git log 查看历史记录  

    git log --pretty=oneline   一行显示
     退回上次修改的某个版本
    git reset --hard a8d2be07ab1a718179e08f78f430fd91cc3cad33

    git reflog   记录每一次提交的commit id,然后通过这个可以恢复到某个版本

    总结:

        #HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
    
        #穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
    
        #要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

    工作区和暂存区

    工作区:working directory  就是一个目录   learngit文件夹就是一个工作区

    版本库:repository    工作区的隐藏目录  .git  这个不是工作区,而是git的版本库

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
    
    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    
    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支

    需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

     撤销修改

    场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file。
    
    场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作

    删除

    git rm filename

     GitHub使用

     生成密匙

    $ ssh-keygen -t rsa -C "1184405959@qq.com"

    C:UsersAdministrator.ssh目录下找到id_rsa.pub复制里面所有内容

    github账号-->your profile-->edit profile-->SSH and GPG key-->New SSH key-->粘贴key

     添加远程库

    1.GitHub 上选择new repository 创建一个learn-git 仓库

    2.把本地仓库文件上传到远程

    git remote add origin https://github.com/derek-zhang123/learn-git.git
     git push -u origin master    #上传所有  第一次要加-u 以后就直接 git push origin master

    如果报错 运行如下命令再重复上传一次

     git remote rm origin

    从远程库克隆

    在github创建learn-git仓库

    克隆到本地

     git clone https://github.com/derek-zhang123/learn-git

    然后在本地会生成一个learn-git目录,里面克隆了remote仓库所有的文件

    分支管理

    git branch dev     #创建分支
    
    git checkout dev    #切换到div分支
    
    
    #可以合并一个命令  创建并切换到dev
    git checkout -b dev

    #查看分支 *代表当前在哪个分支
    git branch

    添加内容到hello.html,

    然后提交

    这是在分支dev上做的操作,提交完成后,切换到master分支

    这个时候查看hello.html的内容时,发现刚才添加的内容并没有显示,因为那是在dev分支上提交的,而master分支并没有变

    现在,把dev上的工作合并到master分支上:

    git merge dev

    再查看时,刚才添加的内容可以看到了

    删除分支dev

    git branch -d dev

    如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

    总结:

    查看分支:git branch
    
    创建分支:git branch <name>
    
    切换分支:git checkout <name>
    
    创建+切换分支:git checkout -b <name>
    
    合并某分支到当前分支:git merge <name>
    
    删除分支:git branch -d <name>

    解决分支冲突

    当分支dev和master都修改了hello.html,合并会提示冲突

    这个时候需要手动解决冲突(在master分支修改内容后用下面的命令提交)

    分支管理策略

    git merge --no-ff -m "merge with no-ff" dev

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

     bug分支

    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

     多人协作

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin branch-name推送自己的修改;

    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

    3. 如果合并有冲突,则解决冲突,并在本地提交;

    4. 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功!

    如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name

    这就是多人协作的工作模式,一旦熟悉了,就非常简单。

    总结:

        查看远程库信息,使用git remote -v;
    
        本地新建的分支如果不推送到远程,对其他人就是不可见的;
    
        从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
    
        在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
    
        建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
    
        从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

    标签

    创建标签   git tag v1.0
    查看标签   git tag
    默认标签打在最新的commit提交上,要想给历史的提交打上标签,也很简单。先找到标签 git log --pretty=oneline --abbrev-commit

    比如要给add xxx添加上标签,找到它对应的commit id添加  git tag v0.9 098f23b
    查看标签信息:git show v0.9
    删除标签: git tag -d v0.9
    推送标签:git push origin v1.0
    一次推送全部标签:git push origin --tags


    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

    git tag -d v1.0

    再删除远程:

    git push origin :refs/tags/v1.0

    总结:

        命令git push origin <tagname>可以推送一个本地标签;
    
        命令git push origin --tags可以推送全部未推送过的本地标签;
    
        命令git tag -d <tagname>可以删除一个本地标签;
    
        命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

    使用github

    访问主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:

    git clone https://github.com/derek-zhang123/bootstrap

     命令总结

    #本地使用
    git init
    ls -ah                 #查看隐藏
    git status            #查看状态
    git add -A           #添加所有
    git commit -m "提交信息"   
    git diff               #查看文件更改的变化
    git checkout -- .       #撤销修改
    git reset --hard 55f9ddb      #回退到某个版本  后面七位数字是commit id
    git reflog                
    git clean -xf        #删除当前目录下所有没有track过的文件
    git config --global core.quotepath false #文件名字是中文时,解决乱码显示问题
    
    #git与github关联
    git config --global user.name "你的用户名"
    git config --global user.email "你的邮箱"
    ssh-keygen -t rsa -C "你的邮箱"     #生成ssh key
    clip < ~/.ssh/id_rsa.pub              #将生成的key复制到粘贴板
    git push -u origin master
    git pull origin master
    git remote add origin 你复制的地址
    git push
    git clone https://github.com/schaepher/blogsbackup.git #下载别人的代码到本地

    理论基础

    四个工作区域

      Workspace:工作区,就是你平时存放项目代码的地方

      Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息

      Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

      Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换

    其它概念

      Directory:使用Git管理的一个目录,也就是一个仓库,包含我们的工作空间和Git的管理空间。

      WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。

      git:存放Git管理信息的目录,初始化仓库的时候自动创建。

      Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。

      Local Repo:本地仓库,一个存放在本地的版本库;HEAD会只是当前的开发分支(branch)。

      Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态

    git工作流程

      在工作目录中添加、修改文件;

      将需要进行版本管理的文件放入暂存区域;

      将暂存区域的文件提交到git仓库。

    git管理的文件有三种状态:

      已修改(modified)

      已暂存(staged)

      已提交(committed)

    git文件操作

    版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。GIT不关心文件两个版本之间的具体差别,而是关心文件的整体是否有改变,若文件被改变,在添加提交时就生成文件新版本的快照,而判断文件整体是否改变的方法就是用SHA-1算法计算文件的校验和。

    文件四中状态

     

    • Untracked: 未跟踪, 此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.

    • Unmodify: 文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件

    • Modified: 文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改

    • Staged: 暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified

     总结

     忽略特殊文件.gitignore

    在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件

    不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore

    忽略文件的原则是:

    1. 忽略操作系统自动生成的文件,比如缩略图等;
    2. 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
    3. 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
    # Byte-compiled / optimized / DLL files
    __pycache__/
    *.py[cod]
    *$py.class
    
    # C extensions
    *.so
    
    # Distribution / packaging
    .Python
    build/
    develop-eggs/
    dist/
    downloads/
    eggs/
    .eggs/
    lib/
    lib64/
    parts/
    sdist/
    var/
    wheels/
    *.egg-info/
    .installed.cfg
    *.egg
    MANIFEST
    
    # PyInstaller
    #  Usually these files are written by a python script from a template
    #  before PyInstaller builds the exe, so as to inject date/other infos into it.
    *.manifest
    *.spec
    
    # Installer logs
    pip-log.txt
    pip-delete-this-directory.txt
    
    # Unit test / coverage reports
    htmlcov/
    .tox/
    .coverage
    .coverage.*
    .cache
    nosetests.xml
    coverage.xml
    *.cover
    .hypothesis/
    .pytest_cache/
    
    # Translations
    *.mo
    *.pot
    
    # Django stuff:
    *.log
    local_settings.py
    db.sqlite3
    
    # Flask stuff:
    instance/
    .webassets-cache
    
    # Scrapy stuff:
    .scrapy
    
    # Sphinx documentation
    docs/_build/
    
    # PyBuilder
    target/
    
    # Jupyter Notebook
    .ipynb_checkpoints
    
    # pyenv
    .python-version
    
    # celery beat schedule file
    celerybeat-schedule
    
    # SageMath parsed files
    *.sage.py
    
    # Environments
    .env
    .venv
    env/
    venv/
    ENV/
    env.bak/
    venv.bak/
    
    # Spyder project settings
    .spyderproject
    .spyproject
    
    # Rope project settings
    .ropeproject
    
    # mkdocs documentation
    /site
    
    # mypy
    .mypy_cache/
    .gitignore

    最后一步就是把.gitignore也提交到Git,就完成了!

  • 相关阅读:
    算法复习——扫描线(hdu1542)
    hbase简单操作
    python操作Mongo数据库
    查看图片大小
    python修改图片格式
    python图片压缩
    python 图片抓取
    failed to lazily initialize a collection of role: could not initialize proxy
    failed to lazily initialize a collection of role: could not initialize proxy
    vim自动打开跳到上次的光标位置
  • 原文地址:https://www.cnblogs.com/derek1184405959/p/8427821.html
Copyright © 2020-2023  润新知