Pro Git: http://github.danmarner.com/section/toc/
1. 基础
(1). 配置, Git提供了git config的工具:git config [options].
- /etc/gitconfig 文件:系统中所有用户都适用的配置,--system选项时操作该文件。
- ~/.gitconfig 文件:只适用于当前用户的配置,--global选项时操作该文件。Windows下使用$HOME\.gitconfig
- .git/config 文件:当前项目有效的配置。
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
git config --global merge.tool vimdiff / emerge / kdiff3 / tkdiff
git config --list
git config user.name
(2). 文件状态:未跟踪、已修改、已暂存、已提交
- 检查当前文件状态:git status,如果不仅仅显示修改过的文件,而是显示具体修改的地方,可以用git diff.
- git diff 显示修改之后与暂存内容的变化。
- git diff --cached 显示暂存与提交的变化。
- 开始跟踪新文件、把已跟踪文件放到暂存区、还能用于合并时把有冲突的文件标记为已解决状态:git add
- 忽略某些文件,编辑.gitignore文件。该文件的格式规范如下:
- 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
- 提交暂存的内容:git commit -m ""
- 路过使用暂存区域,自动把所有已经跟踪过的文件暂存起来一并提交:git commit -a -m ""
- 移除文件和放弃修改:git rm
- 从暂存区域中移除:git rm --cache
- 取消已暂存的文件: git reset HEAD <file>
- 取消对文件的修改: get checkout --<file>
(3). 库管理
- 查看当前的远程库:git remote -v
- git remote show [remote-name] // 查看远程库信息
- 添加远程仓库:git remote add pb git://githum.com/xxx
- 获取远程库中的所有分支:git fetch pb // fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
- 如果是克隆了一个仓库,自动将远程库归于origin名下。// git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支).
- git pull 从原始克隆的远端仓库中获取数据后,并自动合并到工作目录中当前分支。
- 推送数据至远程仓库:git push [remote-name] [branch-name] : [远程分支名]
- 只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。
- 删除远程库:git remote rm
- 列出现有标签:git tag
- 打标签:git tag -a v1.4 'my version 1.4'
(4). 分支管理
- 查看分支:git branch --merge / --no-merged
- 创建分支:git branch name
- 切换分支:get checkout name
- get checkout -b name remote-name/name // 基于远程库中的分支,创建新分支并切换到该分支
- 合并分支:git merge branch-name
- 删除分支:git branch -d branch-name
- 跟踪分支:get checkout --track orgin/branch-name
- git rebase [主分支] [特性分支] 命令会先检出特性分支然后在主分支上重演
- 它的原理是回到两个分支的共同祖先,提取你所在分支每次提交时产生的差异(diff),把这些差异分别保存到临时文件里,然后从当前分支转换到你需要衍合入的分支,依序施用每一个差异补丁文件。
假设在接下来的一次软件发布中,你决定把客户端的修改先合并到主线中,而暂缓并入服务端软件的修改(因为还需要进一步测试)。你可以仅提取对客户端的改变(C8 和 C9),然后通过使用 git rebase 的 --onto 选项来把它们在 master 分支上重演。
git rebase --onto master server client // 检出 client 分支,找出 client 分支和 server 分支的共同祖先之后的变化,然后把它们在 master 上重演一遍
git rebase master server // 检出server,然后在master上重演
git checkout master // 快进主分支master
git merge server
如果把衍合当成一种在推送之前清理提交历史的手段,而且仅仅衍合那些永远不会公开的 commit,那就不会有任何问题。如果衍合那些已经公开的 commit,而与此同时其他人已经用这些 commit 进行了后续的开发工作,那你有得麻烦了。
(5). 技巧
- Git源代码中的文件 git-completion.bash,将自动匹配命令。