{"action":"opened","issue":{"url":"https://api.github.com/repos/huangtengfei/notes/issues/2","labels_url":"https://api.github.com/repos/huangtengfei/notes/issues/2/labels{/name}","comments_url":"https://api.github.com/repos/huangtengfei/notes/issues/2/comments","events_url":"https://api.github.com/repos/huangtengfei/notes/issues/2/events","html_url":"https://github.com/huangtengfei/notes/issues/2","id":59458502,"number":2,"title":"《Git教程》读书笔记","user":{"login":"huangtengfei","id":3126745,"avatar_url":"https://avatars.githubusercontent.com/u/3126745?v=3","gravatar_id":"","url":"https://api.github.com/users/huangtengfei","html_url":"https://github.com/huangtengfei","followers_url":"https://api.github.com/users/huangtengfei/followers","following_url":"https://api.github.com/users/huangtengfei/following{/other_user}","gists_url":"https://api.github.com/users/huangtengfei/gists{/gist_id}","starred_url":"https://api.github.com/users/huangtengfei/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/huangtengfei/subscriptions","organizations_url":"https://api.github.com/users/huangtengfei/orgs","repos_url":"https://api.github.com/users/huangtengfei/repos","events_url":"https://api.github.com/users/huangtengfei/events{/privacy}","received_events_url":"https://api.github.com/users/huangtengfei/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":0,"created_at":"2015-03-02T09:44:15Z","updated_at":"2015-03-02T09:44:15Z","closed_at":null,"body":"# 《Git教程》读书笔记\r\n\r\n原文链接： [Git教程][1]\r\n\r\n## 安装与配置\r\n\r\n安装教程： [安装Git][2]\r\n安装完成后，设置用户名和Email\r\n\r\n    $ git config --global user.name \"Your Name\"\r\n    $ git config --global user.email \"email@example.com\"\r\n\r\n## 初始化一个Git仓库\r\n\r\n创建一个本地版本库（Repository）\r\n\r\n    $ git init\r\n\r\n从远程库克隆（可以使用原生 `git` 协议或 `https` 协议）\r\n\r\n    $ git clone\r\n\r\n## 本地变更操作\r\n\r\n#### 添加文件到Git仓库\r\n\r\n - 第一步，使用命令 `git add <file>`，注意，可反复多次使用，添加多个文件\r\n - 第二步，使用命令 `git commit`，完成\r\n\r\n#### 变更状态查看\r\n\r\n - 查看工作区的状态，使用 `git status` 命令\r\n - 如果 `git status` 告诉有文件被修改过，用 `git diff` 可以查看修改内容\r\n\r\n#### 版本回退\r\n\r\n - 在版本的历史之间穿梭，使用命令 `git reset --hard commit_id`\r\n - 穿梭前，用 `git log` 可以查看提交历史，以便确定要回退到哪个版本\r\n - 要重返未来，用 `git reflog` 查看命令历史，以便确定要回到未来的哪个版本\r\n\r\n#### 撤销修改\r\n\r\n - 当你改乱了工作区某个文件的内容，想直接丢弃工作区的修改时，用命令 `git checkout -- file`\r\n - 当你不但改乱了工作区某个文件的内容，还添加到了暂存区时，想丢弃修改，分两步，第一步用命令 `git reset HEAD file`，就回到了场景1，第二步按场景1操作\r\n - 已经提交了不合适的修改到版本库时，想要撤销本次提交，使用版本回退（在没有推送到远程库的前提下）\r\n\r\n#### 删除文件\r\n\r\n - 命令 `git rm` 用于删除一个文件\r\n - 如果不小心误删，可以用命令 `git checkout -- file` 恢复（用版本库里的版本替换工作区的版本）\r\n\r\n## 远程库操作\r\n\r\n#### 添加远程库\r\n\r\n - 要关联一个远程库，使用命令 `git remote add origin git@server-name:path/repo-name.git`\r\n - 关联后，使用命令 `git push -u origin master` 第一次推送master分支的所有内容\r\n - 此后，每次本地提交后，只要有必要，就可以使用命令 `git push origin master` 推送最新修改\r\n\r\n## 分支管理\r\n\r\n#### 创建与合并分支（Git鼓励大量使用分支）\r\n\r\n - 查看分支：`git branch`\r\n - 创建分支：`git branch <name>`\r\n - 切换分支：`git checkout <name>`\r\n - 创建+切换分支：`git checkout -b <name>`\r\n - 合并某分支到当前分支：`git merge <name>`\r\n - 删除分支：`git branch -d <name>`\r\n\r\n#### 解决冲突\r\n\r\n - 当Git无法自动合并分支时，就必须首先解决冲突。解决冲突后，再提交，合并完成\r\n - 用 `git log --graph` 命令可以看到分支合并图\r\n\r\n#### 分支管理策略\r\n\r\n合并分支时，加上--no-ff参数就可以用普通模式合并，合并后的历史有分支，能看出来曾经做过合并，而fast forward合并就看不出来曾经做过合并。\r\n\r\n#### Bug分支\r\n\r\n - 修复bug时，我们会通过创建新的bug分支进行修复，然后合并，最后删除\r\n - 当手头工作没有完成时，先把工作现场 `git stash` 一下，然后去修复bug，修复后，再 `git stash pop`，回到工作现场\r\n\r\n#### Feature分支\r\n\r\n - 开发一个新feature，最好新建一个分支\r\n - 如果要丢弃一个没有被合并过的分支，可以通过 `git branch -D <name>` 强行删除\r\n\r\n#### 多人协作\r\n\r\n - 查看远程库信息，使用 `git remote -v`\r\n - 本地新建的分支如果不推送到远程，对其他人就是不可见的\r\n - 从本地推送分支，使用 `git push origin branch-name`，如果推送失败，先用 `git pull` 抓取远程的新提交\r\n - 在本地创建和远程分支对应的分支，使用 `git checkout -b branch-name origin/branch-name`，本地和远程分支的名称最好一致\r\n - 建立本地分支和远程分支的关联，使用 `git branch --set-upstream branch-name origin/branch-name`\r\n - 从远程抓取分支，使用 `git pull`，如果有冲突，要先处理冲突\r\n\r\n## 标签管理\r\n \r\n#### 创建标签\r\n\r\n - 命令 `git tag <name>` 用于新建一个标签，默认为 HEAD，也可以指定一个 `commit id`\r\n - `git tag -a <tagname> -m \"blablabla...\"` 可以指定标签信息\r\n - `git tag -s <tagname> -m \"blablabla...\"` 可以用PGP签名标签\r\n - 命令 `git tag` 可以查看所有标签\r\n\r\n#### 操作标签\r\n\r\n - 命令 `git push origin <tagname>` 可以推送一个本地标签\r\n - 命令 `git push origin --tags` 可以推送全部未推送过的本地标签\r\n - 命令 `git tag -d <tagname>` 可以删除一个本地标签\r\n - 命令 `git push origin :refs/tags/<tagname>` 可以删除一个远程标签\r\n\r\n## 自定义Git\r\n\r\n#### 忽略特殊文件\r\n\r\n - 忽略某些文件时，需要编写 `.gitignore`\r\n - `.gitignore` 文件本身要放到版本库里，并且可以对.gitignore做版本管理\r\n\r\n#### 配置别名\r\n\r\n - 比如使用st表示status： `$ git config --global alias.st status`\r\n - 配置Git的时候，加上--global是针对当前用户起作用的，如果不加，那只针对当前的仓库起作用\r\n - 每个仓库的Git配置文件都放在.git/config文件中\r\n - 当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中\r\n\r\n## 使用Github \r\n\r\n - 在GitHub上，可以任意Fork开源仓库\r\n - 自己拥有Fork后的仓库的读写权限\r\n - 可以推送pull request给官方仓库来贡献代码\r\n\r\n## 附：Git常用命令表\r\n[Git Cheat Sheet][3]\r\n \r\n\r\n\r\n  [1]: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000\r\n  [2]: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137396287703354d8c6c01c904c7d9ff056ae23da865a000\r\n  [3]: http://www.git-tower.com/blog/assets/2013-05-22-git-cheat-sheet/cheat-sheet-large01.png"}}