1. GIT基础概念
工作区=> | 暂存区=> | 版本库 |
---|---|---|
当前根目录下的文档以及文档的修改情况 | 存放工作区提交的内容 | 存放暂存区提交的内容,历史操作数据 |
2. GIT基本操作
本地仓库操作 | 命令 |
---|---|
查看工作区状态 | git status |
查看版本库修改日志 | git log –pretty=oneline(单行显示) |
查看操作命令历史 | git reflog |
查看文件异同 | git diff fileName |
工作区=》 暂存区 | git add fileName【stage指定文件】path【stage目录下所有untracked文件】 |
暂存区 =》 版本库 | git commit -m “commont” |
工作区丢弃,恢复到暂存区或者版本库 | git checkout –fileName |
修改版本库指针指向 | git reset versionId(HEAD~1) –hard |
删除版本库文件 | git rm test.txt 因为本地的删除也是对文件的修改,要想真正的删除就只能用命令来删除,如果是误删本地文件,就使用git checkout test.txt来拉回来 |
3. 账号管理SSH Key
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的公钥都添加到GitHub,就可以在每台电脑上往GitHub推送了(当然每个电脑都有自己生成的私钥)。
GIT账号管理 | 命令 |
---|---|
创建SSH Key | ssh-keygen -t rsa -C “youremail@example.com” |
4. 远程仓库
是本地的master分支和远程的master分支进行关联,并且将其称为origin分支。所以git remote命令显示的就是origin
GIT远程仓库管理 | 命令 |
---|---|
添加远程仓库到本地 | git remote add origin git@github.com:michaelliao/learngit.git |
拉取远程指定仓库的指定分支到本地,并与之合并 | git pull <远程主机名> <远程分支名>:<本地分支名> |
推送本地仓库master到origin(指向远程的master),第一次同步,真正的分布式版本库 | git push -u origin master |
同步本地和远程 | 相当于git push (origin master) |
5. 分支管理
首先必须明确的是当前工作区只能处于一种状态,即:当前切换到哪个分支,就是对该分支的修改,当前工作区就是为该分支服务。
分支管理,为什么需要分支,假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。
GIT分支原理,就是在原来的master指针指向的节点上再创建一个分支指针,例如dev,然后再将head指向dev,以后的推送都到了dev了,并且master指向一直不变,保持在了原来的节点。
GIT分支管理 | 命令 |
---|---|
创建一个新的分支并切换到它 | git checkout -b dev |
创建一个分支 | git branch dev |
切换到分支 | git checkout dev |
查看分支(并标识当前分支) | git branch |
切换到指定分支 | git checkout master |
合并指定分支到当前分支 | git merge dev |
删除分支 | git branch -d dev |
6. 冲突解决
GIT冲突解决,为什么会出现冲突,当两个分支都进行了提交的时候,这时分支就真正的分离了开来,那么此时要想把两个分开的提交合并到一起的时候就会有冲突产生
冲突解决 | 操作 |
---|---|
解决冲突 | 1.git diff 查看文件异同,打开文件找到异同点,修改文档并提交 |
2.git add conflctFile添加修改后文件 | |
3.git commit 提交暂存区 | |
4.git branch -d branchName删除分支 | |
5.git log –graph –pretty=oneline –abbrev-commit查看历史记录(图形化查看) |
7. GIT策略
- 禁用fast-forward策略
一般会禁用掉fast-forward,这是因为如果分支没有进行提交,使用fast-forward的情况下,当分支合并后是看不到历史的。所以及时没有提交也是建议使用–no-ff参数来进行merge branch。 - bug分支的处理策略
在接到临时任务并且当前任务没有完成的情况下,你并不想提交,怎么办,建议使用stash功能,git stash可以将当前工作区状态保存到一个地方,当你进行其他操作后,可以查看git stash list 查看stash保存过的内容。使用git stash apply恢复git stash drop来删除,或者直接使用git stash pop恢复的同时删除。可以多次stash,使用git stash apply stash@{0}恢复指定的stash。 - feature分支策略
新功能的开发通用策略,
命令 | 2.bug分支的处理策略 |
---|---|
git stash | stash当前工作区 |
git checkout branchName | 转到修改bug的分支 |
…… | 进行一系列修改与提交合并 |
git stash list | 查看stash的工作区列表 |
git stash apply | 恢复stash |
git stash drop | 删除stash |
git stash pop | 弹出stash,apply的同时并且drop |
命令 | 3.GIT feature 分支策略 |
---|---|
git checkout -b feature-vulcan | 创建并转到新功能开发的分支 |
git add vulan.py | 修改或者添加文件,并添加到暂存区 |
git checkout dev | 切换回dev分支,准备合并到之前的开发分支 |
试图进行合并到dev,合并当然是容易的git merge feature-valan,然后删除分支,但是这时接到了取消该特性的命令,新特性开发要弃掉,但是已经添加到暂存区 | |
如果git branch -d feature-vulcan | 会提示没有合并,无法删除 |
git branch -D feature-vulcan | 如果想强行删除,则会丢掉feature-vulcan分支内容,但是可以让你继续在dev工作 |
8. GIT多人协作
命令 | |
---|---|
git remote [-v] | 查看远程仓库分支名 [详细信息] |
git push origin master | 推送本地master分支到远程仓库 |
分支推送策略 | |
---|---|
master | 主分支,因此要时刻与远程同步; |
dev | 开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; |
bug | 本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug; |
feature | 是否推到远程,取决于你是否和你的小伙伴合作在上面开发。 |
9. 分支管理
同步本地分支与远程分支,创建与删除远程分支。
命令 | |
---|---|
重命名本地分支 | git branch -m devel develop |
git push origin local_branch:remote_branch | 同步本地分支与远程分支。 |
local_branch本地分支;该分支不存在怎会删除远程分支 | |
remote_branch,origin的remote_branch分支;该分支不存在则远程会创建 |
对于一般使用来说以上已经够用了
10. 标签管理
标签其实就是版本库地一个快照。理解虚拟机的同学肯定理解快照功能。本质上也是一个commit指针,但是与分支指针比较起来它不可移动。所以可以commit内容到分支指针,却不可以提交到标签。
命令 | |
---|---|
查看本地tag | git tag -n |
添加本地tag | git tag -a 8-4 -m ‘8-4 微信支付’ |
删除本地tag | git tag -d <tagname> |
查看远程tag | git ls-remote –tags |
获取远程tag | git fetch origin tag <tagnam> |
删除远程tag | git push origin –delete tag <tagname> |
推送本地分支到远程分支 | git push –tags |
常见问题
- 远程分支与本地分支同步和合并方法。这样可以提前预知一下有哪些异同。
通常的做法是
- 把远程仓库master分支下载到本地并存为tmp分支
git fetch origin master:tmp - 查看tmp分支与本地原有分支的不同
git diff tmp
这里主要是看看有没有其他的改动… - 将tmp分支和本地的master分支合并
git merge tmp
这个时候呢,本地与远程就没有冲突了,而且还保留了我今天的代码,现在 Push就OK啦! - 最后别忘记删除tmp分支
git branch -d tmp
- 把远程仓库master分支下载到本地并存为tmp分支
gitignore法则
#有一个需要注意的地方就是,gitignore要在没有add前设置才生效。
#所有后缀文件
*.gitignore
*.iml
#所有名为xxx的目录或文件
Redis-x64-3.2.100
.idea
.project
.settings
.svn
target
logs
redis-desktop-manager-0.8.8.384.exe
deploy
#当前目录下的文件或目录
/config
/zhjs/zhjs-web/
/zhjs/zhjs-web - 副本/
跟踪某个文件夹
!/plutommi/mmi
跟踪某类文件
!*.c
!*.h
跟踪某个指定文件
!/plutommi/mmi/mmi_features.h
修改最后一次提交:
gitaddforgottenfile
git commit –amend
取消已经暂存的文件
git reset HEAD filename
取消文件的修改
git checkout – filename
从文件追踪和本地都删除
git rm file1
从文件追踪删除,本地不删除
git rm - -cached file1