Skip to content
新文件: unix/emacs_ui.png authored by Chan Chung kwong's avatar Chan Chung kwong
	修改:     unix/git.md
...@@ -119,12 +119,36 @@ git commit ...@@ -119,12 +119,36 @@ git commit
想知道提交,可用`git log`或者GUI的`gitk` 想知道提交,可用`git log`或者GUI的`gitk`
## 分支
分支用于表示一个发展方向。一种常见用法是维持一个主分支,然后每开发一个特性或补丁时创建一个特性分支,在分支中进行开发,直到足够稳定时才把成果合并回主分支。Git中的分支实际上为指向提交的指针,每当提交时当前分支就指向最新的提交。由于Git中分支操作代价很低,需要时尽管用。
```
git branch
```
可以列出所有分支,并标注当前分支。
要创建分支用命令`git branch <分支名>`,要删除分支则用命令`git branch -d <分支名>`
要切换当前分支,用`git checkout <分支名>`。要把一个分支的变化合并到当前分支,用`git merge <分支名>`
## 标签
有时分支在个别时间点(例如发布时)上的状态特别重要,于是我们会想给它一个名字以方便引用。这时可用`git tag -a <标签名> [-m <说明>]`
`git tag`可列出已有标签的名字。
## 远程仓库 ## 远程仓库
如果通过`git clone`创建仓库,则应有远程仓库origin。如果要增加远程仓库,可用`git remote add ` 如果通过`git clone`创建仓库,则应有远程仓库origin。如果要增加远程仓库,可用`git remote add <远程仓库名字> <URL> `
想列出当前的远程仓库,用`git remote -v` 想列出当前的远程仓库,用`git remote -v`
要把远程仓库的重新拉取回来,可用`git fetch [<远程仓库名字>]`,用`git pull [<远程仓库名字>]`进一步把更新合并到当前分支。
相反要把本地更新推给远程仓库,可用`git pull [<远程仓库名字>] [<分支>]`。不过,你需要有写权限。
# 主要命令概述 # 主要命令概述
命令|用途 命令|用途
...@@ -181,13 +205,48 @@ git commit ...@@ -181,13 +205,48 @@ git commit
`git stash`|记录当前工作树 `git stash`|记录当前工作树
`git status [<pathspec>...]`|显示工作树状态(HEAD与暂存区间变化,暂存区与工作树间变化) `git status [<pathspec>...]`|显示工作树状态(HEAD与暂存区间变化,暂存区与工作树间变化)
`git submodule`|管理子模块 `git submodule`|管理子模块
`git tag [-f] [-m <msg> | -F <file>] <tagname> [<commit> | <object>]`|增加标签 `git tag [-a] [-f] [-m <msg> | -F <file>] <tagname> [<commit> | <object>]`|增加标签
`git tag -d <tagname>...`|删除标签 `git tag -d <tagname>...`|删除标签
`git tag [-n[<num>]] -l [<pattern>...]`|列出标签 `git tag [-n[<num>]] -l [<pattern>...]`|列出标签
`git worktree`|支持多工作树 `git worktree`|支持多工作树
`gitk`|图形化的Git仓库浏览器 `gitk`|图形化的Git仓库浏览器
其中各种对象可用以下方式表示:
- SHA-1值的十六进制字符串表示的前面若干个字符(不必全部40个,只要不引起歧义)
- `git describe`的输出
- 符号引用名字`<refname>`,它会依次查找:
1. `$GIT_DIR/<refname>`(如`HEAD`、`FETCH_HEAD`、`ORIG_HEAD`、`MERGE_HEAD`、`CHERRY_PICK_HEAD`);
2. `refs/<refname>`
3. `refs/tags/<refname>`
4. `refs/heads/<refname>`
5. `refs/remotes/<refname>`
6. `refs/remotes/<refname>/HEAD`
- `@`相当于`HEAD`
- `<refname>@{<date>}`表示提交`<refname>`之前某时间的提交,其中`<date>`形如`yesterday`、`1 month 2 weeks 3 days 1 hour 1 second ago`或`1979-02-26 18:30:00`
- `<refname>@{<n>}`,表示提交`<refname>`之前每n个提交
- `@{<n>}`相当于`<当前分支>@{<date>}`
- `@{-<n>}`表示此前检出的第n个提交
- `<branchname>@{upstream}`表示指定分支或当前分支的上游
- `<branchname>@{push}`表示指定分支或当前分支的默认推入的远程分支
- `<rev>^`表示提交`<rev>`的第一个前驱
- `<rev>^{n}`表示提交`<rev>`的第n个前驱
- `<rev>~<n>`表示提交`<rev>`的第n代祖先,每代都选首个前驱
- `<rev>^{<type>}`表示把`<rev>`看作指定类型(否则不断解引用),如commit、tree、object或tag
- `<rev>^{}`表示标签`<rev>`
- `<rev>^{/<text>}`表示`<rev>`的祖先中最近提交信息有子串匹配正则表达式`<text>`的提交
- `:/<text>`表示最近提交信息有子串匹配正则表达式`<text>`的提交
- `<rev>:<path>`表示指定提交中的blob对象或树对象
- `[:<n>]:<path>`表示暂存区中的blob对象,其中在合并时n为1、2、3分别表示共同祖先、目标分支版本、被合并分支版本
而为指定提交的范围,可用以下之一:
- `<rev>`表示`<rev>`的祖先
- `^<rev>`表示非`<rev>`的祖先
- `<rev1>..<rev2>`表示`<rev2>`的祖先但不是`<rev1>`的祖先,省略提交则视为`HEAD`
- `<rev1>...<rev2>`表示`<rev1>`或`<rev2>`的祖先但不是它们的共同祖先,省略提交则视为`HEAD`
- `<rev>^@`表示`<rev>`的祖先但不包括`<rev>`
- `<rev>^!`表示提交`<rev>`本身
其中仓库通常用URL表示,形如以下之一: 其中仓库通常用URL表示,形如以下之一:
- `ssh://[user@]host.xz[:port]/path/to/repo.git/` - `ssh://[user@]host.xz[:port]/path/to/repo.git/`
... ...
......