git

1. concept

  • Workspace:工作区(clone或者原始内容)

  • Index/Stage:暂存区(有增删改查后add到临时区)

  • Repository:本地仓库(保存了本地的增删改查记录)

  • Remote:远程仓库(本地的记录提交到远端,供团队所有人查看使用)

2. git核心对象(tree、blob、commit)

  • git cat-file [-t|-p] id //t是type p是内容

3. note

  1. 分离头指针一定要跟branch或tag绑在一起,否则会丢掉 git checkout commit-SHA

  2. if meet unnormal

  3. git help [--web] command

  4. gitk --all

  5. git 中部分选项解释

  6. how to write git comment

add / feature 添加新功能 fix 缺陷修复 hotfix 紧急的缺陷修复 update 对已有功能进行更改或优化 remove / rm / delete 删除部分代码、功能 refactor. 重构了一些代码、功能 workflow 工作流程更改 chore 琐碎的修改

4. config

5. init

6. status

7. add/rm file

8. commit

9. branch

10. merge

11. rebase

rebase过程中,也许会出现conflict

  • git会停止rebase,需要解决冲突

  • 解决完,使用git add添加冲突的文件,更新暂存区

  • git rebase --continue继续剩下的rebase

  • git rebase --abort终止rebase行为,回到rebase开始之前的状态

12. diff

13. log

14. remote sync

15. 撤销

16. .gitignore

  • 空行 或 # 开头的行会被忽略

  • 可以使用标准的glob模式匹配

    • 0个或任意个字符

    • [abc] 任意其中一个字符

    • ? 匹配一个字符

    • [0-9] 表示匹配任意中间的字符

    • ** 两个星表示任意中间目录 a/**/c a/b/c a/d/c

  • 以/开头防止递归

  • 以/结尾指定目录

  • 用!反向选择

17. alias

18. tags

19. stash

默认情况下,git stash会缓存: 添加到暂存区的修改(staged changes ) Git跟踪但并未添加到暂存区的修改(unstaged changes) 但不会缓存: 在工作目录中新的文件(untracked files) 被忽略的文件(ignored files) 此时,使用-u或者--include-untracked可以stash untracked文件;使用-a或者--all可以stash当前目录下的所有修改(慎用)

20. Merge vs Rebase

merge

rebase

21. Reset、Revert、 Checkout

  • reset和checkout可以作用于commit或者文件,revert只能作用于commit

  • reset 将一个分支的末端指向另一个提交,可以用来移除当前分支的一些提交

    • --soft:stage和workspace都不会被改变

    • --mixed(默认):stage和你指定的提交同步,但workspace不受影响

    • --hard:stage和workspace都同步到你指定的提交

  • checkout 提交层面上的checkout可以切换分支,同一分支,可以切换当前HEAD。文件层面上不会移动HEAD指针,也不会切换到其他分支上,只是更改workspace,而不是stage

  • revert 撤销一个提交的同时会创建一个新的提交

命令
作用域
常用情景

git reset

提交层面

在私有分支上舍弃一些没有提交的更改

git reset

文件层面

将文件从缓存区中移除

git checkout

提交层面

切换分支或查看旧版本

git checkout

文件层面

舍弃工作目录中的更改

git revert

提交层面

在公共分支上回滚更改

git revert

文件层面

(然而并没有)

Reset、Revert、 Checkout

reset和checkout可以作用于commit或者文件,revert只能作用于commit

commit级别的操作

reset

git reset用于撤销未被提交到remote的改动,即撤销local的修改。除了移动当前分支的HEAD,还可以更改workspace和index:

  • --soft:修改HEAD,不修改index和workspace

  • --mixed:修改HEAD和index,不修改workspace。默认行为

  • --hard:修改HEAD、index、workspace

checkout

checkout作用于commit级别时,只是移动HEAD到不同的commit。如果有unstaged的文件,git会阻止操作并提示。如果使用commit-SHA作为参数,可能会导致野指针

revert

revert通过新建一个commit来撤销一次commit所做的修改,是一种安全的方式,并没有修改commit history

revert用于撤销committed changes,reset用于撤销uncommitted changes

file级别的操作

reset

git reset 只修改index去匹配某次commit

git reset HEAD filename把文件从index退回workspace,并将更改保存在workspace中

checkout

git checkout 只修改workspace去匹配某次commit

git checkout HEAD filename抹掉文件在workspace的修改

总结

Command
Scope
Common use cases

git reset

Commit-level

Discard commits in a private beanch or throw away uncommited changes

git reset

File-level

Unstage a file

git checkout

Commit-level

Switch between branches or inspect old snapshots

git checkout

File-level

Discord changes in the working directory

git revert

Commit-level

Undo cimmits in a pulic branch

git revert

File-level

N/A

22. 搭建Git服务器

其实就是搭建私有仓库,推荐使用Linux服务器如Ubuntu或Debian,假设你有sudo权限的账号

  1. sudo apt-get install git # 安装Git

  2. sudo adduser git # 创建一个Git用户,用来运行Git服务

  3. 创建证书登录:# 收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个

  4. 初始化Git仓库 # 先选定一个目录作为Git仓库,在该目录下输入命令(比如目录:/srv): sudo git init --bare sample.git sudo chown -R git:git sample.git

  5. 禁用shell登录,通过编辑/etc/passwd文件完成 git1001:1001:,,,:/home/git:/bin/bash 改为: git1001:1001:,,,:/home/git:/usr/bin/git-shell

  6. 克隆远程仓库: git clone git@server:/srv/sample.git

23. resolve git clone too slow

Last updated