avatar

目录
Git

0. 基础

  • add

    • git add a

      all,添加被修改(modified)、被删除(deleted)、新文件(new)到暂存区

    • git add u

      update,添加被修改(modified)和被删除(deleted)文件,不包括新文件(new)

    • git add .

      添加新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件

  • commit

    • git commit -m "版本信息"

      提交暂存区到版本库并带上版本信息

    • git commit -m "消息" --amend

      改善提交,即修改代码或修改版本信息后,再提交hash不变,不会产生新的Commit

  • git init

    本地初始化一个git仓库

1. 查看

  • git log

    显示所有的提交记录(包括hash, 作者信息,提交消息和时间),按q退出

  • git reflog

    可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)

  • git status

    显示工作路径下文件的状态,如未追踪、已修改、已删除等

  • git diff

    详细显示每个追踪的文件和上次commit的版本的不同之处

2. 恢复

  • git reset <Commit标识>

    1584369064272

    1584351279780

  • git reset --mix(默认)

    变动:

    • 保留工作区变动
    • 把暂存区放到工作区
    • 当前Commit和要回退到的Commit的差异放到工作区
    • 将HEAD直接指向要回退到的Commit

    使用场景:

    • 执行命令后,再 add -all 一次,再commit一次,达到合并一连串的Commit成一个新的Commit的效果
    • reset HEAD 清空暂存区内容
  • git reset --hard

    变动:

    • 清空工作区的变动
    • 清空暂存区
    • 将HEAD直接指向要回退到的Commit

    使用场景:

    • 放弃工作区所有修改,包括暂存区(使用restore并不能清空该区),直接回退到上一个Commit
    • 把回退到某个Commit后的Commit全部删除
  • git reset --soft

    变动:

    • 保留工作区得变动
    • 保留暂存区,
    • 把当前Commit和要回退到的Commit的差异放到暂存区
    • 将HEAD直接指向要回退到的Commit

    使用场景:

    • 如过reset后直接再commit,相当于合并一连串的Commit成一个新的Commit
  • git revert <Commit标识>

    1584351650872

    1584351560580

  • git restore

    丢弃工作区当前修改,回退到最近一次 add或commit

3. 删除

  • git remove

    删除文件

  • git remove -f

    强制删除文件

  • git remove --cache

    是文件从暂存区删除并脱管

4. 分支

  • 创建分支

    git branch "分支名"

    只是在当前分支上添加一个新的指针,并不会复制一份Commit

    1584369245606

    1584347641089

  • 切换分支

    git checkout <分支名> 或新版 git switch <分支名>

    切换分支相当于把HEAD指向要切换的分支,原来HEAD指向master,切换后如图

    1584348362100

  • 创建分支的同时切换到新创建的分支

    git checkout -b <分支名>

  • 查看所有分支

    git branch

  • 删除分支

    • 删除本地分支

      git branch -d <分支>

    • 删除远程分支

      get push origin :远程分支名 相当于把本地的空分支推送到了远程分支

      1584367100163
      1584367120799

  • 合并别的分支到当前分支

    git merge <别的分支>

    1584369563498

    1584348599051

  • 将父分支合并到子分支

    只是简单的将父分支指向子分支,因为子分支已经包含父分支所有内容

    1584369618343

    1584348780013

  • 移动当前分支到别的分支(变基)

    git rebase <别的分支>

    1584369664703

    1584349136447

  • 可视化移动分支和删除分支

    git rebase -i <Commit的标识> 如:git rebase -i c3 可以可视化操作c5、c4,不包含c3

    1584352343533

    1584352604421

  • 把别的Commit捡到当前分支

    git cherry-pick <别的Commit标识>

    1584352094201

    1584352138435

  • 把分支指向别的Commit

    git branch -f <要操作的分支> <别的Commit标识>

    如 master 分支本来指向 c4,执行命令后如图

    1584351066436

5. 标签

  • 创建标签

    git tag <标签名> <Commit标识>

    1584354974027

    1584354953156

  • 获取某个Commit距离最近的标签

    git describe <某个Commit的标识>

    返回结果格式:标签名_离Commit的距离_g当前Commit的哈希值

6. 获取

  • 拷贝远程仓库全部分支到本地

    git clone ssh://user@domain.com/repo.git

    o代表远程仓库名master代表分支名,git clone 时默认远程仓库名为origin

    1584357210040

    不能直接切换到远程仓库分支,然后commit远程分支,只能commit和远程分支绑定的本地分支

    1584357628332

    1584357577011

  • 把远程所有分支的变动下载到本地

    git fetch ssh://user@domain.com/repo.git 但不会修改我们的本地分支

    1584358090231

    1584358120402

    1584358197473

    1584358243698

  • 把本地的某个分支在远程的变动下载到本地

    git fetch origin <本地分支> 但不会更新本地分支

    1584366392769

    1584366407243

  • 把远程的某个Commit下载到本地,并同步更新本地分支到下载下来的

    git fetch origin <远程Commit标识>:<本地其他分支> 本地分支不存在会自动创建

    1584366536780

    1584366555811

  • git pull

    相当于git fetch远程分支之后再git merge远程分支到相应的本地分支

    1584370056019

    1584358493459

  • git pull --rebase

    相当于git fetch远程分支之后再git rebase本地分支到远程分支

    一般用来解决:当我们push我们的分支到远程仓库时由于该分支在远程仓库已经被别人更新过,我们要先把远程分支fetch到本地,再把本地分支rebase之后才能push

    1584362751688

    1584362772889

  • git pull origin 远程分支

    拉取远程的某个分支,并把拉取的分支merge到当前分支

    1584367640426

    1584367652888

  • pull远程的某个分支到本地某个分支,然后将pull的分支merge到当前分支

    git pull orgin <远程分支>:<本地分支> 本地分支不存在会自动创建

    1584368746888

    1584368767657

7. 推送

  • 推送当前分支到远程仓库

    git push

    1584358898498

    1584358913580

  • 推送本地某个分支到远程仓库

    git push origin 本地分支 orgin是默认的远程仓库名

  • 推送本地的某个Commit到远程仓库的某一个分支

    git push origin <Commit标识>:<远程仓库分支> 远程仓库分支不存在会自动创建

    1584365945616

    1584365961949

8. 远程追踪

  • 将本地的某个分支追踪到其他远程分支

    git checkout -b 本地分支 origin/远程分支 即本地分支和远程分支不再是默认的绑定状态

    1584364604772

    1584364682997

  • 将远程分支绑定到其他本地分支

    git branch -u origin/远程分支名 本地分支名

    1584364885909

    1584364904218

9. 引用一个Commit的方式

  • HASH

  • 分支

  • 标签

  • HEAD(*)

    HEAD 总是指向当前分支上最近一次提交记录。即如果commit产生新的提交记录的话,HEAD指向也会跟着变

    分离HEAD,使HEAD不再指向最近一次提交记录,使用的命令是git checkout <Commit的标识>

    即HEAD可以不指向分支,而是直接指向Commit

    1584370170520

    1584350172707

  • n个^

    n是数字,表示某个Commit的前n级

    1584370257945

    1584350615389

  • ^n

    n是数字,表示父级同一级时,按提交时间排序第几个父提交

    1584370564885

    1584356570066

  • ~n

    n是数字,表示某个Commit的前n级

    1584370322102

    1584350816614

文章作者: Juchia Lu
文章链接: https://juchia.com/2018/10/18/Git/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Juchia