- Git怎么使用?
- 使用 git commit 进行提交操作时,Git都做了什么?
Git怎么使用?
下载、安装Git
下载Git安装文件,教程链接。
获取Git仓库
- 在现有目录中初始化仓库。
在本地磁盘现有目录里运行 git init 命令,会在该目录下创建 .git 子文件夹,这个子文件夹含有你初始化的 Git 仓库中所有的必须文件。此时,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。git init 会默认创建 master 分支!!!
git init
- 克隆现有的仓库
使用 git clone [远程地址] 从远程仓库克隆。Git 克隆的是远程仓库上的几乎所有数据。
git clone https://gitee.com/**/git_learn_test.git
检查当前文件状态、跟踪文件变动
使用 git status [-s] 检查当前文件状态
git status
# 在工作目录创建README文件
echo '' >> README
git status
在工作目录中新建的文件都处于未跟踪状态。**
# 使用 git add 命令跟踪文件变动(文件新增、修改、删除都属于变动)
git add README
git status
可使用 git rm --cached <file> 命令将文件移出暂存区,使文件处于未跟踪状态。
git rm --cached README
git status
提交文件
使用 git commit 命令将暂存区的文件提交到Git仓库。每次提交需要填写提交说明
git commit -m "提交README文件"
忽略文件
如果文件不需要纳入Git的管理,可以创建名为 .gitignore 的文件,在文件中列出要忽略的文件模式。
# 忽略当前目录左右的已.log为后缀的文件
echo '*.log' >> .gitignore
文件 .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
glob模式又是个啥?
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号(*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号() 表示匹配任意中间目录,比如 a/*/z 可以匹配 a/z , a/b/z 或 a/b/c/z 等。
# 忽略所有.a结尾的文件
*.a
# 不忽略lib.a,即跟踪lib.a文件
!lib.a
# 仅忽略当前文件下的TODO文件
/TODO
# 忽略build文件夹下的所有文件
build/
# 忽略doc文件(不含子文件夹)下的所有txt文件,忽略doc/a.txt,不忽略doc/t/b.txt
doc/*.txt
# 忽略doc文件夹及子文件夹下的所有pdf文件
doc/**/*.pdf
查看已暂存和未暂存的修改
如果想知道具体修改了什么地方,可以使用git diff命令。
- 注意: git diff只能查看本地工作目录修改未暂存的数据;git diff --cached或git diff --staged(Git 1.6.1+版本支持)只能查看本地暂存区修改的数据!!未被跟踪(新追加)的数据不会被查看。
# 修改README文件,追加123456
echo '123456' >> README
git diff
# 将README文件加入暂存区
git add README
# 当工作目录中没有被修改的文件后使用git diff不会输出任何内容
git diff --staged # or git diff --cached
移除文件
从工作目录直接删除
- 在本地磁盘直接删除文件
git status
- 使用 git rm [文件],该命令会将文件从工作目录和Git仓库移除。
git rm README
git status
git commit后该文件就不再纳入版本管理了。如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 Git 恢复。
从Git仓库中删除,在工作目录中保留
git rm --cached README
git status
使用 git commit 进行提交操作时,Git都做了什么?
当使用 git commit 进行提交操作时,Git 会先计算每一个子目录的校验和,然后在 Git 仓库中这些校验和保存为树对象。 随后,Git 便会创建一个提交对象,它除了包含上面提到的那些信息外,还包含指向这个树对象(项目根目录)的指针。如此一来,Git 就可以在需要的时候重现此次保存的快照。
现在,Git 仓库中有五个对象:三个 blob 对象(保存着文件快照)、一个树对象(记录着目录结构和 blob 对象索引)以及一个提交对象(包含着指向前述树对象的指针和所有提交信息)。
# 创建git仓库
git init
# 创建README1 README2 README3
touch README{1..3}
# 跟踪新文件
git add README1 README2 README3
# 提交
git commit -m '提交新文件'
做些修改后再次提交,那么这次产生的提交对象会包含一个指向上次提交对象(父对象)的指针。
可以使用git log --pretty=oneline查看提交记录,历史记录按提交时间倒序排**
git log --pretty=oneline