git基本命令
# git基本命令
# git运行前的配置
# 用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中:
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
2
# 检查配置信息
也可以通过以下命令来查询当前已配置的git信息以及文件位置。
git config --list --show-origin
每一个级别会覆盖上一级别的配置,所以 .git/config
的配置变量会覆盖 /etc/gitconfig
中的配置变量。
# git初始化
如果你有一个尚未进行版本控制的目录,想要用 Git 来控制它,那么首先需要进入该目录中。
cd git_test/
git init
2
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。非必要情况下请不要变更此文件夹的内容。
# 三种状态
现在请注意,如果你希望后面的学习更顺利,请记住下面这些关于 Git 的概念。 Git 有三种状态,你的文件可能处于其中之一: 已提交(committed)、已修改(modified) 和 已暂存(staged)。
已修改(modified) 表示修改了文件,但还没保存到数据库中。
已暂存(staged) 表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
已提交(committed) 表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录(仓库)。
# 提交到仓库的过程
每当完成了一个阶段的更改,想要将记录下它时,就将它提交到仓库。
工作目录(Working Directory) 下的每一个文件都不外乎这两种状态:已跟踪(track) 或 未跟踪(untracked)。
已跟踪(track):已经版本控制的文件,在上一次快照中有它们的记录。
未跟踪(untracked):工作目录(Working Directory)中除已跟踪文件外的其它所有文件都属于未跟踪文件。
# 检查当前文件状态
可以用 git status
命令查看哪些文件处于什么状态。 如果在初始化仓库后执行此命令,会看到类似这样的输出:
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
2
3
4
5
当前分支为 master ,没有提交记录。
# 精简显示
git status
命令的输出十分详细,但比较繁琐。使用 git status -s
命令或 git status --short
命令,你将得到一种
格式更为紧凑的输出。
AM README.md
MM Rakefile
?? 1
2
3
A:新添加到暂存区中的文件。
M:修改过的文件。
??:新添加的 未跟踪(untracked) 文件。
Rakefile 文件已修改,暂存后又作了修改,因此该文件的修改中既有已暂存的部分,又有未暂存的部分。
# 跟踪(add)新文件
这个时候我们新建一个 README.md
,再次执行 git status
,输出:
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README.md
nothing added to commit but untracked files present (use "git add" to track)
2
3
4
5
6
7
8
9
此时 README.md
文件就处于 **未跟踪(untracked)**的状态。如果要跟踪 README.md
,执行:
git add README.md
再次执行 git status
,输出:
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README.md
2
3
4
5
6
7
出现 Changes to be committed
,之后的文件就说明是 已暂存(staged) 状态。文件已存到暂存区。等待提交。
中途如果我们修改 README.md
,再次执行 git status
,发现会多出来几行:
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README.md
2
3
4
出现 Changes not staged for commit
,说明文件内容已变化,但并未存到暂存区。可以重新运行 git add
把最新版本重新暂存起来。
# 忽略文件
创建一个名为 .gitignore
的文件,列出要忽略的文件。
文件 .gitignore
的格式规范如下:
- 所有空行或者以
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(
/
)开头防止递归。 - 匹配模式可以以(
/
)结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
下面是一个 .gitignore
的例子。
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
2
3
4
5
6
7
8
9
10
11
12
访问 gitignore (opens new window) 获取各个项目以及语言的 .gitignore
。
# 取消暂存的文件
例如,你已经修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add *
暂存了它们两个,输入:
git restore --staged <file>
可以从暂存区中删除文件。
# 查看修改的部分
git diff
使用较少,可忽略。
# 提交(commit)
确定你要保存的文件都已经存到暂存区后,执行:
git commit
出现以下内容:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file: README.md
#
# Changes not staged for commit:
# modified: README.md
#
2
3
4
5
6
7
8
9
10
11
12
13
在文件中输入你想提交的信息,保存并退出,一次commit就已经完成了。
也可以在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行:
git commit -m "第一次提交"
# 跳过暂存区提交
在提交的时候,给 git commit
加上-a
选项,Git 就会自动把所有 已经修改的文件 暂存起来一起提交,从而跳过 git add
步骤:
git commit -a -m "第二次提交"
# 查看提交记录
进行了多次提交后,如果想查看提交记录,使用以下命令:
git log
# 修改提交记录
如果提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了,可以通过添加 --amend
的参数来重新提交:
git commit --amend
例:发现提交的信息写错了或者少提交了文件,可以通过以下命令进行再次提交:且 第二次提交 将代替 第一次提交 的结果。
git commit -m "第二次提交"
git add 1
git commit -m "第二次提交" --amend
2
3
# 从提交记录中恢复文件
如果文件被你修改的乱七八糟的,可以从上次的提交记录中恢复文件。例如我想恢复 README.md
:
git checkout -- README.md
要确保文件不在暂存区中。已经在暂存区的文件是无法恢复的。
# 打标签(tag)
Git 可以给仓库历史中的某一个提交打上标签。记录重要的节点或者更新。
git tag # 查看所有标签
Git 支持两种标签: 轻量标签(lightweight) 与 附注标签(annotated)。
轻量标签(lightweight):在某一次提交进行打标签。
附注标签(annotated):存储在 Git 数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的 名字、电子邮件地址、日期时间, 此外还有一个标签信息。
# 附注标签(annotated)
git tag -a v1.0 -m "version 1.0"
# 轻量标签(lightweight)
git tag v1.0
# 给提交记录打标签
可以给已经提交的记录进行打标签。执行 git log --pretty=oneline
查看提交历史:
28178e47377b6c7f613ea3af7a2b6619de44fa80 (HEAD -> master, tag: v1.1, tag: v1.0) 第三次提交
b982f67c9d2c6efb23fa5b11ef9edabc1a2d7a53 (lgxblog/master) 第二次提交
754086a63c6abcb71382c12d7f29f076a8377810 第一次提交
2
3
给 “第一次提交” 打标签:
git tag -a v0.9 -m "version 0.9" 754086a63c6abcb71382c12d7f29f076a8377810
执行 git show v0.9
查看记录,发现已经打上标签了。
# 共享标签
默认情况下,git push
命令并不会传送标签到远程仓库服务器上。执行 git push origin <tagname>
把标签推送到远程服务器上。
# 删除标签
删除本地仓库的标签,执行 git tag -d <tagname>
。
# 检出标签?
查看标签指向的提交?......具体解释项需要在分离头章节继续讲解。