获取仓库
克隆已有仓库
git clone https://github.com/libgit2/libgit2
已存在目录初始化仓库
进入项目目录:
git init
更新仓库
工作目录下的每一个文件都不外乎这两种状态:已跟踪 或 未跟踪。已跟踪就是git已经知道的文件。已跟踪的文件状态可能有未修改,已修改和放入暂存区。
检查当前文件状态 git status
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README.txt
Untracked files:
(use "git add <file>..." to include in what will be committed)
text.txt
根据状态命令可以看到,文件README.txt已被跟踪,放入暂存区,文件text.txt未被跟踪。需要使用git add命令进行跟踪
跟踪新文件 git add
$ git add text.txt
Administrator@PC-201706081125 MINGW64 ~/Desktop/testgit/demo (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README.txt
new file: text.txt
git add之后,再次git status,发现文件已经被跟踪。
git add 命令是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等
例如:被用来暂存已修改的文件。
我们修改了README.txt,会发现这个文件同时出现在暂存区和非暂存区。
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README.txt
new file: text.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.txt
我们如果把最后一次的修改提交到版本库,需要再次执行git add README.txt
忽略文件 .gitignore
一些文件无需纳入git的管理,也不需要他们出现在未跟踪文件的列表,我们在 .gitignore文件中列入(文件夹中没有的话,新建的一个.gitignore文件), 将它们忽略。简单的 .gitignore文件的规则:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配
任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?)只
匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配
(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号( ** )表示匹配任意中间目录,比如 a/ ** /z 可以
匹配 a/z 、 a/b/z 或 a/b/c/z 等。
简单看一个.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
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表 :https://github.com/github/gitignore
详细查看已暂存和未暂存的修改 git diff
git diff 比较的是工作目录中当前文件和暂存区域快照之间的差异。
git diff --staged比对已暂存文件与最后一次提交的文件差异。
提交更新 git commit
暂存区已经准备就绪,提交暂存区的文件:git commit -m ‘提交说明’
指定提交说明编辑器: git config --global core.editor
$ git commit -m 'add a file'
[master e42d1ce] add a file
2 files changed, 1 insertion(+)
create mode 100644 demo/README.txt
create mode 100644 demo/text.txt
提交时记录的是放在暂存区的快照。
提交后它会告诉你,当前是在哪个分支(master)提交的,本
次提交的完整 SHA-1 校验和是什么(e42d1ce),以及在本次提交中,有多少文件修订过,多少行添加和删改
过。
git commit -a -m ‘提交说明’ 跳过使用暂存区
给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
移除文件(git rm)和移动文件(git mv)
git rm 要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
git rm --cached 我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 这个时候需要使用命令git rm --cached
例如:
git rm --cached README.txt
git mv 重命名或者移动文件
例如:
$ git mv README.txt README
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.txt -> README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README
git mv 相当于运行了下面三条命令:
$ mv README.txt README
$ git rm README.txt
$ git add README