学习git
git工作区和本地仓库
- 创建本地版本库
mkdir learnGit
cd learnGit
git init
- 添加到暂存区
touch learn.md
open learn.md
git add learn.md // 把工作区修改内容添加到暂存区
git commit '创建了一个learn文件' //commit 只提交添加到暂存区的修改
touch more.md
touch three.md
git add .
git commit '创建了两个新文件'
- 查看工作区和暂存区状态
git status
git diff //查看具体不同的地方在哪
- 查看git提交历史记录
git log
git log --pretty=oneline //精简git日志
通过指定提交记录在git中移动
git checkout f2dhex //通过节点hex值移动HEAD
//相对引用
git checkout master^ //让HAEAD指向master的上一个提交节点
git checkout master^^ //让HAEAD指向master的前两个提交节点
git checkout master~3 //让HAEAD指向master的前三个提交节点
git branch -f master HEAD~3 //将 master 分支强制指向 HEAD 的第 3 级父提交。
- git回退版本(工作区和暂存区没提交到本地仓库的内容会丢失)
// 回退版本的前提是你还没有提交到远程仓库
git reset --hard HEAD^ //回退到上一个版本 HEAD^^ 回退到上两个版本
git reset --hard 103a4d //到指定版本
- git查看历史命令日志
git reflog
- git工作区和版本库
- git撤销修改
git checkout -- learn.md //只撤销工作区的修改,不会撤销添加到暂存区的修改
git reset HEAD <file> //把暂存区的修改撤销掉(unstage),重新放回工作区:
- git删除文件
//工作区手动删除了一个文件,让版本库和工作区保持一至、
rm more.md
git status
git rm more.md
git commit -m '删除了文件more.md'
// 工作区误删文件,用版本库的恢复回来
git checkout -- three.md //git checkout其实是用版本库里的版本替换工作区的版本
git远程仓库
- 同步远程仓库
// 远程仓库并添加密钥
1. ssh-keygen -t rsa -C "wjsanshaoyan@163.com"
2. 找到/Users/wangjing/.ssh/id_rsa.pub
3. 复制粘贴里面全部内容到gitee的SSH
4. ssh -T git@gitee.com(第一次输入yes,让gitee把我们的密钥记录下来,测试匹配成功没
// 关联远程仓库
git remote -v //看看有没有关联的远程仓库
// 有 比如是origin
git remote rm origin //删除已关联的名为origin的远程库
git remote rename origin(以前的名字) oschina(要修改的名字) //修改远程仓库名字
git remote set-url origin 仓库地址 //修改仓库对应的远程仓库地址
// 没有
git remote add gitee git@gitee.com:wangjing5676/learnGit.git //再关联码云的远程库
git remote add github git@gitee.com:wangjing5676/learnGit.git //还可以再关联github的远程仓库
// 关联好以后
git clone git@gitee.com::wangjing5676/learnGit.git [自定义名字]
git pull gitee master //[git pull相当于git fetch和git merge的合并](https://blog.csdn.net/riddle1981/article/details/74938111)
git pull gitee master --allow-unrelated-histories //容许合并不相关历史
git push -u gitee master //把本地提交推送到远程仓库(-u表示跟踪远程分支,下一次直接git push)
git本地分支
- 分支
git checkout -b dev // 加上-b相当于新增并切换到dev分支
git branch //查看分支
// 现在提交的内容在dev分支上
git checkout master //切换到master分支
git merge dev //把dev分支合并到master分支(实际上就是把master指针指向了dev分支最新提交)
git branch -d dev //合并完成可以删除dev分支
cat.git/HEAD //查看HEAD指向
git symbolic-ref HEAD //如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向
- 解决冲突
git checkout -b 分支名 //创建宾切换到新分支
// ...修改些内容
git checkout master //切换回master
// ...修改些内容
git merge 分支名 //合并
// ...冲突产生,手动合并
git add .
git commit -m 'conflict fixed'
git log --graph //看到分支合并图
git branch -d 分支名 //删除这个分支
git merge --no-ff -m "merge with no-ff" dev //--no-ff表示普通合并,合并后会提交一次,合并后的历史有分支,能看出来曾经做过合并
- bug分支
// 当前正在dev上进行的工作还没有提交,来了一个bug修复任务
git stash //把当前工作现场“储藏”起来,等以后恢复现场后继续工作
// 如果bug在master分支,切换到master分支再创建bug分支,改完bug合并到master删除bug分支,最后切换回到dev继续开发
git stash list //查看工作现场存储列表
// 恢复工作现场
git stash apply stash@{0}//恢复 加上stash@{0}可以指定多个存储的其中一个
git stash drop //删除stash
git stash pop //恢复的同时把stash内容也删了
- 试验功能分支(随时有可能整个模块二删除的)
git branch -D <name> // 丢弃一个没有被合并过的分支用git branch -D <name>强行删除
- 多人协作
// 把该分支上的所有本地提交推送到远程库,推送时要指定本地分支。
// 这样,Git就会把该分支推送到远程库对应的远程分支上
git push gitee master
查看远程库信息,使用git remote -v;
// 步骤
1. 本地新建的分支如果不推送到远程,对其他人就是不可见的;
2. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
//git pull origin master:brantest 将远程主机origin的master分支拉取过来,与本地的brantest分支合并。
// 冒号可以省略,本地分支不添加表示当前分支
3. 在本地创建和远程分支对应的分支,使用git checkout -b gitee/<branch> dev,本地和远程分支的名称最好一致;
4. 建立本地分支和远程分支的关联,使用git branch --track gitee/<branch> dev是创建一个新分支,并关联;git branch --set-upstream-to=gitee/<branch> dev 建立本地和远程关联
5. 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。