Git及Github实用教程
本文是一个小小的github操作指南,由于时间有限,没有办法把很多细节以及概念讲解清楚。不过,如果想要速查一些命令,还是比较有用的。
1. 准备事项
1. 注册github账号
用邮箱在github注册一个账号,设置一个用户名,记住密码。之后本地的git也会用到这个邮箱和用户名
2. 在本地安装git
由于这些步骤过于简单,就不在这里详述了,以后有时间的话再补上吧
3. git初始设置
- 设置用户名和邮箱
git config --global user.name "Firstname Lastname"
git config --global user.email "your_email@example.com"
- (可选)安装color.ui
如果安装了color.ui,界面会更好看,可读性更强。
git config --global color.ui auto
- 设置SSH
github上已有仓库的认证,是通过使用了SSH的公开密钥认证方式进行的。下面设置SSH key,并将其添加到github。
ssh-keygen -t rsa -C "your_email@example.com"
执行完这一步之后,会创建一个名为id_rsa.pub的文件。默认情况下,id_rsa.pub是存放在~/.ssh目录下的。打开id_rsa.pub,将里面的内容复制到剪切板。打开浏览器的github,找到Account setting,点击Add SSH Key,将内容粘贴过去。如果添加成功,所用邮箱会收到一封邮件。
2. 使用git创建版本库
git最大的功能就是可以创建多个版本库进行管理,从而更加便于开发。
1. 初始化git目录
- 首先创建一个空目录,然后进入这个目录
git init
执行了这一命令之后,这个目录下就会生成一个.git文件夹,表示这已经是一个git仓库了。我们将这个目录的内容称为隶属于这个仓库的文件树,文件的编辑等操作在这里进行,然后记录到仓库中。
- 查看当前状态
git status
这一命令可以查看当前仓库的状态,处于什么分支,是否有待提交的文件等。是一个十分有用的命令。
比如这张图,显示我们当前处于master分支,没有要commit的文件。
- 提交修改
git add 文件名
git commit -m "注释"
或者
git commit -am "注释"
- 查看git已跟踪文件
git ls-files
- 移除git仓库文件
git rm file_name # 会将本地文件同时删除
git rm --cache file_name # 保留本地文件,从git仓库中移除
对文件进行编辑和修改后,可以用以上的命令将修改提交到仓库。加上注释方便以后查看每一次版本更新
- 查看提交日志
git log
或者
git log --graph
后者可以更形象的表示出不同分支之间的合并关系,如下图
日志文件中详细记录了每一次commit的提交时间,以及为什么commit。
- 查看修改前后的差别
git diff
这条命令可以查看工作树和暂存区的差别。
2. 分支操作
git可以创建多个分支。git会维护一个master分支,这也是一切分支的源头,通常也被用作是稳定版本。在其他分支上进行coding不会影响到master分支。在确定其他分支没问题了再与master合并,可以保证代码不会出问题。并且,很多人合作进行工作时,每人负责不同的功能,就可以创建不同的分支,最后再合并到master分支上。通常,当前所处的分支用HEAD来标识。
- 显示当前分支
git branch
加上-a参数可以同时查看本地分支和远程仓库分支。
- 创建新分支并切换
git checkout -b 分支名
如果不加-b,就是切换到已有分支。
- 合并分支
如果将分支B合并到分支A上,首先切换到分支A
git merge --no-ff B
- 回溯历史版本
git一个很强大的功能就是在不同版本之间进行穿越。首先打开查看日志文件,每次commit都对应了一个哈希值。找到要回溯的版本的哈希值。
git reset --hard 哈希值
hard模式是将工作树、暂存区、仓库全部都回到对应的版本,其他还有soft和mix两种模式可选。
- 回到之后的版本
由于当前的log文件中只包含到版本的全部commit,如果想要回到之后的版本,就需要先执行 git reflog命令,查看当前仓库执行过的日志,找到对应版本的哈希值。然后调用git reset --hard。
通过这个功能,即使开发者进行了误操作,也可以自由的在之前的版本之间进行切换,回到之前正确的版本。 - 修改提交信息
git commit amend
这一命令可以修改上一次commit的注释。
- 压缩历史
如果发现之前的提交有拼写错误或其他很小的错误,不值得单独做一个commit,影响之后查看,就可以将两次提交进行压缩,后一次提交并入前一次提交中。
git rebase -i HEAD~2
选定最近两次提交,在编辑器中将最后一次前面对应的"pick"字段改为"fixup"然后保存,即可将最后一次提交并入前一次。
3. 推送至远程仓库
将本地的仓库与远程仓库关联的方法最常用的有两种。一种是在本地创建仓库,然后在远程创建一个空仓库(不包含README.md),将该仓库设为本地仓库的远程仓库。另一种是先在远程创建好仓库,然后git clone下来,则形成关联关系。
- 在远程建立同名仓库,创建时不要勾选Initialize this repository with a README选项。
- 添加远程仓库
git remote add origin 仓库.git
这条命令将远程仓库设为本地的远程仓库,标识为origin。
- 推送至远程仓库
git push -u origin master
这条命令将本地仓库下的内容推送到了远程仓库的master分支。如果需要推送别的分支,进行相应的改变即可。-u参数将origin的master分支设为本地分支的upstream,这样之后只要运行git pull命令,就可以直接从origin的master分支获取内容,不需要额外添加参数。
- 从远程仓库获取内容
git clone 仓库名.git
执行git clone操作后我们会默认处于master分支下,同时系统会自动将origin设置为该远程仓库的标识符。
- 从远程仓库获取其他分支
git checkout branch -b 分支名 origin/分支名
这条命令可以从远程仓库获取其他分支到本地的同名分支,之后直接运行git push就可以将这个分支推送到远程仓库。
- 获取最新的远程分支
git pull origin 分支名
3. pull_request
github社区一个很重要的功能就是pull request。利用这个功能,如果我们发现其他人的代码有需要改进的地方,就可以给对方的账户提pr,如果pr被通过就可以merge到对方的代码里。
不同人利用同一个仓库进行合作开发也可以用到这一功能,首先给仓库设置一个管理员,负责最终分支的合并。其他人可以clone仓库到本地,各自创建分支进行开发。开发完毕后push到仓库的对应分支,然后提出一个pr。管理员负责审核分支是否可以被合并,首先管理员将master分支clone到本地,再将pr的分支fetch到本地,创建一个新的分支,用来模拟pr分支被merge到master分支之后的情形,从而验证分支的可靠性。当确定该分支没有问题后,就可以把新创建的分支删除,然后把pr分支merge到master分支。此时,pr就关闭了。
- 上传修改后的分支
git push origin newbranch
如图,将新分支命名为newbranch,进行修改后上传到仓库的newbranch分支。
-
发起pull_request
在github页面上切换到newbranch分支,点击“New Pull Request",即可发起pr。如下图所示,添加pr描述,点击“create pull request”.
image.png -
审核pr
审核过程之前已经描述过了,当确定pr分支可以合并时,用git merge命令将其与master分支合并,然后push到远程仓库。此时,pr已经被接受,这一分支也可以删除了。
上面描述的是给自己创建的或者自己合作开发的仓库提pull request。如果要给其他仓库提pr,比如一个开源的软件,过程要稍微复杂一些。首先你需要先把这个项目fork到自己的远程仓库,然后clone下来。在本地修改后push到自己的远程仓库。然后点击“New pull request”,将pr发送到源仓库的master分支,如下图。待对方审核无误后,就会进行合并或对你的pr提出问题。
当然,github以及git的用法远不止这些,对于经常开发的人来说,上述命令基本够用,如果想要进一步学习github,可以参考大塚弘记的《GitHub入门与实践》。
结尾:从两年前在一个师姐的推荐下,就一直想要系统学一下github的用法,然而由于个人懒惰,一直没有达成。这一次,多亏灰灰叽强行带我学习,总算了却心愿一件。经过两天的学习,终于把github以及git的基本用法摸清楚了。大概总结一个教程,以后慢慢完善吧。