Pro Git 教程
原文链接: https://www.progit.cn
git config
Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
-
/etc/gitconfig 文件: 包含系统上每一个用户及他们仓库的通用配置。 如果使用带有 --system 选项的 git config 时,它会从此文件读写配置变量。
-
~/.gitconfig 或 ~/.config/git/config 文件:只针对当前用户。 可以传递 --global 选项让 Git 读写此文件。
-
当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。
每一个级别覆盖上一级别的配置,所以 .git/config 的配置变量会覆盖 /etc/gitconfig 中的配置变量。
安装好 git 以后第一件事情就是配置, 可以通过 git config 命令,或者直接修改 ~/.gitconfig 文件进行配置, 这里给出示例配置
[user] name = YOUR_ID ; 替换这里的 YOUR_ID email = [email protected] ; 替换这里的 YOUR_ID [color] ui = true diff = true status = true branch = true interactive = true [core] excludesfile = ~/.gitignore.global pager = less -r [alias] l = log --decorate --graph la = log --decorate --graph --all ba = branch -a ci = commit dc = diff --cached ca = commit --amend fu = submodule foreach 'git checkout master && git pull' rc = rebase --continue ri = rebase -i pr = push review aa = add --all [branch] autosetuprebase = always ; 总是做 rebase |
获取 git 仓库
git init
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。
但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
简单的说, git init 只会产生一个 .git 子目录, 如果你的文件夹里面已经有文件, 这些文件并不会被 git add 和 git commit
记录每次更新到仓库
请记住,你工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件是指那些被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
工作目录中除已跟踪文件以外的所有其它文件都属于未跟踪文件,它们既不存在于上次快照的记录中,也没有放入暂存区。
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态。
编辑过某些文件之后,由于自上次提交后你对它们做了修改,Git 将它们标记为已修改文件。
我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。所以使用 Git 时文件的生命周期如下:
- git status 查看状态
- git add 可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 可将这个命令理解为“添加内容到下一次提交中”
- git diff 查看工作区与暂存区的差异,也就是修改之后还没有暂存起来的变化内容。
- git diff --staged 查看已暂存的将要添加到下次提交里的内容
- git commit 提交到本地库,这种方式会启动文本编辑器以便输入本次提交的说明,默认是vim
-
git commit -m "Story 182: Fix benchmarks for speed" ,在 commit 命令后添加 -m 选项,将提交信息与命令放在同一行
- git commit -a ,给 git commit 加上 -a 选项, Git 会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤
文件删除与移动
git rm
如果只是简单地从工作目录中手工删除文件,运行 git status
时就会在 “Changes not staged for commit” 部分(也就是 未暂存清单)提示:
Changes not staged for commit: (use "git add/rm <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) deleted: PROJECTS.md no changes added to commit (use "git add" and/or "git commit -a") |
git rm 将文件从暂存区和工作区删除, 如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f。
git rm --cached 把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很大的日志文件或一堆 .a 这样的编译生成文件添加到暂存区时,这一做法尤其有用。
git rm log/\*.log 删除 log/ 目录下扩展名为 .log 的所有文件
git rm \*~ 删除以 ~ 结尾的所有文件
git mv
运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README $ git rm README.md $ git add README |
撤销操作
git commit --amend
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend
选项的提交命令尝试重新提交:
$ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend |
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
文本编辑器启动后,可以看到之前的提交信息。 编辑后保存会覆盖原来的提交信息。
最终你只会有一个提交 - 第二次提交将代替第一次提交的结果。
git reset HEAD <file>
git reset HEAD <file> 拉取最近一次提交到版本库的文件到暂存区 该操作不影响工作区
git checkout <file> 把暂存区文件拉到工作区
远程仓库的使用
git remote -v 显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote add <shortname> <url> 添加一个新的远程 Git 仓库
$ git remote add pb https://github.com/paulboone/ticgit $ git remote -v origin https://github.com/schacon/ticgit (fetch) origin https://github.com/schacon/ticgit (push) pb https://github.com/paulboone/ticgit (fetch) pb https://github.com/paulboone/ticgit (push) |
git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。
而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。
如果你有一个分支设置为跟踪一个远程分支,可以使用 git pull 命令来自动的抓取然后合并远程分支到当前分支。
这对你来说可能是一个更简单或更舒服的工作流程;默认情况下,git clone 命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master 分支(或不管是什么名字的默认分支)。
运行 git pull 通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
推送到远程仓库:
git push [remote-name] [branch-name] git push origin master |
远程仓库的移除与重命名:
git remote rename pb paul git remote rm paul |
git tag
列出已有标签 git tag
查找标签 git tag -l "v1.8.5*"
创建附注标签 git tag -a v1.4 -m "my version 1.4"
查看标签和提交信息 git show
轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。
创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名字:git tag v1.4-lw
后期打标签: git tag -a v1.2 9fceb02
推送标签:
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。
这个过程就像共享远程分支一样——你可以运行 git push origin <tagname>,如:git push origin v1.5
如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。
这将会把所有不在远程仓库服务器上的标签全部传送到那里。git push origin --tags