一、创建版本库
- 初始化一个Git仓库,使用
git init
命令。 - 添加文件到Git仓库,主要分两步:
- 第一步,使用命令
git add file
注意,可反复多次使用,添加多个文件; - 若多人操作通常 还使用命令
git pull
可以将自己提交的和小伙伴们提交进行整合,下拉得到最新版本项目 - 第二步,使用命令
git commit -m "说明"
,完成提交。 - (最后)若多人操作通常,使用命令
git push
,将本地库的内容推送到远程。
- 第一步,使用命令
二、 查看当前状态
- 要随时掌握工作区的状态,使用
git status
命令 - 如果
git status
告诉你有文件被修改过,用git diff
可以查看修改的内容
三、 版本回退
HEAD
指向的版本为当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --head commit_id
HEAD
表示当前版本,上一个版本就是HEAD^
,上上一个版本就是HEAD^^
,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
。或者指定版本Idcommit_id
- 穿梭前,用
git log
可以查看提交历史 ,以便确定要回退到哪个版本。如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline
参数查看。git log --pretty=oneline
- 要重返未来,用
git reflog
查看命令历史,以便确定要回到哪个未来的哪个版本。
四、 工作区和暂存区
- 工作区:就是你在电脑里能看到的目录,一个项目(文件夹)
- 暂存区: 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为
stage
(或者叫index
)的暂存区,还有Git为我们自动创建的第一个分支master
,以及指向master
的一个指针叫HEAD
。
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add
把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
五、 管理修改
- 多次修改时,第一次修改 ->
git add 修改过的文件
-> 第二次修改 ->git add 修改过的文件
->git commit
提交后,用git diff HEAD -- file
命令可以查看工作区和版本库里面最新版本的区别 - 多次修改时, 也可使用
git add .
意思是: 添加全部修改
六、 撤销修改
修改全部撤销,这里有两种情况:
- file自修改后 未被放到暂存区,现在,撤销修改就回到和未修改前版本库一模一样的状态,使用命令
git checkout -- file
- flie 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态, 使用命令
git reset HEAD file
(退回到未被放到暂存区) - >git checkout -- file
(回到和未修改前版本库一模一样的状态)
七、 删除文件/远程库
- 命令
git rm file
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。 - 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本
git checkout -- file
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
-删除已关联的名为origin的远程库git remote rm origin
八、关联远程库
- 要关联一个远程库,使用命令
git remote add origin git@github.com:你自己的GitHub账户名/你的仓库名.git
- 关联后,使用命令第一次推送:
git push -u origin master
, 由于远程库是空的,我们第一次推送master
分支时,加上了-u参数,Git不但会把本地的master
分支内容推送的远程新的master
分支,还会把本地的master
分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 - 此后,由于不是第一次推送内容,每次本地提交后,只要有必要,使用命令
git push origin master
就可以推送最新修改
九、 从远程库克隆
- 要克隆一个仓库,首先必须知道仓库的地址,然后使用
git clone git@github.com:你自己的GitHub账户名/你的仓库名.git
命令克隆。 Git
支持多种协议,包括https
,git clone https://github.com/你自己的GitHub账户名/你的仓库名.git
但通过ssh
支持的原生git
协议速度最快。
十、创建与合并分支
Git鼓励大量使用分支:
- 查看所有分支:
git branch
,当前分支前面会标一个 * 号。 - 创建分支:
git branch <branchName>
- 切换分支:
git checkout <branchName>
- 创建+切换分支:
git checkout -b <branchName>
- 合并某分支到当前分支:
git merge <branchName>
- 删除分支:
git branch -d <branchName>
- 强行删除分支:
git branch -D <branchName>
十一、解决冲突
- Git用
<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容 - 当Git无法自动合并分支时,就必须首先 手动解决冲突。解决冲突后,再 添加修改, 再提交,合并完成。
- 用
git log --graph --pretty=oneline --abbrev-commit
命令可以看到分支合并图。
十二、分支管理策略
- Git分支十分强大,在团队开发中应该充分应用。
- 合并分支时,加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。git merge --no-ff -m "说明" branchName
十三、Bug分支
- 修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除
- 当手头工作没有完成时,先把工作现场
git stash
一下,然后去修复bug,修复后,回到工作现场。Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:
- 一是用
git stash apply
恢复,但是恢复后,stash
内容并不删除,你需要用git stash drop
来删除 - 另一种方式是用
git stash pop
,恢复的同时把stash内容也删了
- 一是用
- 你可以多次
stash
,恢复的时候,先用git stash list
查看,然后恢复指定的stash
,用命令:$ git stash apply stash@{0}
十四、多人协作
当你从远程仓库克隆时,实际上Git
自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
。
- 查看远程库信息,使用
git remote -v
- 本地新建的分支如果不推送到远程,对其他人就是不可见的
- 从本地推送分支,使用
git push origin branch-name
推送自己的修改 - 如果推送失败,则因为远程分支比你的本地更新, 需要先用
git pull
抓取远程的新提交试图合并 - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用
git push origin branchName
推送就能成功! - 如果
git pull
提示“no tracking information”
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branchName origin/branchName
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
十五、标签管理
添加标签
- 命令
git tag <name>
用于新建一个标签,默认为HEAD
,也可以指定一个commit id
git tag -a <tagname> -m "说明"
可以指定标签信息git tag -s <tagname> -m "说明"
可以用PGP签名标签- 命令
git show <tagname>
查看标签信息 - 命令
git tag
可以查看所有标签 - 标签不是按时间顺序列出,而是按字母排序的
删除标签
- 命令
git push origin <tagname>
可以推送一个本地标签 - 命令
git push origin --tags
可以推送全部未推送过的本地标签 - 命令
git tag -d <tagname>
可以删除一个本地标签 - 命令
git push origin :refs/tags/<tagname>
可以删除一个远程标签。
十六、忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git
就会自动忽略这些文件。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的
.class
文件 - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
步骤:
- 忽略某些文件时,需要编写
.gitignore
.gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理- 如果你确实想添加该文件,发现添加不了,可以用
-f
即git add -f file
强制添加到Git
- 或者你发现,可能是
.gitignore
写得有问题,需要找出来到底哪个规则写错了,可以用git check-ignore
命令检查git check-ignore -v file
仅是个人的总结而已,若有什么不妥的地方请大家多多指教。