写在前面
创建Git仓库
$ git init
创建Git仓库。
$ Git add <filename>
Git仓库添加对文件的跟踪。
(这是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。将这个命令理解为“添加内容到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。)
$ git commit <filename>
提交跟踪文件。
$ git clone [url]
从指定服务器克隆整个项目的所有版本到添加的文件夹里的.git文件夹中,可以自己指定文件夹名字。
$ git clone [url] folderName
文件状态
文件的所有状态以及可能的转换
$ git status -s
指令缩写前缀意思
?? 新添加的未跟踪文件
A 新添加到暂存区中的文件
M_ 左M被修改过并且已经添加到暂存区的文件
_M 右M被修改但是还没有被添加到暂存区的文件
MM 表示被修改并添加到暂存区之后又被修改了但是还没有添加到暂存区的文件
还有更多的前缀大多都是英文单词的首字母,很好理解。
忽略文件
添加.gitignore
文件来忽略不想添加到Git仓库的文件
.gitignore
文件的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。(用于在.gitignore文件中添加注释和换行)
可以使用标准的 glob 模式匹配。(这个是指Shell所使用的简化的正则表达式,但是和正则表达式还是有区别)
匹配模式可以以"/"
开头防止递归。
匹配模式可以以"/"
结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。(用于指定忽略规则之外的特殊文件)
这里附上官方文档中的一个.gitignore
文件的例子:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
实践:
在Git Bash中实现当前的实例目录之后。
$ ls -a
./ ../ .git/ .gitignore build/ doc/ ignoreFile.txt lib.a PrettyGirl.txt subTODOTest/ test.a test.txt TODO
使用$ git status指令结果如下:
$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
.gitignore
doc/
ignoreFile.txt
lib.a
subTODOTest/
nothing added to commit but untracked files present (use "git add" to track)
当然.gitignore
文件时生效了,说明.gitignore
文件应该放在当前Git仓库目录的根目录里面,而不是放在.git
目录里面。这里.gitignore
文件也是属于未跟踪文件,说明这个文件是必须提交到仓库的!这样才能让别人下载仓库代码之后,也能使用这样的忽略规则。另外,结果中有doc/
,lib.a
,subTODOTest/
和ignoreFile.txt
文件是用来与已经忽略文件进行对比的。说明在规则外的文件确实还是需要被提交。
查看改动
$ git diff
查看尚未暂存的文件的更新部分
(只要未暂存文件执行暂存指令,此命令将没有输出结果。)
$ git diff –cached
或者 $ git diff --staged
(只要已暂存文件执行提交指令,此命令将没有输出结果。)
查看已暂存的文件的更新的部分(两个参数都是一样的效果)
Note:可以使用Git Diff插件版本来查看修改内容。我这里是自带的vimdiff插件。
使用此插件指令:
$ git difftool <filename>
另外可以使用:
$ git difftool –tool-help
来查看你的系统支持哪些Git Diff插件。
提交更新
$ git commit
提交更新,并且打开文本编辑器编辑更新信息。
$ git commit -m “massage”
提交更新,-m属性直接在命令行添加更新信息。
$ git commit -a
自动把所有已经跟踪的文件暂存起来一并提交。
移除文件
$ git rm <filename>
从暂存区域删除文件
想要Git不再跟踪此文件还需要执行一次提交指令。
特例,如果在执行删除指令之前已经修改此文件,那么需要添加-f属性来强制删除。但是,也可以先删除本地文件再执行删除指令就不需要-f属性。
$ git rm –cached <filename>
从Git仓库删除不想继续跟踪的文件,同样还是需要提交到Git仓库
移除命令可以使用glob模式(类似正则表达式)如:
$ git rm log/\*.log
注意到星号 * 之前的反斜杠 \, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除log/
目录下扩展名为 .log
的所有文件。 类似的比如:
$ git rm \*~
该命令为删除以 ~ 结尾的所有文件。
(不是很理解这里,感觉只是*号前面需要添加一个反斜杠)
移动文件
$ git mv <file_from> <file_to>
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
如此分开操作,Git 也会意识到这是一次改名,所以不管何种方式结果都一样。 两者唯一的区别是,mv 是一条命令而另一种方式需要三条命令,直接用 git mv 轻便得多。 不过有时候用其他工具批处理改名的话,要记得在提交前删除老的文件名,再添加新的文件名。
实践:
$ mv lib_2.b lib_3.c
$ git status -s
D lib_2.b
?? lib_2.c
$ git rm lib_2.b
rm 'lib_2.b'
$ git add lib_3.c
warning: LF will be replaced by CRLF in lib_3.c.
The file will have its original line endings in your working directory.
$ git status -s
R lib_2.b -> lib_2.c
(可以看出改名简写前缀是R)
确实可以被识别出来。最后只需要执行一次提交就可以了。
今天就到这里。