[toc]
访问我的个人博客http://blog.leanote.com/moquan 获取更多。
进官网创建账号,如果是学生的话,建议使用edu邮箱。
使用github学生特权,访问网站https://education.github.com/pack,填写申请,注意申请需要edu邮箱
。
如果申请成功,GitHub将会发一封通知邮件,类似这样:
Git和GitHub不是同一个东西。可以参考这个链接来了解一下git 和 github的关系和区别。http://blog.jobbole.com/111187/
下载地址,注意选择系统类别,根据自身cpu选择32位或者64位。
安装时记得勾选git bash组件,并将git添加到系统环境变量。
GitHub 中公开的代码大部分都是以Mac 或Linux 中的LF(Line Feed)换行。然而,由于Windows 中是以CRLF(Carriage Return + Line Feed)换行的,所以在非对应的编辑器中将不能正常显示。所以在安装过程中配置换行符的时候,windows用户选择Checkout Windows-style, commit Unix-style line endings
。
安装完成后,打开git bash, 配置github账户。
git config --global user.name "Firstname Lastname"
git config --global user.email "[email protected]"
添加ssh 密钥
ssh-keygen -t rsa -C "[email protected]"
按照命令行的提示输入密码,就可以生成公钥和私钥。注意密钥的存放路径。
在github网站上,点击头像,选settings,选ssh and gpg keys,添加ssh key。将刚才生成的密钥复制到github上,测试通过即可。
在本地git bash 里尝试使用ssh 连接远程github。
ssh -T [email protected]
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is fingerprint值 .
Are you sure you want to continue connecting (yes/no)? 输入yes
出现如下结果证明ssh key成功配置。
Hi your-name! You've successfully authenticated, but GitHub does not
provide shell access.
如果配置不成功,访问github帮助页面https://help.github.com/寻找错误原因和解决方案。
假设Github网站上已经建立了一个名为”Hello-World”的仓库,没有README.md和gitignore文件。新建完成后会有一个仓库链接
由于已经配置过ssh密钥,所以在本地的电脑上就可以直接使用ssh来连接到远程仓库。
到自定的目录下执行命令,将远程的仓库克隆到本地
git clone [email protected]:endeavormoquan/Hello-World.git
此时本地的Hello-World文件夹里只有一个.git文件,因为远程的仓库是空仓库。本地电脑里的仓库Hello-World是本地仓库,除了执行特定的命令让本地和远程进行同步或者其他操作之外,本地仓库不影响远程仓库。
在学习git的时候要时刻注意本地仓库和远程仓库的区别和关系
进入刚才的Hello-World本地仓库
默认进入master分支(现在也只有master分支),执行git status命令,查看当前仓库状态。
提示当前所在的分支,当前的文件变更状态等等信息。每一个commit会更新本地仓库里工作记录树中文件的当前状态。
使用编辑器在Hello-World文件夹里添加一个README.md。
使用git status查看当前仓库状态
此时执行git add
提示有一个更新需要被commit(提交),此时README.md文件已经在本地仓库的暂存区里。
git commit命令可以将当前暂存区中的文件实际保存到仓库的历
史记录中。通过这些记录,我们就可以在工作树中复原文件。
-m命令是为该次提交附加一个简要的提交信息。
如果需要附加一个更加详细的提交信息,不要加-m,直接执行git commit,随后一个编辑器会自动启动用来编辑更加详细的信息。
注意,这时的提交是将文件变更的记录提交到本地仓库,远程仓库没有任何影响
紧跟着commit后面的一串字符代表这次提交的哈希值,这个值唯一确定了某次提交,可以用这个哈希值来进行仓库的回滚(将所有文件回滚到某次提交后
的状态)
使用编辑器修改一下创建的README.md
执行git diff命令:
+号表示新添加的行,-号表示删除的行。
使用git add 命令将修改过的README.md添加到暂存区。这时如果还使用git diff命令,那么git bash终端不会显示任何信息,因为当前工作树和暂存区没有任何区别(刚刚add了README.md)
如果想要查看工作树和最新一次commit之间的差别,需要使用git diff HEAD命令,HEAD表示指向当前分支中最新一次提交的指针。
现在将暂存区的文件commit到仓库历史记录中,git commit -m “add something to test git diff”
然后可以使用git log 来查看提交记录
接下来尝试完成如下分支操作
从master分支创建两个分支:feature-A和feature-B,在feature-A上虚拟一个commit后将feature-A合并到master分支里。
命令执行后显示只有一个分支master,前面的 * 号表示当前所在的分支,由于只有一个分支,所以当前分支就是master分支。
使用git branch命令创建一个新的分支,使用git checkout切换分支
注意看命令右边蓝色的括号,括号内表示当前所在分支:feature-A。
此时使用git branch查看分支情况
当前分支的确是feature-A分支
修改一下README.md文件,添加一行branch feature-A added。
使用git add添加改动的文件到暂存区,注意当前操作分支是feature-A分支,使用git commit提交更改。
这时,切换回master分支,使用bash 里的cat命令来查看README.md(bash命令的功能大多和linux相同,熟悉linux的话可以很方便进行操作)
master里的文件信息没有任何影响! feature-A 分支的更改不会影响到master 分支,这正是在开发中创建分支的优点。只要创建多个分支,就可以在互不影响的情况下同时进行多个功能的开发,这对于一个多人开发的系统来说有着无与伦比的优势。
假设feature-A分支负责的功能模块已经开发完毕,现在将它合并到master分支里。
先切换到master分支,git checkout -,后面的’-‘表示返回上一次所在的分支。也可以使用git checkout master来返回到master分支。
使用git merge命令合并分支,合并时加入–no-ff参数
执行命令时会打开编辑器,默认是vim,使用vim编辑器编辑此次合并附加的信息,随后保存退出即可。
使用git log –graph来用图表形式查看分支
现在已经把feature-A分支合并到了master里,如果要创建feature-B分支,就需要先返回到创建feature-A之前。
使用git reflog查看历史版本的时间戳哈希值:
仔细查看可以发现,时间戳为d8cb823的历史时刻是在feature-A创建之前。
使用git reset –hard命令来进行回溯
现在创建fix-B分支
此时向README.md里添加一行 fix-B created,虽有添加README.md到缓存区并提交修改
现在需要把历史推进到feature-A合并到master之后,同样先使用git reflog查看历史进程,再使用git reset切换历史。
例如上图上的7196c7e时间戳是feature-A合并的历史记录。
现在合并fix-B分支:git merge –no-ff fix-B
此时发生了冲突,因为feature-A分支在README.md里添加的一行“feature-A created”和fix-B里添加的一行“fix-B created”并不一致(一份文件不可能同时有两种版本在同一个master版本里出现)
现在需要消除冲突。只要打开README.md文件,git已经给好了更改的提示。
=======以上的部分是当前HEAD的内容,以下是fix-B分支里的内容。只要更改文件变成我们想要的样子就行。
之前每次我们切换到master分支的时候,都会显示
那是因为本地仓库配置的上游仓库缺失(也就是github仓库),这里注意从远程仓库克隆并不意味着本地仓库的上游就一定是被克隆的仓库
按照终端的提示使用git branch –unset-upstream来修复
现在可以使用git push命令来推送本地分支到远程仓库
现在刷新github页面
如果两人同时修改了同一部分的源代码,push时就很容易发生冲突。所以多名开发者在同一个分支中进行作业时,为减少冲突情况的发生,建议更频繁地进行push 和pull 操作。
例如现在从远程仓库获取最新的master分支
Pull Request 是用户修改代码后向对方仓库发送采纳请求的功能,也是GitHub 的核心功能。
现在新开一个分支feature-C,提交一个commit。接着使用git push创建远程分支feature-C
现在使用git branch -a查看本地和远程分支
看到远程有了一个新的feature-C分支,这时登录github
点击右侧”compare&pull request”按钮来进行进一步检查。确认没有错误后点击”create pull request”
进入github,打开pull request页面。
点击进去之后可以直接接受pull request,也可以先进行评论讨论而不急着接受
现在模拟一下讨论,在评论栏里添加“这是评论1”
这时就有了”Conversation”,如果经过讨论后该分支可以接受,点击merge即可。
随后得到确认信息。
刷新code页面,发现在master分支里的确合并了feature-C分支,这时的feature-C分支如果不再使用的话,可以直接删除。