初始化
在使用前需要对Git提交用户信息配置
git config --global user.name "66"
git config --global user.emaill "[email protected]"
初始化git仓库,会在项目目录下创建隐藏目录.git保存仓库信息
git init
创建文件并提交
初始化git仓库没有任何内容提交,新建一个文件后,git可检测可能需要版本控制的文件
将文件添加到git版本控制
首次提交后,git会将当前代码分支命名为master
git add 66.css //添加文件
git commit //提交到本地
git push //将本地代码提交到远端仓库
git status //查看仓库状态
代码比较
git diff [commitId]查看代码变化,可指定任意版本号,比较差异
代码切换
checkout命令修改HEAD指针位置,将代码文件内容切换到任意状态,切换不同branch
git branch b2 //创建新分支b2
git checkout b2 //切换到分支b2
什么是HEAD?
当前活跃分支的游标, current branch
文件追踪
git add 66.css
git rm 66.css
.gitignore文件用于排除不受版本控制的目录
代码标签
当代码提交了一个重要版本时可打标签
git tag 1.0 //为当前版本打1.0标签
git tag -l //查看所有标签
tag和commitID地位相同,可出现在diff, checkout, reset等命令中
代码分支
git重要功能,使得代码可并行化
git branch new66 //创建一个new66的新分支
git branch //查看所有分支
如果HEAD指向某版本(例:master),指向branch创建分支,新分支将拥有master分支部分的提交
git merge
把一个分支或某commit修改合并到现在的分支上
git checkout master //迁入master分支
git merge new66 //将new66合并回master分支
合并外部分支时,应保持自己的分支整洁,如有任何HEAD节点中登记未提交文件,git-pull和git-merge命令都将停止
git pull
从其他版本库将代码更新到本地 git pull origin master
git stash
将当前未提交工作存入git栈,时机成熟在取回pop
git config
新增,更改git各种设置
git仓库
工作区:git管理下正常目录
暂存区:存放将要提交文件的快照
历史记录区:git commit后记录
working directory - git add -> stage - git commit -> history
history - git reset -> stage - git checkout -> working directory
git add == git stage
git diff --staged == git diff --cached
为了同svn add区分,设置了git stage
git reset, git revent, git checkout区别
git reset将一个分支的末端指向之前的commit
git reset --[mixed, --soft, --hard]
--mixed 影响暂存区和历史记录区
--soft 只影响历史记录区
--hard 影响工作区,暂存区,历史记录区
直接删除commit记录,会影响其他开发人员的分支
git revert目的同git reset,创建新commit,撤销commit,保留commit记录,较安全
git checkout将HEAD移到另一个新分支,更新工作目录,可能覆盖本地修改,执行前stash或commit暂存区
GitFlow
git操作流程,包含以下5个关键分支
mast 主分支
develop 从mast创建,主开发分支
feature 从develop创建,新功能分支,完成后合并回develop
release 从develop创建,发布分支,发现bug直接在分支改,发布结束合并回develop
hotfix 从mast分支创建,紧急修bug,修复完,同时合并到develop和mast
PR和MR
pull request
merge request
fork为一协作流程,把别人的仓库备份到自己仓库,修改后把东西提交(PR)对方审核
branch不涉及其他仓库,操作都在当前仓库完成,修改后,把东西合并(MR)
Fork和Clone
Fork将别人的仓库复制到自己仓库:
在别人仓库点击“fork”既到自己的仓库
Clone将仓库复制到自己本地电脑中:
git clone https://github.com/willhope/EasyPR.git
添加远程主机upstream用于同步A君仓库更新
git remote add upstream https://github.com/liuruoze/EasyPR.git
同步A君仓库,取回upstream全部更新到本地
git fetch upstream
合并本地master分支
git merge upstream/master
远程仓库
git remote
git默认使用origin标识你所clone的原始仓库
将A君的仓库0,Fork到自己的仓库,再Clone到自己的电脑中,在自己电脑中修改,push到自己的仓库,再pull request让A君搜到请求,决定是否接受我的代码
A君仓库0跟新,我们Fork的项目如何更新?
先fetch网上更新到自己的项目,然后再判断,merge
Rebase和Merge
都可用于合并分支
git merge new66 //将new66与当前分支合并
git rebase new66
基于master创建一个分支new66
master分支修改提交
new66分支修改提交
master和new66分支各自前进,产生了分叉
merge方案:在new66分支用pull命令把master分支修改拉下进行本地合并,生成一个新合并提交(merge commit)
rebase方案:在new66分支执行git rebase master会将new66分支的提交取消,并临时保存为patch,将new66分支作为最新master分支,最后将patch还原到new66,没有新合并提交
Pull和Fetch
Pull = Fetch + merge
git remote
git分布式解构,本地和远程是一个相对的名称
本地repo与远程repo配合完成版本必须要git remote子命令关联,通过git remote add添加当前本地仓库的远程repo,本地repo才知道git push往哪里提交代码
git branch
分支,多版本分支管理
git branch本地分支
git branch -r远程分支
git merge
多人合作开发,合并操作
git push和commitID
本地工作完成后会做一个git commit保存当前工作到本地repo,产生一个commitID,唯一标识一个版本的序列号,git push后,序列号同步到远端repo
git fetch:更新git remote所有远程repo所包含分支的最新commitID记录到.git/FETCH_HEAD中
git fetch remote_repo更新名称为remote_repo的远程repo上所有branch的最新commitID
git fetch remote_repo remote_branch_name
git fetch remote_repo remote_branch_name:local_branch_name