Progit学习笔记:Git基础
获取Git仓库
通常有两种获取 Git 项目仓库的方式:
- 将尚未进行版本控制的本地目录转换为 Git 仓库;
- 从其它服务器 克隆 一个已存在的 Git 仓库。
在已存在目录中初始化仓库
$ cd /c/user/my_project
$ git init
如果在一个已存在文件的文件夹(而非空文件夹)中进行版本控制,你应该开始追踪(add)这些文件并进行初始提交(commit)
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
克隆现有的仓库
$ git clone https://github.com/libgit2/libgit2
# 自定义本地仓库名字
$ git clone https://github.com/libgit2/libgit2 mylibgit
记录每次更新到仓库
查看文件处于什么状态
$ git status
- Changes to be committed: 处于暂存状态
- Untracked files: 未跟踪文件
- Changes not staged for commit: 在工作区已修改但尚未暂存
跟踪一个文件
$ git add README
git add
可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等
注意:运行了 git add
之后又作了修订的文件,需要重新运行git add
把最新版本重新暂存起来
状态简览
# git status -s 命令或 git status --short 命令
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
左栏指明了暂存区的状态,右栏指明了工作区的状态
?? 表示新添加的未跟踪文件
忽略文件
$ cat .gitignore
GitHub 有一个十分详细的针对数十种项目及语言的.gitignore
文件列表,可以在github/gitignore 找到它
注意:一个仓库可能只根目录下有一个.gitignore
文件,它递归地应用到整个仓库中,子目录下也可以有额外的.gitignore
文件,它只作用于它所在的目录中。
查看已暂存和未暂存的修改
# 比较工作目录中当前文件和暂存区域快照之间的差异
$ git diff
注意:git diff
本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。
# 若要查看已暂存的将要添加到下次提交里的内容
git diff --staged
提交更新
$ git commit
提交开头空行需要输入提交说明
$ git commit -m "Story 182: Fix a little"
跳过使用暂存区
# 自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
$ git commit -a -m 'added new'
移除文件
# 从已跟踪文件清单中移除(确切地说,是从暂存区域移除),并连带从工作目录中删除指定的文件
$ git rm PROJECTS.md
注意:如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)
# 把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中
$ git rm --cached README
移动文件
$ git mv file_from file_to
其实,运行git mv
就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
查看提交历史
$ git log
git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
# -p 或 --patch ,它会显示每次提交所引入的差异(按补丁的格式输出),使用 -2 选项来只显示最近的两次提交
$ git log -p -2
# --stat 每次提交的简略统计信息
$ git log --stat
# --pretty。 这个选项可以使用不同于默认格式的方式展示提交历史, oneline 会将每个提交放在一行显示
$ git log --pretty=oneline
# format ,可以定制记录的显示格式
$ git log --pretty=format:"%h - %an, %ar : %s"
选项 | 说明 |
---|---|
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%ar | 作者修订日期,按多久以前的方式显示 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
限制输出长度
# --since 和 --until 这种按照时间作限制
$ git log --since=2.weeks
# 过滤器 -S,接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交,例如:找出添加或删除了对某一个特定函数的引用的提交
$ git log -S function_name
限制git log
输出的选项:
选项 | 说明 |
---|---|
-<n> | 仅显示最近的 n 条提交 |
–since, --after | 仅显示指定时间之后的提交 |
–until, --before | 仅显示指定时间之前的提交 |
–author | 仅显示作者匹配指定字符串的提交 |
–committer | 仅显示提交者匹配指定字符串的提交 |
–grep | 仅显示提交说明中包含指定字符串的提交 |
-S | 仅显示添加或删除内容匹配指定字符串的提交 |
撤销操作
# --amend(修订) 选项的提交命令来重新提交
$ git commit --amend
用一个新的提交 替换旧的提交
有时候提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了
取消暂存的文件
# 使用 git reset HEAD <file>... 来取消暂存(在 “Changes to be committed” 文字正下方有提示)
$ git reset HEAD CONTRIBUTING.md
撤销对文件的修改
# git status会提示
$ git checkout -- CONTRIBUTING.md
注意:git checkout -- <file>
对该文件在本地的任何修改都会消失。
远程仓库的使用
# 列出你指定的每一个远程服务器的简写
$ git remote
# -v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
$ git remote -v
添加远程仓库
# git remote add <shortname> <url> 添加一个新的远程Git仓库
$ git remote add pb https://github.com/paulboone/ticgit
从远程仓库中抓取与拉取
$ git fetch <remote>
git clone
:克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写
git fetch
:将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作(no merge)
git pull
:自动抓取后合并该远程分支到当前分支(merge)
推送到远程仓库
# origin master:克隆时通常会自动设置好
$ git push origin master
查看某个远程仓库
$ git remote show origin
远程仓库的重命名与移除
# 重命名pb -> paul
$ git remote rename pb paul
# 移除
$ git remote remove paul
打标签
列出标签
$ git tag
# 可带上可选的 -l 选项 --list
$ git tag -l "v1.8.5*"
创建标签
Git 支持两种标签:
- 轻量标签:很像一个不会改变的分支——它只是某个特定提交的引用。
- 附注标签是存储在 Git 数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用GNU Privacy Guard(GPG)签名并验证。
# 创建附注标签
$ git tag -a v1.4 -m "my version 1.4"
# git show 命令可以看到标签信息和与之对应的提交信息
$ git show v1.4
# 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字
$ git tag v1.4-lw
共享标签
# git push origin <tagname>
$ git push origin v1.5
# 如果想要一次性推送很多标签,也可以使用带有--tags选项的git push命令
$ git push origin --tags
删除标签
# 要删除掉你本地仓库上的标签,可以使用命令 git tag -d <tagname>
$ git tag -d v1.4-lw
# 从任何远程仓库中移除这个标签
$ git push origin --delete <tagname>
检出标签
# 查看某个标签所指向的文件版本,可以使用git checkout命令
$ git checkout 2.0.0
注意:这会使你的仓库处于“分离头指针(detached HEAD)”的状态,新提交将不属于任何分支,并且将无法访问,需要创建一个新分支。
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
# git commit
$ git ci
# 取消暂存别名
$ git config --global alias.unstage 'reset HEAD --'
# 这会使下面的两个命令等价:
$ git unstage fileA
$ git reset HEAD -- fileA
# last 命令
$ git config --global alias.last 'log -1 HEAD'
$ git last
```-