第二章 Git基础
2018-12-30 本文已影响4人
行知路
1.1 获取Git仓库
1.1.1 在现有目录初始化仓库
# cd到某已存在的目录,执行此命令,之后会创建一个空的Git仓库,目录下既有的内容不会被自动添加到Git仓库之中
$ git init
1.1.2 克隆远程仓库
# 这里的clone命令确实是把服务器上此仓库的信息给克隆到本地,其中协议https可以是ssh、git等
# 同时把libgit2(远程仓库名)重命名为mylibgit
$ git clone https://github.com/libgit2/libgit2 mylibgit
1.2 记录每次更新到仓库
1.2.1 Git仓库文件状态演变
status-change.png
其中Umodified是指存在于本地仓库。
1.2.2 检查当前文件状态
$ git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
"Git\346\235\203\345\250\201\346\214\207\345\215\227 - \350\222\213\351\221\253.epub"
"Git\346\235\203\345\250\201\346\214\207\345\215\227(\347\254\254\344\272\214\347\211\210)\350\222\213\351\221\253--\346\225\264\347\220\206\347\233\256\345\275\225\347\211\210.pdf"
progit_v2.1.16.epub
progit_v2.1.16.pdf
progit_v2.1.9-30.pdf
nothing added to commit but untracked files present (use "git add" to track)
以上通过git status命令可以查看当前仓库的状态(正如status单词的意义一样),其中输出的内容根据你仓库的状态会有不同。以上是我当前仓库的状态,可以看到又5各文件处于未追踪状态(乱码是因为文件有中文字符)。同时告知当前处于master分支,如果想要跟踪文件使用git add命令等信息。Git很贴心的一点就是:会根据当前命令的执行结果,告知下一步可以使用什么命令继续。
$ git add progit_v2.1.9-30.pdf progit_v2.1.16.pdf
# 把以上文件添加到暂存区
$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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: CONTRIBUTING.md
# 如果文件被修改过且使用git add命令加入暂存区之后,再次对文件进行修改,此时使用git status会看到文件既有处于暂存区的文件也有处于工作区的文件。
1.2.3 状态简览
# 对于熟悉Git的朋友来说,git status命令输出信息过多,可以在git status 后添加-s 或 --short来输出简短版的状态信息
$ git status --short
A 1.txt
AM 2.txt
# 新添加的未跟踪文件前面有 ?? 标记
# 新添加到暂存区中的文件前面有 A 标记
# 修改过的文件前面有 M 标记
# 你可能注意到了 M 有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左 边的 M 表示该文件被修改了并放入了暂存区。
1.2.3 忽略文件
在仓库的根目录下有文件(隐藏文件).gitingore,在里面设置的文件会被忽略,请注意在此文件被修改前以加入Git仓库或以备追踪的文件不会受此次文件改变的影响
文件 .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略
- 可以使用标准的 glob 模式匹配(一种简单的正则表达式)。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
# 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
1.2.4 查看已暂存和未暂存的修改
# 查看已暂存文件的修改
$git diff
# 查看已暂存文件的修改
$git diff --cached
1.2.5 提交更新
# 把暂存区的文件添加到本地仓库,执行该命令后会自动让输入提交日志
$git commit
# 使用-m参数可以同时添加提交日志
$git commit -m "添加readme.md"
# 使用-a参数可以可以把已跟踪但为暂存的文件直接提交(跳过git add命令)
$git commit -m -a "添加readme.md"
1.2.6 删除文件
# 删除文件
$git rm m.md
# 把删除文件提交至本地仓库
$git commit -m "删除m.md"
# 如果文件暂存且修改过,通过-f参数删除
$git rm -f m.md
# --cached把删除的文件保留在工作目录
$git rm --cached m.md
1.2.6 移动文件
# git mv README.md(原文件) README(新文件)相当于以下命令
$ mv README.md README
$ git rm README.md
$ git add README
1.3 查看提交历史
# git log命令用于查看提交历史,最新的排列在上面
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
git log有许多选项
- -p 列出每次提交的差异
- -n n是一个数字,列出最近n次的提交
- --stat 每个提交下面有总结性的说明
- --pretty=online 以每个提交一行的方式显示log
- --pretty=format:"%h - %an, %ar : %s" 列出comitid、作者名、修订、提交说明
- --graph 以图形的方式列出修改
- --since=2.weeks 列出最近2周的改动
1.4 撤销操作
# 最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
# 撤销未暂存的文件
$ git checkout -- <file>...
# 撤销暂存的文件
$git reset HEAD <file>...
1.5 远程仓库
# 列出远程仓库
$ git remote
origin
# 会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL。
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
# git remote add <shortname> <url> 添加远程仓库
$ git remote add pb https://github.com/paulboone/ticgit
# git fetch 从远程仓库抓取(拉取远程仓库的信息,但不会对你的工作造成任何影响)
$ git fetch [remote-name]
# git pull 从远程仓库拉取(与fetch相比,会合并仓库)
$ git pull [remote-name]
# git push [remote-name] [branch- name] 把本地修改推送到远程分支
# 如果有人在你推送之前先推送,那么本次推送就会被拒绝;需要先进行git pull,可能会有冲突,需要先解决冲突
$ git push origin master
# git remote show [remote-name] 显示远程仓库的信息
# 重命名远程仓库名
$ git remote rename pb paul
$ git remote
origin
paul
# 移出远程仓库
$ git remote rm paul
$ git remote
origin
1.6 打标签
# 查看当前标签
$ git tag
# 打轻量标签
$ git tag V1.0.0
# 打附注标签
$ git tag -a V1.0.0 -m "附注标签"
# 查看标签
$ git show v1.4
# 基于某commitid打标签
$ git tag -a v1.2 9fceb02
# git push时并不会会把标签信息发送到远端,需要使用git push origin [tagname]命令
$ git push origin v1.5
# 会把标签
$ git push origin --tags
# 在 Git 中你并不能真的检出一个标签,因为它们并不能像分支一样来回移动。
# 如果你想要工作目录与仓库中特定 的标签版本完全一样,可以使用git checkout -b [branchname] [tagname]
1.7 Git别名
# 命令的简写
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status