zoukankan      html  css  js  c++  java
  • git的使用

    一、git、GitHub、gitlab的概述

      一、git-版本控制工具

      Git是一款自由和开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

      Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
    Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。

      二、GitHub-一个网站

      一个网站,提供给用户空间创建git仓储,保存用户的一些数据文档或者代码等 

      作为开源代码库以及版本控制系统,Github目前拥有140多万开发者用户。随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法。
    如前所述,作为一个分布式的版本控制系统,在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
      GitHub可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。

      三、gitlab-基于Git的项目管理软件

      GitLab 是一个用于仓库管理系统的开源项目。使用Git作为代码管理工具,并在此基础上搭建起来的web服务。

    二、学习Git

      一、深入理解学习Git工作流

      深入理解学习Git工作流:http://www.cnblogs.com/xirongliu/p/4584653.html

      二、源码安装git指定版本

    wget https://github.com/git/git/archive/v2.19.1.zip
    unzip v2.19.1.zip
    cd git/git-2.19.1/
    #将其安装在“/usr/local/git”目录下,命令如下:
    make prefix=/usr/local/git all
    make prefix=/usr/local/git install
    echo "export PATH=/usr/local/git/bin:$PATH" >>/etc/profile
    tail -1 /etc/profile
    . /etc/profile
    git --version

      二、git命令

      1、git查看、添加、提交、找回,重置修改文件

     1 git help <command> # 显示command的help
     2 git show # 显示某次提交的内容 git show $id
     3 git co -- <file> # 抛弃工作区修改
     4 git co . # 抛弃工作区修改
     5 git add <file> # 将工作文件修改提交到本地暂存区
     6 git add . # 将所有修改过的工作文件提交暂存区
     7 git rm <file> # 从版本库中删除文件
     8 git rm <file> --cached # 从版本库中删除文件,但不删除文件
     9 git reset <file> # 从暂存区恢复到工作文件
    10 git reset -- . # 从暂存区恢复到工作文件
    11 git reset --hard # 恢复最近一次提交过的状态,即放弃上次提交后的所有本次修改
    12 git ci <file> git ci . git ci -a # 将git add, git rm和git ci等操作都合并在一起做 git ci -am "some comments"
    13          git ci -am "some comments"
    14 git ci --amend # 修改最后一次提交记录
    15 git commit -m #提交记录
    16 git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建次提交对象
    17 git revert HEAD # 恢复最后一次提交的状态
         1、git revert用法
    git revert 撤销 某次操作,此次操作之前和之后的commit和history都会保留,并且把这次撤销
    作为一次最新的提交
        * git revert HEAD                  撤销前一次 commit
        * git revert HEAD^               撤销前前一次 commit
        * git revert commit (比如:fa042ce57ebbe5bb9c8db709f719cec2c58ee7ff)撤销指定的版本,撤销也会作为一次提交进行保存。
    git revert是提交一个新的版本,将需要revert的版本的内容再反向修改回去,版本会递增,不影响之前提交的内容
        2、git revert 和 git reset的区别 
    1. git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。 
    2. 在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为git revert是用一次逆向的commit“中和”之前的提交,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset是之间把某些commit在某个branch上删除,因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。 
    3. git reset 是把HEAD向后移动了一下,而git revert是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
        3、git add -A 和 git add . 的区别

      git add .git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。

      不会提交新文件(untracked file)。(git add --update的缩写)

      git add -A :是上面两个功能的合集(git add --all的缩写)

      2、查看文件diff

    1 git diff <file> # 比较当前文件和暂存区文件差异 git diff
    2 git diff <id1> <id2> # 比较两次提交之间的差异
    3 git diff <branch1>..<branch2> # 在两个分支之间比较
    4 git diff --staged # 比较暂存区和版本库差异
    5 git diff --cached # 比较暂存区和版本库差异
    6 git diff --stat # 仅仅比较统计信息

      3、查看提交记录

    git log git log <file> # 查看该文件每次提交记录
    git log -p <file> # 查看每次详细修改内容的diff
    git log -p -2 # 查看最近两次详细修改内容的diff
    git reflog #查看所有操作记录 git log
    --stat #查看提交统计信息 tig Mac上可以使用tig代替diff和log,brew install tig

      4、远程仓库相关命令

    1 查看远程仓库:$ git remote -v
    2 添加远程仓库:$ git remote add [name] [url]
    3 删除远程仓库:$ git remote rm [name]
    4 修改远程仓库:$ git remote set-url --push[name][newUrl]
    5 拉取远程仓库:$ git pull [remoteName] [localBranchName]
    6 推送远程仓库:$ git push [remoteName] [localBranchName]

      5、Git 本地分支管理

        1、查看、切换、创建和删除分支
     1 git br -r # 查看远程分支
     2 git br <new_branch> # 创建新的分支
     3 git br -v # 查看各个分支最后提交信息
     4 git br --merged # 查看已经被合并到当前分支的分支
     5 git br --no-merged # 查看尚未被合并到当前分支的分支
     6 git co <branch> # 切换到某个分支
     7 git co -b <new_branch> # 创建新的分支,并且切换过去
     8 git co -b <new_branch> <branch> # 基于branch创建新的new_branch
     9 git co $id # 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
    10 git co $id -b <new_branch> # 把某次历史提交记录checkout出来,创建成一个分支
    11 git br -d <branch> # 删除某个分支
    12 git br -D <branch> # 强制删除某个分支 (未被合并的分支被删除的时候需要强制)
        2、分支合并和rebase
    git merge <branch> # 将branch分支合并到当前分支
    git merge origin/master --no-ff # 不要Fast-Foward合并,这样可以生成merge提交
    git rebase master <branch> # 将master rebase到branch,相当于: git co <branch> && git rebase master && git co master && git merge <branch>

      6、版本(tag)操作相关命令

    1 查看版本:$ git tag
    2 创建版本:$ git tag [name]
    3 删除版本:$ git tag -d [name]
    4 查看远程版本:$ git tag -r
    5 创建远程版本(本地版本push到远程):$ git push origin [name]
    6 删除远程版本:$ git push origin :refs/tags/[name]

      7、补丁管理

    1 git diff > ../sync.patch # 生成补丁
    2 git apply ../sync.patch # 打补丁
    3 git apply --check ../sync.patch #测试补丁能否成功

      8、暂存管理

    git stash # 暂存
    git stash list # 列所有stash
    git stash apply # 恢复暂存的内容
    git stash drop # 删除暂存区

      9、Git远程分支管理

     1 git pull # 抓取远程仓库所有分支更新并合并到本地
     2 git pull --no-ff # 抓取远程仓库所有分支更新并合并到本地,不要快进合并
     3 git fetch origin # 抓取远程仓库更新
     4 git merge origin/master # 将远程主分支合并到本地当前分支
     5 git co --track origin/branch # 跟踪某个远程分支创建相应的本地分支
     6 git co -b <local_branch> origin/<remote_branch> # 基于远程分支创建本地分支,功能同上
     7 git push # push所有分支
     8 git push origin master # 将本地主分支推到远程主分支
     9 git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
    10 git push origin <local_branch> # 创建远程分支, origin是远程仓库名
    11 git push origin <local_branch>:<remote_branch> # 创建远程分支
    12 git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支

      10、Git远程仓库管理

        1、GitHub或者gitlab仓库
    1 git remote -v # 查看远程服务器地址和仓库名称
    2 git remote show origin # 查看远程服务器仓库状态
    3 git remote add origin git@github:robbin/robbin_site.git # 添加远程仓库地址
    4 git remote set-url origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址(用于修改远程仓库地址) git remote rm <repository> # 删除远程仓库
        2、创建远程仓库
    git clone --bare robbin_site robbin_site.git # 用带版本的项目创建纯版本仓库
    scp -r my_project.git git@git.csdn.net:~ # 将纯仓库上传到服务器上
    mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库
    git remote add origin git@github.com:robbin/robbin_site.git # 设置远程仓库地址
    git push -u origin master # 客户端首次提交
    git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track
    git remote set-head origin master # 设置远程仓库的HEAD指向master分支
        3、命令设置跟踪远程库和本地库
    1 git branch --set-upstream master origin/master
    2 git branch --set-upstream develop origin/develop

      11、子模块(submodule)相关操作命令

        1、添加子模块
    ##git submodule add [url] [path]
    如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
        2、初始化子模块
    初始化子模块:$ git submodule init ----只在首次检出仓库时运行一次就行
        3、更新子模块
    更新子模块:$ git submodule update ----每次更新或切换分支后都需要运行一下
        4、删除子模块
    1)$ git rm --cached [path]
    2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
    3) 编辑“.git/config”文件,将子模块的相关配置节点删除掉
    4) 手动删除子模块残留的目录

      12、忽略一些文件、文件夹不提交

      在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如

    target
    bin
    *.db

      13、解决合并分支冲突的问题

    git checkout int 
    git pull
    git merge origin/master
    git push

      提交完代码,将冲突的部分去掉

       三、将代码从一个版本库推送到另一个版本库

      在实际的开发中,有可能遇到需要将A仓库的某个branch的代码独立成为一个新的仓库B。我们需要的不仅仅是这个branch的最新提交的代码,而是需要它的整个提交历史。这种需求对于git来说非常简单,主要依靠git remote命令来实现。

      1、把当前代码提交到另一个远程git仓库

      假如仓库repo_a当前位于branch_a,要求将branch_a的整个数据(包括提交历史)全部提取出来,并建立一个新的仓库repo_b。这里假设仓库repo_b已经被建立。
      git remote add基本语法如下。name和url是必须的。

    git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=<fetch|push>] <name> <url>
        1、将仓库repo_b的URL添加到工作仓库的remote。
    git remote add origin_repo_b git@server_ip:/path/repo_b.git

      (origin_repo_b:自己起的名字,只要不与现有的remote名重复即可)
      (git@server_ip:/path/repo_b.git:repo_b的远程路径)

        2、将代码推送到远程repo_b。
    git push origin_repo_b branch_a

      (origin_repo_b:远程仓库repo_b的名字)
      (branch_a:仓库repo_a的的branch_a分支)

        3、克隆仓库repo_b,检查是否push成功。
    git clone git@server_ip:/path/repo_b.git

      2、将一份相同的代码提交到多个不同的git托管服务器(多个git仓库)

      方法非常相似,多使用到了命令git remote set-url --add [--push] <name> <newurl>
      假设在远程的git服务器上又新增了一个仓库repo_c,现在要求repo_b、repo_c提交的代码必须一致。

        1、将远程repo_c配置到当前的工作的本地git仓库中
    git remote set-url --add origin_repo_b git@192.168.1.101:~/project/repo_c.git

      这句话的意思是,将远程仓库git@192.168.1.101:~/project/repo_c.git也加入到origin_repo_b这个名字下面管理

        2、将代码同时提交到远程仓库repo_b和远程仓库repo_c
    git push origin_repo_b branch_a
  • 相关阅读:
    c++Primer再学习(1)
    c++Primer再学习练习Todo
    感悟(一)
    新目标《C++程序设计原理与实践》
    C++Primer再学习(4)
    开篇
    C++Primer再学习(3)
    C++实现的单例模式的解惑
    使用springboot缓存图片
    springboot h2 database
  • 原文地址:https://www.cnblogs.com/happy-king/p/9253141.html
Copyright © 2011-2022 走看看