内容简介:第二、三章中出现的常用命令,如果你有时间,建议将此书看一遍。Git 管理项目时,文件在三个区域转移:工作区,暂存区,以及本地仓库。
第二、三章中出现的常用命令,如果你有时间,建议将此书看一遍。
基本原理
Git 管理项目时,文件在三个区域转移:工作区,暂存区,以及本地仓库。
简单的说,工作区就是 .git 所在目录,暂存区就是 .git/index 文件,本地仓库就是 .git 目录。实际上,暂存区是一个包含文件索引的目录树,记录了文件的各种信息(文件名、文件长度、修改时间等),而文件内容则存放在 .git/objects 目录下。
Git 将 commit、文件、目录统统视为对象。对象以 SHA1 值作为指纹,与其他对象相区分,Git 命令操作的最小单位是对象。 Git 会将文件的副本存放在 .git 文件夹下,每个文件都根据文件内容进行操作。
由 Git 管理的文件始终在四种状态之间迁移,分别是:未跟踪(Untracked)、未修改(Unmodified)、已修改(Modified)或已暂存(Staged)。
HEAD、分支(branch)、标签(tag)都是指针,均直接或间接指向相应的 commit。HEAD 始终指向当前分支,分支和标签指向对应的 commit。通过 git cat-file -p <SHA1> 可查看 commit 内容。
$ cat .git/HEAD |
.gitignore 文件
.gitignore 文件包含一些模式,用以描述不想跟踪的文件。
模式规则
# / / !
Glob 模式
-
*匹配大于等于0个字符 -
[abc]匹配括号中的任意一个字符 -
?匹配1个字符 -
**匹配目录,如:a/**/z会匹配a/z、a/b/z、a/b/c/z等等
# 忽略所有的 .a 文件 *.a # 不忽略 lib.a 文件, 即使上一条规则说了要忽略 !lib.a # 仅仅忽略当前目录下的 TODO 文件 /TODO # 忽略所有 build/ 目录下的文件 build/ # 忽略 doc/notes.txt, 但是不忽略 doc/server/arch.txt doc/*.txt # 忽略所有位于 doc/ 目录下的 .txt 文件 doc/**/*.txt |
查看信息
列出帮助信息 — git help <command>
列出文件状态 — git status
列出处于未跟踪、已修改或已暂存状态的文件。
git status git status -s git status --short |
git status -s 示例
输出分四栏,第一栏表示文件已暂存,第二栏表示文件已修改,第三栏是空格,第四栏是文件路径。
# git status -s M README # 已修改但未暂存 MM Rakefile # 已修改且已暂存,然后又被修改了 A lib/git.rb # 新文件 M lib/simplegit.rb # 已修改且已暂存 ?? LICENSE.txt # 未跟踪 |
查看提交历史 — git log
-
git log -p: 查看提交历史和每次提交的详细修改 -
git log -<n>: 查看最近 n 次提交历史 -
git log --stat: 查看提交历史和每次提交的修改情况 -
git log --since=1.weeks: 查看最近一星期的提交历史 -
git log --until=1.weeks: 查看到上星期为止的提交历史 -
git log --grep=hel.o: 查看提交信息匹配hel.o的提交历史 -
git log --author=f.o: 查看作者名匹配f.o的提交历史 -
git log -S<string>: 查看改动过<string>的提交历史
git log --oneline --decorate --color --graph git log -Sfunction_name |
查看详细修改 — git diff
查看已修改文件的详细修改。
-
git diff --staged: 查看已暂存文件和最后一次提交(commit)相比的详细修改(cached是staged的同义词)
本地仓库
创建仓库 — git init [directory]
创建仓库或重置已有仓库。
git init git init . |
跟踪文件 — git add [<pathspec>...]
跟踪(track)新文件。
git add .
删除文件 — git rm <file>...
删除已跟踪且已提交的文件,并从工作区删除。
git rm -f <file> git rm --cached <file>
git rm 命令接受 glob 模式的参数,只不过 * 之前需要一个 ,因为 Git 内部会对 * 作处理,而没有 的话,shell 会先将 * 展开例如:
git rm --cached **/*.log
重命名文件 — git mv <source> <destination>
git mv README.md README # 等价于下面三个命令 mv README.md README git rm README.md git add README |
状态变动
暂存文件 — git stage <pathspec>...
暂存(stage)修改的文件,与 add 是同义词。
git stage . git stage -u git stage -A
取消暂存 — git reset
-
git reset HEAD <file>...: 取消暂存(unstage) -
git reset --hard <file>...: 丢弃对应文件未提交的修改( 所有修改都会消失,慎用 ) -
git reset --hard HEAD: 丢弃所有未提交的修改( 所有修改都会消失,慎用 )
提交修改 — git commit
-
git commit -a: 暂存所有已跟踪的文件,并提交修改 -
git commit -m <msg>: 提交修改,并将msg作为提交信息 -
git commit -v: 提交修改,并将diff结果附在提交信息中 -
git commit --amend: 重新提交修改
# 暂存并提交 git commit -a -m 'added new benchmarks' # 暂存漏掉的文件,重新提交 git commit -m 'initial commit' git add forgotten_file git commit --amend |
远程仓库
克隆远程仓库 — git clone <repository> [<directory>]
克隆远程仓库并重命名为 <directory> 。
git clone https://github.com/libgit2/libgit2 |
添加、删除、列出远程仓库 — git remote
-
git remote -v: 显示远程仓库名和对应的 URL -
git remote show <name>: 显示远程仓库的详细信息 -
git remote add <name> <url>: 添加<name>作为位于<url>的远程仓库 -
git remote rename <old> <new>: 重命名远程仓库和远程仓库本地名 -
git remote rm <name>: 删除远程仓库
# git remote -v |
列出远程仓库的所有引用 — git ls-remote [<url>]
列出远程仓库的所有引用(remote references),包括分支、标签等。
# git ls-remote |
更新远程仓库 — git push
-
git push origin --tags: 更新远程仓库的标签 -
git push <remote> <branch>: 更新<branch>分支到远程仓库 -
git push <remote> --delete <remote_branch>: 删除远程仓库上的<remote_branch>分支
下载并合并远程仓库的数据 — git pull
下载远程仓库的数据,并进行合并。
# 大部分情况等价于 `git fetch && git merge` git pull |
下载远程仓库的数据 — git fetch [<remote>]
git fetch origin
用远程仓库覆盖本地分支
git fetch --all git reset --hard origin/YOUR_BRANCH # 覆盖所有分支 # git reset --hard origin |
子模块操作 — git submodule
git submodule add <repository> git submodule init git submodule update
# 为项目添加子模块 |
分支操作
创建、删除、列出分支 — git branch
-
git branch <branchname>: 创建分支 -
git branch -d <branchname>: 删除分支,分支必须已经被合并到其他分支 -
git branch -D <branchname>: 强制删除分支 -
git branch: 列出所有分支 -
git branch -v: 列出所有分支和最后一次提交 -
git branch --merged: 列出被合并到当前分支的其他分支 -
git branch --no-merged: 列出未合并到当前分支的其他分支 -
git branch -u <remote>/<branch>: 设置当前分支与远程分支<remote>/<branch>同步(track upstream branch) -
git branch -vv: 列出本地分支与远程分支的关系
# git branch -vv iss53 7e424c3 [origin/iss53: ahead 2] forgot something # 本地分支比远程分支多2次提交 master 1ae2a45 [origin/master] deploying index fix * serverfix f8674d9 [teamone/server-fix-good: ahead 3, behind 1] fix # 当前分支。与远程分支有4次提交未同步 testing 5ea463a trying something new # 没有设置同步的远程分支 |
切换分支 — git checkout
-
git checkout <branch>: 切换到分支 -
git checkout -b <new_branch> [<start_point>]: 创建分支,然后切换到该分支 -
git checkout -- <file>...: 还原到最后提交的版本/丢弃修改。 WARNING: 文件的任何修改都会丢失
# 将 HEAD 指针指向 testing 分支 git checkout testing # 等价于 `git branch testing && git checkout testing` git checkout -b testing # 基于远程仓库 origin 的 master 分支创建分支 testing,并切换到 testing git checkout -b testing origin/master |
创建、删除、列出标签 — git tag
-
git tag: 按字母序列出所有标签 -
git tag -l <pattern>: 列出匹配的标签 -
git tag -a <tagname> -m <msg>: 创建带注释的标签 -
git tag <tagname> [<commit>]: 对<commit>创建标签 -
git tag -d <tagname>: 删除标签
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。