分布式版本控制工具
-
集中式:版本库集中存放在中央服务器(自己电脑没有,每次必须联网拉取),必须联网才能工作;CVS是目前用的最多的开源且免费的集中式版本控制系统;
-
分布式:每台电脑都是一个完整的版本库。
本地版本库
创建版本库(仓库)
mkdir myCode
cd myCode
pwd //显示当前目录
git init //创建版本库
ls -ah //可以看到隐藏的.git目录,用于跟踪管理版本库
//将文件添加到仓库
git add readme.txt
//将文件提交到仓库,-m后面输入本次提交的说明
git commit -m "wrote a readme file"
//查看结果
git status
//查看修改的内容
git diff readme.txt
版本回退
回退的时候git仅仅是移动HEAD指针的位置,所以操作非常快。
//查看提交日志
git log
git log --pretty=oneline //简介版
//查看命令历史
git reflog
//回退
git reset --hard HEAD^ //回退到上一个版本
git reset --hard HEAD^^ //回退到上上个版本
git reset --hard HEAD~8 //回退到往上第八个版本
git reset --hard commit_id //回退到id版本
工作区和暂存区
-
工作区:在电脑里能看到的目录;
-
版本库:工作区的隐藏目录
.git;版本库包含stage(index)暂存区和分支、指针HEAD;git add:把文件添加到暂存区git commit:把暂存区内容添加到版本库//丢弃readme工作区的修改 git checkout -- readme.txt //把暂存区内容回退到工作区 git reset HEAD readme.txt
删除文件
git rm test.txt //从版本库中删除该文件
远程仓库
//添加远程库
git remote add origin "仓库地址" //origin是指定的远程仓库名
//推送到远程
git push -u origin master //-u可以关联本地master和远程master,后期可以直接git push,git pull
//查看远程仓库
git remote -v
//删除远程库origin(解除和远程库的绑定关系)
git remote rm origin
//克隆仓库
git clone "仓库地址"
分支管理
创建与合并分支
//创建并切换到分支dev
git checkout -b dev
//相当于
git branch dev //创建分支
git checkout dev //切换分支
//查看当前分支
git branch
//合并分支,先切换到目标分支
git checkout master
git merge dev
//删除分支
git branch -d dev
//分支未合并,强行删除,用大写的D
git branch -D dev
//切换分支时也可以使用switch
git switch dev //切换到已有分支
git switch -c dev //创建并切换到新的dev
解决冲突
//查看冲突文件
git status
//查看分支合并情况
git log --graph --pretty=oneline --abbrev-commit
分支管理策略
-
master:仅用于发布新版本
-
dev:用于开发
-
feature:用于新功能开发
-
issue:修复BUG
//--no-ff 禁用Fast forwar
git merge --no-ff -m "message" dev
//抓取远程分支dev并切换到该分支
git checkout -b dev origin/dev
//关联本地分支与远程分支
git branch --set-upstream-to=origin/dev dev
git branch --set-upstream dev origin/dev
//推送远程
git push origin dev
//抓取远程
git pull origin dev
复制一个特定的提交到当前分支
git cherry-pick commit-id
暂存
//暂存
git stash
//查看暂存栈
git stash list
//恢复但不删除栈顶的暂存
git stash apply
//删除栈顶的暂存
git stash drop
//恢复并删除栈顶到暂存
git stash pop
Rebase 变基:将提交到某一分支上的所有修改移动到另一分支
当前分支dev,rebase master会先将dev上与master共同的祖先节点之后的节点先撤销掉,放到缓存里面,HEAD指向master分支,再将缓存的提交一个个新增到master分支后面,中间可能需要处理多次冲突。
标签管理
//查看所有标签
git tag
//打标签1.0.00,默认标签搭载最新的commit上
git tag v1.0.00
//在某个commit上打标签
git tag v1.0.01 commit_id
//查看标签信息
git show v1.0.01
//创建带有说明的标签,-a指定标签名,-m指定说明文字
git tag -a v1.0.02 -m "version 1.0.02 released" commit_id
//删除本地标签
git tag -d v1.0.02
//删除远程标签
git tag push :refs/tags/v1.0.02
//推送标签到远程
git push origin v1.0.01
//一次性推送全部标签到远程
git push origin --tags
标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。
- GIT
撤销文件的修改
-
工作区的修改(还未add)
$ git checkout -- 文件名 //回到最近一次的add或commit $ git checkout . //撤销所有文件的修改 -
暂存区的修改(已经add但从未commit过)
git rm --cached 文件名 //放弃该文件的暂存,需要修改后再次add -
暂存区修改(已经add之前也有commit记录)
git reset HEAD file //让该文件回到工作区的状态 git chekcout -- file //git chekcout -- file -
撤销仓库的提交注意要先备份
git log commit_id1 (要回退的) commit_id2 (要回退的) commit_id3 (要回退的) commit_id4 (目标版本)
假设要回退掉commit_id1,则commit_id需要指定为commit_id2
/** * soft:保留工作区和缓存区,版本差异存放在缓存区,用于合并多个commit * mixed(默认):保留工作区,清空缓存区,版本差异存放在工作区,用于修改错误commit 或者git reset HEAD后清空缓存区 * hard:慎用!!!,清空暂存区和工作区,放弃目标本后的所有修改 **/ //把commit_id1的修改恢复到暂存区,版本库保留提交记录 git reset --soft commit_id2 //把commit_id的修改恢复到工作区,版本库保留提交记录 git reset --mixed commit_id2 git reset --soft|mixed|hard cedc856 //本地使用 get reset --hard ,切换到特定的commit,该commit是要撤销的前一个commit,即要保留的commit git push --force origin master //使用 --force推送到远程分支 -
回退到某个版本
git reset ID file //回退 git commit file //提交历史版本 git checkout file //把工作区给回退了 -
撤销某个提交的修改
git revert commit_id //解决冲突后提交修改即可
修改commit信息
-
刚刚commit未push == 刚刚commit且已经push,输入命令即可进入vi界面,修改完成后wq保存退出,即修改本地暂存区提交。如果已经提交远程,需要push提交修改。
git commit --amend git push origin 分支 //已经push需要再次提交修改 -
修改历史记录,合并commit节点
git rebase -i HEAD~n //n为记录数,将会显示n个记录 //将要修改的记录的pick修改为edit,wq保存退出,当前指针将会指向要修改的命令。接下来的操作同情况一 git commit --amend git push origin 分支 //-f 强制提交pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
检出节点:将A分支的某个commit提取到B分支
git checkout A
git log //找到要提取到commit记录的哈希码ID
git checkout B
git cherry-pick ID //此时可能有冲突,合并冲突后提交就行了
标签TAG
-
查看标签
git tag -
创建标签
git tag 标签名 -
推送标签到远程,如果此时有要推送到远程的东西,先comiit,推送标签时会把内容同时推送
git push origin 标签名 -
删除本地标签
git tag -d 标签名 -
删除远程标签
git push origin :refs/tags/标签名
暂存STASH
-
暂存
git stash [save message] -
查看暂存列表
git stash list -
恢复(只能一次,恢复同时删除记录)
git stash pop [stash@{num}] //不指定num,恢复最近暂存的记录 -
恢复(可多次,恢复不删除记录)
git stash apply [stash@{num}] //同上 -
删除某个记录
git stash drop [stash@{num}] -
删除所有的记录
git stash clear
将master当前commit提交到另一个分支mmc
git push origin master:mmc //先在master上commit
分支管理
git branch //查看本地分支
git branch -r //查看远程分支
git branch checkout master //切换到master分支
git branch -d dev //删除dev分支
git branch -D dev //强制删除dev分支,-d不管用则使用-D
git push origin --delete dev //删除远程分支(不要想不开啊)
git checkout -b dev //创建并切换分支
-
拉取远程分支并创建本地分支
//方法一: git checkout -b dev origin/dev //创建本地分支并自动切换,然后关联远程分支 //方法二: git fetch origin dev:dev //拉取远程dev到本地dev,如果本地没有dev会自动创建
将dev的某一个文件同步到master
git checkout master
git checkout --patch dev path //path是文件所在的路径,该路径是当前命令行地址的相对路径
fetch和pull的区别
fetch=pull+merge
git fetch origin master //拉取远程分支到本地
git log -p master..origin/master //比较拉取到远程分支和本地
git merge origin/master //将拉取的远程分支合并到本地
git fetch origin master:master //将远程master拉取到本地master
git diff master //比较master差异
git merge master //合并master
git pull origin master //一句抵三句,终极boss
git add . + git commit -m "" == git commit -am ""
修改删除本地commit节点
1. git log //查看提交信息
2. git rebase -i commitId //commitId是不需要合并的commit点hash值,即需要合并的commit的前一个commit
3. 进入编辑界面,pick即一动不动,squash是保留commit信息将自己合并到上一个commit点,fixup同squash但不保留commit信息编辑完成保存退出,drop删除commit点
回退
- 整个本地仓库回退
git reset --hard HEAD^
git reset --hard commit_id
//上一个版本就是`HEAD^`,上上一个版本就是`HEAD^^`,当然往上100个版本写100个`^`比较容易数不过来,所以写成`HEAD~100`
回滚到某个版本并备份: 1.git fetch origin dev:newBranch先备份分支,切换到新的分支上操作 2.在Git面板中找到要回滚的提交记录,右键选中copy revision number复制版本ID,git reset --hard ID,强制回退到指定版本 3.git push origin newBranch 将本地分支推到远程
-
本地某个文件回退
git log fileName #查看要回退的版本ID git checkout ID fileName #直接就回退了 -
远程某个文件回退:
git reset version_code file_name git commit -m 回退信息 //这时才可以在commit看到修改内容 git checkout file_name //回退到工作区 git push origin //提交到远程
查看
git status //工作区
git log //提交记录
git log --pretty=oneline
git reflog //查看命令历史
git diff HEAD -- filename //查看工作区和版本库里最新版本的区别
概念
工作区 暂存区: git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit`就可以一次性把暂存区的所有修改提交到分支。删除文件: 先删除工作区文件,再删除版本库文件,提交 rm filename git rm filename git commit -m "注释"
git reset
前情提要:在某次乱七八糟的提交push后,丢失了一个从未push的文件
git reflog //查看命令历史
git rebase --hard reflog_id //hard可以回退工作区内容,soft和mixed不可以,备份文件后再rebase到之前到节点
--hard:重置工作区和暂存区 --soft:重置暂存区,保留工作区 --mixed(默认):清空暂存区,保留工作区
远程库相关
关联本地到远程仓库
git init //初始化本地仓库
git remote add origin url //关联到远程仓库,https格式的url首次推送时需要输入账号密码,github已不再维护。s sh格式的url需要将本机的ssh公钥保存到github账户中才可以进行推送。
git remote -v // 查看远端仓库地址
git remote rm origin //删除远端仓库地址
github 添加 ssh 公钥
#创建 ssh
cd ~/.ssh
ssh-keygen #生成密钥,中间有两次需要输入口令,直接回车跳过,避免后期在使用密钥时就输入口令
ls #查看目录
cat id_ira.pub #查看公钥,将其复制到 github->settings->ssh and gpy keys->new ssh key,确定即可
删除文件
git rm -r --cache file_name #文件夹加上--cache参数,递归删除子文件
git commit -am “删除文件”
git push origin master
马甲包复制仓库
//1. 复制本地文件夹,-r参数表示递归复制,针对复制文件夹
cp -r KKBooster KKLite
//2、进入KKLite
cd KKLite
//3、删除远程库origin
git remote rm origin
//4、创建孤立分支用于重置历史记录
git checkout --orphan new-branch
//5、将当前文件添加到新分支
git add -A
git commit -am "init"
//6、使用-D删除所有的旧分支
git branch -D master
//7、将孤立分支重新命名为master
git branch -m master
//8、删除所有标签
git tag -l | xargs git tag -d
//9、添加新的远程库
git remote add origin "ssh/link"
//10、推送到远程
git push origin master
已经创建工程后如何设置仓库
//先初始化
git init
//添加仓库
git remote add origin "仓库链接"
git add .
git commit -am "init"
git push origin master