Git使用

214 阅读4分钟

一、Git仓库简单操作

1.创建版本库

mkdir learngit
cd learngit
git init    

2.将文件放入Git仓库

cd learngit
touch readme.txt                        /* 创建文件并进行一些修改 */
git add readme.txt                      /* 将文件添加到暂存区 */
git commit -m "wrote a readme file"     /* 将暂存取文件提交到当前分支 
                                           在创建仓库时自动产生master分支*/

二、Git仓库进阶操作

1.版本回退

git log                                 /* 查看提交历史 */
git log --pretty=oneline                /* 省略作者和提交时间 */
/* log的组成:commit id + HEAD指针 + 提交注释 */
git reset --hard HEAD^                  /* 回退到上个版本 */
git reset --hard HEAD^^                 /* 回退到上上个版本 */
git reset --hard HEAD~100               /* 往前100个版本 */
git reflog                              /* 每一次命令的日志,可找commit id */
git reset --hard 1095a                  /* 可以根据commit id回退到任何的版本 */

2.暂存区与工作区

git status                              /* 此命令可以看到文件的修改、暂存情况 */
git diff HEAD -- readme.txt             /* 此命令可以查看工作区和上交最新版本的区别 */
git checkout -- readme.txt              /* 此命令可以将工作区的修改全部撤销 */       git reset HEAD <file>                   /* 把暂存区的修改撤销掉,重新放回工作区 */

3.git的删除操作

git rm test.txt 
git commit -m "remove test.txt"         /* 将文件从版本库删除 */
/* 若误删工作区的文件 */
git checkout -- test.txt                /* 将删错的文件从版本库恢复 */

三、远程仓库

1.github远程仓库的初始化

/* 在github上点击Create repository创建一个新的仓库 */
git remote add origin git@github.com:yourname/learngit.git /* 将本地仓库与远程仓库进行关联,添加后远程仓库名字就是origin */
ssh-keygen -t rsa -C "youremail@example.com" /* 创建密钥 */
/* 密钥创建成功则在.ssh文件中存在公钥id_rsa.pub和私钥id_rsa */
/* 登陆github->setting-SSH and GPGkeys->将公钥添加入SSH Keys */

2.上传文件到仓库

git push -u origin master /* 第一次使用要加-u */

3.从远程仓库克隆

git clone git@github.com:yourname/gitskills.git

四、分支管理

1.创建与合并分支

git checkout -b dev     /* 创建并切换到dev分支 */
git branch dev          /* 创建dev分支 */
git checkout dev        /* 切换到dev分支 */
git brach               /* 查询所有分支 */
git merge dev           /* 将dev分支的工作成果合并到master分支 */
git brach -d dev        /* 删除dev分支 */

2.解决冲突

/* 前提master分支和其他分支都修改了文件并上交,此时可能会出现合并冲突 */
git merge <brach2>      /* 产生冲突,有下列解决方案 */
/* 1.打开冲突文件对标注有<<<HEAD和分支冲突出进行修改 */
git add <文件>          /* 标记解决方案 */
git commit -m ""        /* 执行 */
/* 2.取消合并 */
git merge --abort       /* 放弃合并*/
git log --graph --pretty=oneline --abbrev-commit /* 图形化、单行、简略id查看合并历史 */

3.分支管理策略

git merge --no-ff -m "" /* 表示禁用Fast forward */
/* --no-ff会让git生成一个新的提交对象。通常我们把master作为主分支,
   上面存放的都是比较稳定的代码,提交频率也很低,而新分支是用来开发
   特性的,上面存在许多零碎的提交,快进式合并会把feature的提交历史混
   如master中,搅乱master的提交历史 */

4.bug分支

/* 突然程序出现BUG需要修复,而当前任务又未完成 */
git stash                   /* 如:当前在dev分支,存储工作现场 */
git checkout <debug brach>  /* 切换到需要debug的分支上 */
git checkout -b issue -101  /* 建立debug分支 */
git checkout master         /* bug修复完成切换回master分支 */
git merge --no-ff -m "fix"  /* 合并分支 */
git checkout dev            /* 回到dev分支 */
git stash pop               /* 恢复并删除stash内容 */
git stash apply             /* 恢复不删除stash内容 */
git stash drop              /* 删除stash内容 */
git cherry-pick <commit id> /* 将该id commit时所作的修改复制带当前分支 */

5.feature分支

/* 添加一个新功能时,最好建立一个feature分支,完成后再合并删除 */
git branch -D <name> /* 强行删除一个没有合并的分支 */

6.多人协作

git remote                  /* 查看远程仓库的信息 */
git remote -v               /* 详细信息 */
git push origin <branch>    /* 推送分支 */ 
/* 另外一位同志 */
git branch dev              /* 创建dev分支 */
git branch --set-upstream-to dev origin/<dev> /* 与远程分支建立链接 */
git pull                    /* 拉取仓库文件进行合并 */ 

五、标签管理

git tag <tag-name>              /* 默认将标签打在最新提交的commit上 */
git tag <tag-name> <commit-id>  /* 打在某次commit上 */
git tag                         /* 查看标签 */
git show <tag-name>             /* 查看标签信息 */
git tag -d <tag-name>           /* 删除标签 */
git push origin <tag-name>      /* 推送标签到远程 */
git push origin --tags          /* 一次性推送全部尚未推送到远程的本地标签 */
/* 对于已经推送到远程的标签 */
git tag -d <tag-name>
git push origin :refs/tags/v0.9 /* 删除标签 */

六、提高github搜索效率

in:name xxx         /* 按项目名搜索 */
in:readme xxx       /* 按README搜索 */
in:description xxx  /* 安装description搜索 */
stars:>xxx         /* stars数大于xxx */
forks:>xxx          /* forks数大于xxx */
language:xxx        /* 编程语言是xxx */
pushed:>YYYY-MM-DD  /* 最后更新时间大于YYYY-MM-DD */