git学习笔记(一) Git基础
git三种状态
Git 有三种状态:已提交(committed)、已修改(modified) 和 已暂存(staged)。
• 已修改表示修改了文件,但还没保存到数据库中。
• 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
• 已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 本地仓库。
获取帮助
$ git <verb> --help
$ git help <verb>
$ man git-<verb>
例:获取 git add
命令帮助:
$ git add -h
usage: git add [<options>] [--] <pathspec>...
-n, --dry-run dry run
-v, --verbose be verbose
-i, --interactive interactive picking
-p, --patch select hunks interactively
-e, --edit edit current diff and apply
-f, --force allow adding otherwise ignored files
-u, --update update tracked files
--renormalize renormalize EOL of tracked files (implies -u)
-N, --intent-to-add record only the fact that the path will be added
later
-A, --all add changes from all tracked and untracked files
--ignore-removal ignore paths removed in the working tree (same
as --no-all)
--refresh don't add, only refresh the index
--ignore-errors just skip files which cannot be added because of
errors
--ignore-missing check if - even missing - files are ignored in
dry run
--chmod (+|-)x override the executable bit of the listed files
设置信息
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
使用
--global
选项,那么命令只需要在该系统运行一次。
初始化仓库
$ git init
该命令创建一个名为.git的子目录,只需要项目文件中含.git文件夹,就可以称为Git仓库。
克隆现有仓库
$ git clone https://github.com/libgit2/libgit2
$ git clone https://github.com/libgit2/libgit2 mylibgit(自定义目录名)
检测文件状态
$ git status
忽略文件
在项目根目录创建.gitignore
文件。
*.[oa]
*~
首行忽略.o
和.a
结尾的文件,次行忽略以波浪符结尾的文件。
文件
.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
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore 文件列表, 你可以在
https://github.com/github/gitignore 找到它。
比较差异
$ git diff
$ git diff --staged
对于某个文件,进行了git add filename
操作加入到暂存区后,再对文件进行修改,
想查看修改前后的差异,可使用git diff
命令。
git diff
比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged
命令。
git diff --staged
命令将比对已暂存文件与最后一次提交的文件差异。
--staged
和--cached
是同义词
移除文件
$ git rm <file-name>
$ git rm -f <file-name>
$ git rm --cached <file-name>
git rm
同时从工作区和暂存区中删除文件,即本地的文件也被删除了。如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项-f
,如果想保留工作区的文件,可以使用--cached
选项。
文件改名
$ git mv file_from firle_to
git mv
相当于运行了下面三条命令:$ mv README.md README $ git rm README.md $ git add README
查看提交历史
$ git log
git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。
提交更新
$ git commit
执行后会打开vim,输入提交信息。
$ git commit -m "提交信息"
-m
参数将提交信息和命令放在同一行。
$ git commit -a -m "提交信息"
-a
参数跳过使用暂存区域,即跳过git add
步骤。
有时这个选项会将不需要的文件添加到提交中。
撤销操作
$ git commit --amend
该命令覆盖上一次提交。
$ git reset HEAD <file>
该命令将文件从暂存区移除。即撤销add该文件的命令。
$ git checkout -- CONTRIBUTING.md
该命令撤销对文件的修改,返回上一次提交的样子。
git checkout -- <file>
是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。
远程仓库的使用
$ git clone <远程仓库地址>
克隆远程仓库到本地。
$ git remote -v
显示读写远程仓库时需要使用的简写及其对应的 URL。
$ git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个方便使用的简写,此后可以使用简写来代替url。
$ git remote show <remote>
查看某个远程仓库的URL、branches等信息。
$ git push <shortname> <branch>
推送到远程仓库的某个分支
$git remote rename <old name> <new name>
将一个远程仓库的简写名重命名。
ortname>
> 添加一个新的远程 Git 仓库,同时指定一个方便使用的简写,此后可以使用简写来代替url。
```bash
$ git remote show <remote>
查看某个远程仓库的URL、branches等信息。
$ git push <shortname> <branch>
推送到远程仓库的某个分支
$git remote rename <old name> <new name>
将一个远程仓库的简写名重命名。