简介
Git 是一个版本控制系统,功能类似 SVN、CVS,相比我之前使用过的 SVN,他功能更强大,比如离线使用、分支逻辑等。
基础操作
git clone: 克隆远程资料库
git checkout: 将所有文件重置到某个 commit 之前的版本
git init : 初始化当前目录(产生 .git 目录)
git status <-s>: 当前 git 目录的状态信息<short 格式输出>
git add: 将文件从 Working directory 添加到 Staging area
git commit: 将文件从 Working directory 添加到 Repository (提交信息样式)
git log: 获取历史 commit 信息(ID/Author/Date/Commit Files)
修改撤销
git checkout -- xx:在 Working directory 重置修改(即是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”)
git reset HEAD xx:在 add 到 Staging area 但未 commit,可取消掉 add 操作
git reset HEAD~1:往上撤回一次提交(Repository),不保存修改历史(本地处理方案,仅仅是 HEAD 指针的指向修改)
- git reset --hard commit_id 重置到某一次提交(可以往前或者往后)
- git reflog 查看命令历史
git revert HEAD:往上撤回,但属于往后新建提交节点(远程处理方案)
修改对比
git diff id_1 id_2: 获取 id_2 中对 id_1 的变更内容(类似 Linux 命令 diff -u a b)
- 第一行是比较的文件信息
- 第二行表示两个版本的git哈希值(index区域的8aa8763对象,与工作目录区域的88394ef对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)
- --- 表示删除,+++ 表示新增
- @@ -1,3 +1,7 @@ 表示 第一个文件第一行连续 3 行发生变化,第二个文件第 3 行连续 7 行发生变化
git diff: 不带参数,获取 Working directory 中未添加到 Staging area 中的文件差异
git diff --stage: 获取 Repository 与 Staging area 中文件差异
git show commit_id: 获取 commit_id 与其父级提交中的更改(省略 commit_id 则默认为最近的)
分支操作
git branch <-a>: 查看本项目分支<远程分支>
git branch branch_name: 新建分支
git checkout branch_name: 切换分支(联系到 HEAD 的指向)
git checkout -b branch_name: 新建并切换至分支 branch_name
git branch -d branch_name: 删除分支标签(保留 commit 信息)
git merge branch_a branch_b: 合并分支 a 和 b
- 添加 a/b 中相对父级中不存在的添加提交
- 删除 a/b 中相对父级中的删除提交
- 当 a/b 中出现冲突,人工处理
<<<<<<<HEAD
my code
||||||| merged common arcestors
origin version code
=======
current master code
>>>>>>>master
日志操作
git log: 获取历史 commit 和分支合并信息<只展示 commit id 和 commit 说明
- git log --[pretty=]oneline 每次提交日志显示一行
- git log --graph 详细日志左边多了一列线条区分每次提交
git rebase:变基
远程操作
git remote <-v>: 获取当前远程资料库<详细信息>
git remote add <origin> git@github.com:xxx/xx.git: 添加远程资料库本地名称为 <origin> (默认)
git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git:添加上游远程资料库
git push origin master: 推送 master 分支到 origin 远程资料库
git pull orgin master: 拉取并合并到本地 master 分支
#等价于 fetch + merge
git fetch origin #拉取远程资料库到本地 origin/master
git merge master origin/master #更新合并本地 master 分支
当多人协作开发的时候,一般不直接 push master 分支,而是通过 pull master 拉取最新的 master 分支到本地,然后与本地分支合并同时处理可能存在的 conflict ,再 push 本地分支到远程资料库,最后提出 pull request 请求合并到 master 分支。
Git error
should not be doing an octopus : 合并多个不同代码版本的一种策略(octopus),如果不适合的情况下使用,则出现此消息
You are in 'detached' HEAD' state : 重置到之前的版本出现此提示消息(git reset --hard commit_id 回退)
fatal: you current branch 'master' does not have any commits yet : (HEAD 是当前提交的名称)当没有任何提交情况下执行 git log 出现此错误
如果同步 fork 的仓库
git fetch upstream
git merge upstream/master
git push origin master