常用git命令详解

Posted by Cycle263 on September 2, 2017

Git

Git是目前世界上最常见的分布式版本控制系统,另外还有CVS、SVN等集中式控制系统。

  • 集中式 vs 分布式

    集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。

    分布式版本控制系统可以没有“中央服务器”,每个人的电脑上都是一个完整的版本库,安全性要高很多。分布式版本控制系统通常会把一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

  • 版本库

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  • 初始化

    初始化一个Git仓库,使用git init命令。

    添加文件到Git仓库,分两步:

    • 一、使用命令git add <file>,注意,可反复多次使用,添加多个文件;

    • 二、使用命令git commit -m <message>,完成。

  • 工作区和暂存区

    工作区,就是在电脑里能看到的目录,工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

    git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

git 命令详解

  • git 初始化配置

    • 配置用户和email(全局配置,影响所有的git项目,不加–global则只影响本git项目)
      git config --global user.name "用户名"
      git config --global user.email "Email" git config --local user.email "Email" // 修改本项目的email配置 git config --global push.default simple // 修改全局配置中push的默认方式

    • 查看所有的配置
      git config --list

    • push提示log中有不符合规定的邮箱 撤销不符合规定的commitid,或者还原后重新commit,方能push到远端

  • git 克隆源码

    • 克隆代码
      git clone git@github.com:username/repository.git
      git clone https://username:password@github.com/username/repository.git

    • 抓取代码
      git fetch 远端抓取代码
      git pull 远程抓取并合并,相当于git fetch和git merge两步
      git pull origin branch-name 抓取指定分支代码

  • git 提交源码

    • 添加改动到本地库
      git add . 或者 git add -file file: 文件的完整路径名称

    • 查看改动状态
      git status

    • 提交改动
      git commit [-a] -m "message" message: 提交记录信息
      git commit -am "message" 相当于git add . + commit 可选参数 -a: 表示保护内容修改和增删

    • 同步到服务端
      git push 指定了分支,可省略后面参数
      可选参数 -f: 表示强制覆盖
      git push origin HEAD:<name-of-remote-branch> 或者 git push origin lbranch-1:refs/rbranch-1 // 将当前分支推送到源存储库中的远程引用匹配主机。 这种形式方便推送当前分支,而不考虑其本地名称。 git push origin branch-name 不存在的远端分支:git push origin localBranch:remoteBranch

  • git 合并代码

    • 合并任意分支的commitId
      git merge commitId 合并分支中某一提交记录
  • git 比较代码

    • 比较分支的差异
      git diff master develop 比较master分支和develop分支的差异

    • 查看修改内容
      git diff 查看详细修改内容
      git show 显示某次提交的内容

    • 比较缓存区和上次提交差异
      git diff --cached 比较上次提交和git add后的缓存的文件差距

  • git 撤销操作

    • 回滚提交 git reset <file> 某个文件索引会回滚到最后一次提交, C → B, 也即是重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
      git reset --hard [commit] 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
      git reset [commit] 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
      git checkout . 恢复暂存区的所有文件到工作区
      git checkout [commit] [file] 恢复某个commit的指定文件到暂存区和工作区
      git checkout [file] 恢复暂存区的指定文件到工作区
      git reset --hard 重置暂存区与工作区,与上一次commit保持一致
      git reset --hard origin/master 重置暂存区和工作区,与远端master保持一致,包括版本号 git reset --hard HEAD^ 回滚到上一个版本 git reset --hard HEAD^^ 回滚到上上个版本

    • 暂存数据 – (暂存本地修改,工作区还原到上次提交)

      git stash 暂存工作区代码到本地栈 git stash apply ${0} 恢复栈内最近暂存的数据到工作区 git stash pop 恢复最近暂存

  • git 分支管理

    • 新建分支
      git branch branch-new-name 新建分支
      git checkout -b branch origin/new-name 切换分支,新建一个branch的本地分支,并且依赖于远端origin库的new_name分支,不存在就新建分支
      git checkout -b [分支名] [远程名]/[分支名]

    • 切换分支 git checkout branch-name 切换到已经存在的分支 git checkout -b branch origin/new-name 新建本地分支并映射到对应的远端分支

    • 跟踪分支(依赖分支) git branch --track develop origin/develop 新建一个tracking指向远端develop git branch --set-upstream-to=origin/<branch> [develop] 将已经存在的分支指向远端,push/pull不用指向远端了,直接连接指定的远端分支 或者 git branch --set-upstream master origin/master git branch --set-upstream-to origin/master git push -u origin develop 这个操作在push的同时会指定当前分支的upstream。

      git中存在upstream和downstream,简言之,当我们把本地仓库A中某分支x的代码push到远端仓库B分支y,此时仓库B的这个分支y就叫做A中x分支的upstream,而x则被称作y的downstream,这是一个相对关系,每一个本地分支都相对地可以有一个远程的upstream分支(注意这个upstream分支可以不同名,但通常我们都会使用同名分支作为upstream)。

    • 删除分支 git push origin :develop 删除远端分支develop git checkout -d/-D develop 删除本地分支develop git checkout -d/-D -r origin/develop 删除一个tracking的远端branch, 并未push

    • 查看HEAD指向分支 cat .git/HEAD 或者 git show-ref

git文件的三种状态

  • 已修改(modified)
    已经修改了工作区的某些文件。

  • 已暂存(staged)
    已经执行了add操作,但还没有提交,只是暂存在提交清单里。

  • 已提交(commited)
    已经提交到本地仓库里,但还没push到远端仓库。

git状态

git config –global push.default详解

  • 1.nothing 不推送任何东西并有错误提示,除非明确指定分支引用规格。强制使用分支引用规格来避免可能潜在的错误。

  • 2.current 推送当前分支到接收端名字相同的分支,在远程同名分支不存在的情况下自动创建同名分支

  • 3.upstream 推送当前分支到上游@{upstream}。这个模式只适用于推送到与拉取数据相同的仓库,比如中央工作仓库流程模式。

  • 4.simple 在中央仓库工作流程模式下,拒绝推送到上游与本地分支名字不同的分支。也就是只有本地分支名和上游分支名字一致才可以推送,就算是推送到不是拉取数据的远程仓库,只要名字相同也是可以的。在GIT 2.0中,simple将会是push.default的默认值。simple只会推送本地当前分支。

  • 5.matching 推送本地仓库和远程仓库所有名字相同的分支。这是git 1.x版本的缺省值,执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。

  • 配置push.default的命令如下:

`git config --global push.default simple`