Git

分布式版本控制工具

  • 基本使用

    • 安装

      Git 官网直接下载安装程序,右键菜单中有 Git Bash 选项,点击弹出命令行窗口即安装成功

    • 初始配置

      $ git config --global user.name "Your Name"
      $ git config --global user.email "Your email"
      
    • 初始化仓库

      git init 设置当前目录为 Git 可以管理的仓库

    • 查看当前目录文件

      ls -ah

      • -ah 参数展示所有文件,包括隐藏文件,如果这个仓库为Git 管理的仓库,就可以看到一个被隐藏的文件 .git
    • 工作区,暂存区,版本库

      • git add file

        将工作区 file 的修改添加到暂存区

        git add file1 file2 可以添加多个文件

      • git reset

        git reset HEAD file 将暂存区文件的修改放回工作区

        git reset --hard HEAD^ 工作区回退到上一版本

        git reset --hard id 回退到 id 指定版本(就是用git log中的id,只用写前几位即可)

      • git commit

        将暂存区的修改全部提交到版本库

        • git commit -m 'add new file'

          -m 参数,给提交添加说明

      • git checkout -- file

        丢弃工作区该文件的修改(实际就是用版本库里的版本代替工作区版本)

      • 删除文件

        rm file

    • 调试命令

      • git diff

        查看工作区和版本库里面最新版本的区别

        git diff HEAD --file 指定文件

      • git status

        查看仓库当前状态

      • git log

        git log --graph --pretty=oneline --abbrev-commit 显示在一条直线上

        查看日志

        如果日志很长,则按 q 退出

      • git reflog

        记录每一次命令

  • 远程仓库

    找一台电脑充当服务器角色,每天24小时开机,其他每个人从这个"服务器"仓库克隆一份到自己电脑上,并各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交

    • GitHub

      GitHub 就是 Git 的一个远程仓库

      • 关联 GitHub 远程仓库

        本地仓库与 GitHub 仓库之间的传输是通过 SSH 加密的(将自己的公钥给 github , github 就能对你的每次提交进行身份认证)

        • 创建SSH Key

          用户目录看是否有 .ssh 文件夹,如果有,看目录下有没有 id_rsaid_rsa_pu,如果有则已经创建过了 SSH Key ,如果没有,打开 Git Bash,创建 SSH key

          ssh-keygen -t rsa -C "邮箱" --> 一路回车

        • 添加远程库

          git remote add origin git@github.com:buxiaoxing/learngit.git

          origin 就是 远程库的名字

        • 删除远程库

          git remote rm origin

        • 向远程库推送

          git push -u origin master

          第一次推送

          git push origin master

          以后推送

          :第一次推送报错 connection timedout 时,在密钥文件夹里创建 config 文件

        • 查看远程仓库信息

          git remote -v

        • 从远程库克隆

          git clone 仓库地址

          仓库地址有 https 和 git 地址,但 https 较慢

    • Gitee

      国内的 Git 托管服务,速度比 Github 快很多

      同样也是通过 SSH 密钥进行身份认证

      • 本地仓库可以添加多个远程仓库(名称要唯一)

        $ git remote -v
        gitee   git@gitee.com:buxiaoxing/learn-git.git (fetch)
        gitee   git@gitee.com:buxiaoxing/learn-git.git (push)
        origin  git@github.com:buxiaoxing/learngit.git (fetch)
        origin  git@github.com:buxiaoxing/learngit.git (push)
        
    • 搭建自己的 Git 服务器

      需要准备一台运行Linux的机器,强烈推荐用Ubuntu或Debian

      使用 gitblit 帮助建立 Git 服务器

  • 分支

    创建一个属于自己的分支,别人看不到,还继续在原来的分支上正常工作,你在自己的分支上干活。想提交就提交,知道开发完毕后,再一次性合并到原来的分支上,既安全又不影响别人工作

    • Git 上分支的实现

      • master --> 指向最新的提交

      • HEAD --> 指向当前分支

        一开始的时候,master 分支是一条线,Git 用 master 指向最新的提交,再用 HEAD 指向 master ,就能确定当前分支,以及当前分支的提交点

        创建一个分支 dev

        git branch dev

        切换到分支

        git checkout/switch dev

        创建并切换(等于前面两个命令)

        git checkout -b dev 或者 git checkout -c dev

        查看当前分支

        git branch

        dev 上进行一次新的提交后, dev 指针往前移动一步,而 master 指针不变

        dev 上的工作完成了,就可以把 dev 合并到 master 上,直接将 master 指向 dev 的提交就完成合并了

        合并分支

        git merge dev 合并指定分支到当前分支

        合并完成后,还可以将 dev 分支删除,就是将 dev 指针删除,我们就只剩下一条 master 分支

        删除分支

        git branch -d dev

    • 冲突

      • 如果两个分支对同一文件的同一地方都进行了修改,这个时候合并两个分支就会产生冲突

        这个时候就需要手动解决冲突

      • 修改后再提交,分支变化如图

      • 最后再将分支删除

      • 复制一个特定提交到当前分支

        git chery-pick <提交的id-->可以通过 git log 查看>

    • 禁止使用快速合并分支 Fast forward

      使用 Fast forward 模式,这种模式下,删除分支后,会丢掉分支信息,如果要强制禁用 Fast forward 模式,Git 就会在 merge 时生成一个新的 commit ,从历史信息就可以看出分支信息

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

      因为本次合并要创建一个新的 commit ,所以加上 -m 参数,把 commit 的描述写进去

      注:Fast forward 合并就只是将 master 的指针指向 dev,并没有提交操作,而禁用 Fast forward 就相当于 master 在自己分支上做了一次与 dev 上相同的提交

    • 工作现场'储藏'

      有时候我们在 dev 上的工作还没有完成,我们需要去其他分支工作,此时就可以将 dev 的工作现场 '储藏'起来

      • git stash 当前工作现场'储藏起来',以后可以恢复现场继续工作

        (不能追踪到没有 add 过的文件,所以在我们储藏工作现场时确保所有文件都是 add 过的)

      • git stash list 查看工作现场储藏位置

      • git stash apply 恢复 stash 中的内容,但 stash 中的内容不删除

        git stash apply stash@{0} 恢复指定 stash

      • git stash pop 恢复的同时删除 stash 的内容

    • 多人协作(远程仓库分支管理)

      • git remote -v

        显示远程仓库详细信息

        $ git remote -v
        origin  git@github.com:buxiaoxing/learngit.git (fetch)
        origin  git@github.com:buxiaoxing/learngit.git (push)
        

        fetch:抓取仓库

        push:推送仓库

      • 推送冲突

        1. git pull

          拉取远程仓库最新修改

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

        2. 最新修改与本地修改有冲突,则手动修改

        3. 没有冲突或解决冲突后,再用 git push origin dev 推送

    • Rebase

      挪动本地提交位置,把分叉的提交历史“整理”成一条直线,看上去更直观

      git rebase

  • 标签

    发布一个版本时,我们通常现在版本库中打一个标签(tag),这样就唯一确定了打标签时刻的版本,通过 commit 号也可以唯一标识,但 commit 号不便于记忆

    • git tag <tagname>

      git tag v1.0

      默认标签是打到最新提交的 commit 上的

    • git tag <tagname> <commit id>

      将标签打到指定 commit 上

      git tag -a v0.1 -m 'version 0.1 released' 1094adb

      -a 参数指定标签名

      -m 参数指定说明文字

    • git tag

      查看所有标签

    • git show <tagname>

      查看标签具体信息

    • git tag -d <tagname>

      删除一个标签

    • git push origin <tagname>

      创建的标签都只会存储到本地,不会自动推送到远程,所以打错的标签可以在本地安全删除

      将标签推送到远程

      git push origin --tags

      一次性推送全部尚未推送到远程的本地标签

    • 删除远程标签

      git tag -a v0.9 先删除本地的标签

      git push origin :refs/tags/v0.9 删除远程标签

  • 自定义 Git

    • 忽略特殊文件

      有些时候必须把某些文件放在 Git 工作目录中,但又不能提交他们,比如保存了数据库密码的配置文件,但每次 git status 都会显示 Untracked file …… ,看起来不舒服

      可以在Git工作区的根目录下创建一个特殊的 .gitignore 文件,然后把要忽略的文件名填进去

      # Windows:
      Thumbs.db
      ehthumbs.db
      Desktop.ini
      
      # Python:
      *.py[cod]
      *.so
      *.egg
      *.egg-info
      dist
      build
      
      # My configurations:
      db.ini
      deploy_key_rsa
      

      最后再将 .gitignore 文件提交到 Git

    • 配置别名

      给命令配置别名

      buxiaoxing@buxiaoxing-PC MINGW64 /f/工具/git/git repository (master)
      $ git config --global alias.st status
      
      buxiaoxing@buxiaoxing-PC MINGW64 /f/工具/git/git repository (master)
      $ git st
      On branch master
      Your branch is up to date with 'gitee/master'.
      
      nothing to commit, working tree clean
      
      
    • 配置文件

      • 配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。

      • 配置文件放哪了?每个仓库的Git配置文件都放在.git/config文件中:

原文地址:https://www.cnblogs.com/angle-yan/p/13650711.html