0%

9-git指令

git指令

总结自Git教程-廖雪峰的官方网站

(1)安装git

  1. 自报家门:你的名字和Email地址
    1
    2
    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"

(2)创建版本库

  1. 把pwd当前这个目录变成Git可以管理的仓库

    1
    $ git init
  2. 将文件提交至暂存区/缓冲区

    1
    $ git add filename

    一下子提交当前所有文件至缓冲区

    1
    $ git add .
  3. 将暂存区/缓冲区所有文件提交至当前分支/归档区

    1
    $ git commit

    带有注释的提交

    1
    $ git commit -m "description"

(3)时光机穿梭

  1. 查看当前仓库的状态

    1
    $ git status
  2. 查看对应文件自己与之前的改动

    1
    $ git diff filename

(3.1)版本回退

  1. 显示从最近到最远的提交日志
    1
    $ git log [--graph] [--pretty=oneline] [--abbrev-commit]
  • --graph像图形一样展示
  • --pretty=oneline可以将每个提交版本压缩到一行显示
  • --abbrev-commit只显示版本号的前几位,不完整显示完
  • HEAD指向是当前所在分支的位置
  • origin/brachname则是对应远程仓库分支的所在位置

较完整的日志

1
$ git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

  1. 版本号

HEAD表示当前版本
HEAD^表示上一个版本
HEAD^^表示上上个版本
HEAD~100表示上100个版本,没数字则默认1
HEAD^2表示第二个上一个版本(多个父节点情况)
commit-id是一串较长的哈希字符串,命令时可以只输入前几位,也可以输完整
切换到对应版本号

1
$ git checkout versionNum

  1. 查看历史执行过的命令

    1
    $ git reflog
  2. 回退版本

    1
    $ git reset [--soft | --mixed | --hard] [HEAD | commit-id] versionnum
  • 这种回退只对自己可见
  • --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
  • --soft 参数用于回退到某个版本
  • --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交

回退版本并分享给他人,本质上是再一次提交,但是是通过提交旧版本覆盖当前版本的方式

1
$ git revert versionnmum

(3.2)工作区和暂存区

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区(缓冲区):英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 当前分支/归档区:
  • 版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

(3.3)管理修改

  • Git跟踪并管理的是修改,而非文件
  • 每次修改,如果不用add到暂存区,那就不会加入到commit

(3.4)撤销修改

  1. 丢弃工作区的修改
    1
    $ git checkout -- filename
  • 一种是filename自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  • 一种是filename已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
  • 总之,就是让这个文件回到最近一次git commitgit add时的状态。
  1. 把暂存区的修改撤销掉,将文件放回至工作区
    1
    git reset HEAD filename

(3.5)删除文件

  1. 删除工作区文件
    1
    $ rm filename
  • 但如果filename已经提交至暂存区add且提交commit,将工作区文件删除后,工作区和版本库就不一致了,用git status可以查看差别。
  • 现在有两种选择:一是确实要从版本库中删除该文件;二是从版本库中恢复文件至工作区
  1. 从版本库中删除该文件

    1
    $ git rm filename

    且要提交至分支

    1
    $ git commit -m "description"

    至此文件就从版本库中删除,工作区暂存区版本库保持一致

  2. 从版本库中恢复文件至工作区

    1
    $ git checkout -- filename
  • git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
  • 但是从来没有被添加到版本库就被删除的文件,是无法恢复的

(4)远程仓库

(4.1)添加远程仓库

  1. 本地仓库关联至远端仓库
    1
    $ git remote add origin xxxxxxxxxxxx.git
  • 添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的
    1
    $ git remote [ -v | add | remove | rm]
  1. 本地库的内容推送到远程仓库
    1
    $ git push [-u] origin master
  • remote关联后,第一次推送带上-u,可以将当前本地分支与远端分支关联起来,后面执行命令可以简化,之后推送就不用带上-u
  • origin是远程仓库的在remote自定义的名字
  • master是要推送到远程仓库的某一个分支
  • 推送过去的分支则是当前所在分支

(4.2)从远程库克隆

  1. 从远程库克隆一个仓库到本地
    1
    $ git clone xxxxxxxxxxxx.git
  • clone支持ssh和http

(5)分支管理

(5.1)创建与合并分支

  • 每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支
  • 一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点
  • 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长
  1. 创建分支
    1
    $ git branch branchname
  2. 切换分支
    1
    2
    $ git checkout branchname
    $ git switch branchname

将某分支移动到某个版本号

1
$ git branch -f branchname versionNum

  1. 创建并直接切换至分支

    1
    2
    $ git checkout -b branchname
    $ git switch -c branchname

    等价于19+20的命令

  2. 查看当前所有分支

    1
    $ git branch
  • 会列出所有分支,当前所在分支前面会标一个*号。
  1. 合并指定分支到当前分支

    1
    $ git merge branchname
  2. 删除分支

    1
    $ git branch -d branchname

(5.2)解决冲突

当不同的分支对同一个文件做出了不同的修改,导致merge时发生冲突,可通过git status查看发生冲突的的文件,此时merge的快速合并会失效,需要手动打开文件解决冲突

(5.3)分支管理策略

  • 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。
  • 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
  1. 禁用Fast forward后的合并分支
    1
    $ git merge --no-ff -m "description" branchname

(5.4)Bug分支

  1. 当前工作现场“储藏”起来,等以后恢复现场后继续工作

    1
    $ git stash
  2. 查看储存的工作现场列表

    1
    $ git stash list
  3. 从列表中恢复现场

    1
    $ git stash apply stash-id
  4. 从列表中删除现场

    1
    $ git stash drop stash-id
  5. 从列表中提取第一个现场恢复,并删除

    1
    $ git stash pop
  6. 复制一个特定的提交到当前分支

    1
    $ git cherry-pick commit-id

(5.5)Feature分支

  1. 删除一个没有合并过的分支(强制删除)
    1
    $ git branch -D branchname

(5.6)多人协作

  1. 查看远端仓库信息

    1
    $ git remote

    显示更详细信息

    1
    $ git remote -v
  2. 创建一个远端仓库已有的分支并切换到该分支

    1
    $ git checkout -b branchname origin/origin_branchname
  • origin是对应远端仓库的自定义名字
  • origin_branchname是对应的远端仓库的分支名
  • branchname是指在本地创建的分支名
  • 该操作会把远程仓库originorigin_branchname分支的内容给复制到本地的branchname分支上,并切换到branchname分支上
  1. 指定本地分支与远端仓库分支的链接

    1
    $ git branch --set-upstream-to=origin/origin_branchname branchname
  2. 从远端仓库的分支拉取下最新的提交合并到本地分支

    1
    $ git pull
  • 拉取内容首先要想35一样建立链接,git pull==git fetch + git merge

从远端仓库的分支拉下最新的提交,并将当前提交合并到拉下的分支

1
$ git pull --rebase

  • 等价于git fetch + git rebase

从远端仓库的分支拉取下最新的提交,但并不与本地分支合并,只是单纯的下载

1
$ git fetch

(5.7)Rebase

  1. 把当前分支的内容直接复制到别的分支上,并切换到对应的分支的新版本
    1
    $ git rebase branchname

指定a分支复制到别的b分支上

1
$ git rebase b_branchname a_branchname

回退到某一版本,并通过图形化界面修改,回退到的版本后面所有版本的提交内容、提交顺序,并以拷贝重组形式,重新在回退的版本后面重新提交

1
$ git rebase -i versionname

(6)标签管理

  • 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本,即tag是和commit-id是捆绑的
  • 将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。

(6.1)创建标签

  1. 创建新标签
    1
    $ git tag tagname [tagname]
  • 默认标签是打在最新提交的commit上的
  1. 在对应的版本号上打标签
    1
    $ git tag -a tagname [-m "description"] commit-id
  • -a指定标签名
  • -m则添加描述
  1. 查看所有标签

    1
    $ git tag
  2. 查看标签信息

    1
    $ git show tagname

(6.2)操作标签

  1. 删除标签

    1
    $ git tag -d tagname
  2. 推送某个标签至远程仓库

    1
    $ git push origin tagname
  3. 一次性推送全部尚未推送到远程的本地标签

    1
    $ git push origin --tags
  4. 标签已经推送到远程下,要删除远程标签

    1
    2
    $ git tag -d tagname
    $ git push origin :refs/tags/tagname

(7)使用Github

(8)使用Gitee

(9)自定义Git

(9.1)忽略特殊文件

  • 忽略某些文件时,需要编写.gitignore
  • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理

(9.2)配置别名

  1. 配置对应命令别名
    1
    $ git config --global alias.mini_order order
  • 删除别名:别名就在配置文件中的[alias]后面,要删除别名,直接把对应的行删掉即可。
  1. 配置文件
  • 每个仓库的Git配置文件都放在.git/config文件
  • --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用
  • 配置Git的时候,加上—global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
  • 而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中