Git新人快速上手指南

560 阅读3分钟

Git快速上手指南

廖雪峰Git教程

安装初始化

MAC环境

官网下载安装https://git-scm.com/

Windows环境

官网下载安装https://git-scm.com/

配置初始化

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

此处需要根据公司需求,设置用户名和邮箱。一般使用公司邮箱。

删除某个配置

$ git config --unset user.name

git config

git config有三个级别:

  1. system(系统级别)
  2. global(用户级别)
  3. local(仓库级别)

优先读取local,其次是global,最后是system。

通过以下命令可以查看相应级别配置

$ git config --system --list
$ git config --global --list
$ git config --local --list

GitHub

GitHub使用方式

建立SSH连接

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,设置密码后,每次git pullgit push时都会进行密码验证,建议不设置密码。

如果一切顺利的话,可以在用户主目录里,windows一般位于C:\Users\用户名找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

NJ7Fv8.pngNJ7igf.png

然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key。

SSH连接的原因:因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。

如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。

公司一般使用GitLab,设置方法大同小异。

Git基本图解

NJTvHH.png

常用命令

git add

添加某个文件

git add <file>

添加所有文件

git add .

git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。

git commit

提交当前添加文件,并添加注释message。

git commit -m <message>

注意各个公司的代码注释规范。以阿里规范为例:阿里前端Git提交日志格式规约

type类型:

  • feat: 新增功能。

  • fix: 修复 bug。

  • docs: 文档相关的改动。

  • style: 对代码的格式化改动,代码逻辑并未产生任何变化。

  • test: 新增或修改测试用例。

  • refactor: 重构代码或其他优化举措。

  • chore: 项目工程方面的改动,代码逻辑并未产生任何变化。

git status

仓库当前的状态

$ git status

对比某个文件的差异

$ git diff <filename>

git log

查看commit提交日志

$ git log

简洁版

$ git log --pretty=oneline

git reset

回退版本

根据git log得到的日志,获取commit_id进行版本回退。git中用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

$ git reset --hard commit_id

当然如果回退到某个版本后,发现操作失误,想要回到“未来”也是可以的。通过git reflog找到对应的commit_id即可。

$ git reflog

暂存区回退工作区

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

$ git reset HEAD <file>

git checkout

丢弃工作区修改

git checkout -- file可以丢弃工作区的修改,注意命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

$ git checkout -- file

这条命令的意思是:把file文件在工作区的修改全部撤销,这里有两种情况:

  1. file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
  2. file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

注意:git checkout -- file其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

切换分支

新版本的git switch命令更加符合语意

$ git checkout <branchname>
$ git switch master

创建并切换分支

$ git checkout -b <branchname>
$ git switch -c dev

创建与远程分支一致的分支

$ git checkout -b dev origin/dev

git push

关联远程仓库

要关联一个远程库,使用命令

$ git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容

向远程推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

$ git push origin master

git clone

当远程有一个仓库时,通过以下命令,可以克隆出一个本地库。

$ git clone git@github.com:username/repository.git

Git支持两种协议,ssh和https。

git branch

查看分支

$ git branch

创建分支

$ git branch <branchname>

删除分支

$ git branch -d <branchname>

当一个分支还没有合并到其他分支,强行进行删除时,可以使用:

$ git branch -D <branchname>

建立本地分支与远程分支连接

$ git branch --set-upstream-to <branch-name> origin/<branch-name>

git merge

在GitLab中一般在左侧菜单栏发起merge请求。

Fast forward模式

此模式合并看不出来曾经做过合并,所以不推荐

git merge命令用于合并指定分支到当前分支。在master分支上执行下面的命令,含义是:将dev分支合并到master分支上

$ git merge dev

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

通过带参数的git log可以看到分支合并图

$ git log --graph --pretty=oneline --abbrev-commit

普通模式

合并后的历史有分支,能看出来曾经做过合并

因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。

$ git merge --no-ff -m "merge with no-ff" dev

通过带参数的git log可以看到分支合并图

$ git log --graph --pretty=oneline --abbrev-commit

git stash

将当前工作区进行储存。也就是说当前分支可以不进行add和commit操作,就可以切到新的分支,回头可以恢复到储存的状态。

$ git stash

通过git stash list命令查看储存,恢复储存有两种方式:

  1. git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除
  2. git stash pop,恢复的同时把stash内容也删了

可以使用多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令进行恢复

$ git stash apply stash@{0}

git cherry-pick

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。其中的<commit_id>指的是在修复bug后,进行提交的commitId。

$ git cherry-pick <commit_id>

git remote

远程仓库的默认名称是origin,要查看远程库的信息,用git remote。使用git remote -v显示更详细的信息。

$ git remote [-v]

git tag

为某个commit打上标签tag,方便查找。tag是与commit_id绑定的,所以如果多个分支上同一个commit_id,那么都会有tag。

首先,切换到需要打标签的分支上:

$ git branch
$ git checkout master

然后,敲命令git tag <name>就可以打一个新标签:

$ git tag v1.0

可以用命令git tag查看所有标签:

$ git tag

对某次commit进行打标签

$ git tag v0.9 commit_id

可以用git show <tagname>查看标签信息

创建带有说明的标签,用-a指定标签名,-m指定说明文字:

$ git tag -a v0.1 -m "version 0.1 released" commit_id

删除标签

$ git tag -d v0.1
  • 命令git push origin <tagname>可以推送一个本地标签;
  • 命令git push origin --tags可以推送全部未推送过的本地标签;
  • 命令git tag -d <tagname>可以删除一个本地标签;
  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

开发流程

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>