0x00 前言
github是什么?
GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的版本库格式进行托管,故名 GitHub。
GitHub 于 2008 年 4 月 10 日正式上线,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。目前,其托管版本数量非常之多,而且其中不乏知名开源项目,例如 Ruby on Rails、jQuery、python 等。
0x01 简单推送一个仓库
注册账户以及创建仓库
······
安装Git
。。。。。。
配置Git
首先在本地创建ssh key;
1 | $ ssh-keygen -t rsa -C "your_email@youremail.com" |
表示我们指定 RSA 算法生成密钥,然后敲三次回车键,期间不需要输入密码,之后就就会生成两个文件,分别为id_rsa和id_rsa.pub,即密钥id_rsa和公钥id_rsa.pub. 对于这两个文件,其都为隐藏文件,默认生成在以下目录:
Linux 系统:~/.ssh
Mac 系统:~/.ssh
Windows 系统:C:\User\username\.ssh
Windows 10 ThinkPad:C:\Users\think.ssh
进去,打开
id_rsa.pub
,复制里面的key
。回到github上,进入 Account Settings(账户配置),左边选择SSH Keys,Add SSH Key,title随便填,粘贴在你电脑上生成的key。
为了验证是否成功,在git bash下输入:
1 | $ ssh -T git@github.com |
本地 Git 仓库
进入该仓库,并进行初始化:
1 | $ git init |
1 | $ git remote add origin git@github.com:python-cdf/python.git |
命令,关联远程仓库,其中origin为远程仓库的名字:
输入
1 | git pull origin master |
同步远程仓库和本地仓库:
输入
1 | git add test.txt |
将文件test.txt添加并提交到仓库:
再输入
1 | git push origin master |
将本地仓库修改(或者添加)的内容提交到远程仓库.
在我们向远程仓库提交代码的时候,一定要先进行pull操作,再进行push操作,防止本地仓库与远程仓库不同步导致冲突的问题,尤其是第二种提交代码的情况,很容易就出现问题。
0x02 其他命令
1. git status
查看仓库的状态,可以看到当前文件夹是否为仓库,可以看到是否有文件没有同步。通常执行完一个命令后,都会查看一下,使用频率很高。
2. git init
初始化为一个Git仓库,并且默认进入 Git 仓库的master分支,即主分支。这时,如果当前仓库中已有文件,输入git status
命令后,会发现该文件没有被追踪,需要输入命令:
1 | git add abc.txt |
将文件追踪到仓库。
3. git add
将文件添加到Git仓库,但是git add
命令并没有把文件提交到 Git 仓库,而是把文件添加到了「临时缓冲区」,这个命令有效防止了我们错误提交的可能性。
4. git commit
将文件提交到Git仓库:
1 | git commit -m "V1.1 commit" |
5. git log
打印Git仓库提交日志
6. git branch
查看Git仓库的分支情况
1 | git branch a |
7. git checkout
切换到仓库的某一分支
1 | #切换到分支a |
8. git merge
合并分支。切换到master分支,然后输入git merge a命令,将a分支合并到master分支:
注意一点,那就是:在合并分支的时候,要考虑到两个分支是否有冲突,如果有冲突,则不能直接合并,需要先解决冲突;反之,则可以直接合并。
9. git branch -d & git branch -D
删除分支和强制删除
1 | #删除分支a |
例如分支a的代码没有合并到主分支等,这时如果我们一定要删除该分支,那么我们可以通过命令git branch -D进行强制删除。
10. git tag
为当前分支添加标签
1 | #添加标签V1.0 |
0x03 git 进阶
Linux 下使用git:
1. 设置git命令别名
查看git全局配置信息:
1 | git commit -l |
单独配置某项,如将git status
简化为 git st
:
1 | git config --global alias.st "status" |
这里需要注意的一点是,通过 ~/.gitconfig
可以进行全局配置(也就是针对所有项目),而每个项目下 .git/config
中的配置只针对这个项目。
上面的配置中包含了别名的配置以及其他配置,比如默认编辑器(执行git commit 时所使用的编辑器)、用户名和邮箱等。gitconfig 的可配置项还有很多,可以通过Google搜索关键词 git config best practices 来获得更多相关内容。
2. 修复已提交的 commit
一个 commit 只做一件事,如果你发现你刚刚提交的commit不太合适,此时可以使用git commit –amend 把新的改动加入到刚才的 commit中,而刚刚的commit消失不见,使用 git log 也看不到。
3. 修复历史 commit
如果提交了多个相似的 commit ,需要将其合并为一个,或者提交了多个注释都是 fix bug 的commit,需要明确内容,此时可以使用 git rebase -i HEAD3 命令。这个命令指通过交互模式(即 -i 的作用)的方式来进行调整,最后的 HEAD3 指明我们想要修改最近3次的commit。 当我们执行命令后,会出现下图:
这里我们可以调整注释,合并两个 commit (使用squash)或者舍弃某个commit(直接去掉某个commit号)。注释介绍了每个命令的作用。即使不修改任何内容,进入这个模式后,也会重写这几个 commit(重新生成commit号)。
0x04 名词解释
Repository:简称Repo,可以理解为“仓库”,我们的项目就存放在仓库之中。也就是说,如果我们想要建立项目,就得先建立仓库;有多个项目,就建立多个仓库。
Issues:可以理解为“问题”,举一个简单的例子,如果我们开源一个项目,如果别人看了我们的项目,并且发现了bug,或者感觉那个地方有待改进,他就可以给我们提出Issue,等我们把Issues解决之后,就可以把这些Issues关闭;反之,我们也可以给他人提出Issue。
Star:可以理解为“点赞”,当我们感觉某一个项目做的比较好之后,就可以为这个项目点赞,而且我们点赞过的项目,都会保存到我们的Star之中,方便我们随时查看。在 GitHub 之中,如果一个项目的点星数能够超百,那么说明这个项目已经很不错了。
Fork:可以理解为“拉分支”,如果我们对某一个项目比较感兴趣,并且想在此基础之上开发新的功能,这时我们就可以Fork这个项目,这表示复制一个完成相同的项目到我们的 GitHub 账号之中,而且独立于原项目。之后,我们就可以在自己复制的项目中进行开发了。
Pull Request:可以理解为“提交请求”,此功能是建立在Fork之上的,如果我们Fork了一个项目,对其进行了修改,而且感觉修改的还不错,我们就可以对原项目的拥有者提出一个Pull请求,等其对我们的请求审核,并且通过审核之后,就可以把我们修改过的内容合并到原项目之中,这时我们就成了该项目的贡献者。
Merge:可以理解为“合并”,如果别人Fork了我们的项目,对其进行了修改,并且提出了Pull请求,这时我们就可以对这个Pull请求进行审核。如果这个Pull请求的内容满足我们的要求,并且跟我们原有的项目没有冲突的话,就可以将其合并到我们的项目之中。当然,是否进行合并,由我们决定。
Watch:可以理解为“观察”,如果我们Watch了一个项目,之后,如果这个项目有了任何更新,我们都会在第一时候收到该项目的更新通知。
Gist:如果我们没有项目可以开源或者只是单纯的想分享一些代码片段的话,我们就可以选择Gist。不过说心里话,如果不翻墙的话,Gist并不好用。
0x05 常见错误
Updates were rejected because the tip of your current branch is behind
出现这个错误的原因是git本地仓库的当前版本低于远程仓库的版本(大白话就是:你在github上进行的修改没有同步到本地git仓库中)。
- 第一种错误的原因
某一天你在本地仓库进行了相关修改然后上传到远程仓库中,这时本地仓库和远程仓库都是同步的,不会出现这种错误。过了几天你突然在github看到了一个错误需要修改,但你并没有通过本地仓库进行修改而是直接在github上进行修改,然后保存修改。这里就要注意一个问题,之前你通过本地仓库进行修改文章最后都会上传到远程仓库(也就是github中),这就保证了远程仓库和本地仓库是同步的,但是如果你直接在远程仓库(github)中进行修改,默认是不会上传到本地的,这就导致了一个问题,本地仓库中的相关内容没有被修改,而远程仓库中的相关内容被修改,这里可以理解为远程仓库更新了而本地仓库没有更新,这就导致了本地仓库的版本落后于远程仓库,也就是本地仓库和远程仓库版本不一致。而你现在直接在本地仓库这个落后的仓库中修改相关文件然后上传到远程仓库中就会出现错误,本地的修改是基于之前版本的修改,这种修改无法基于远程仓库中这种之后的版本,因为要修改的地方原本的内容都不同就会导致有些修改方法无法实现(比如说本地仓库要把1变为2就加一就可以了,但是远程仓库不是1而是3,这是如果用本地仓库的修改方法也加一就会变为4,这显然是不合适的)。
第二种原因
在企业开发中,通常一个项目不是由一个人独立完成的而是由多个人共同完成的,由于另外的程序员更改了相关的代码并向远程上传了更改,而你没有同步他的更改而是在之前的基础上也更改了并上传就会出现版本低于远程版本的错误无法修改。举个简单的例子,要实现一个算式3先加一在减二最终得到2的功能,实现这个功能需要两步:先加一j,然后减二。假设你负责实现加一的功能,另外一个程序员实现减二的功能,现在本地仓库和远程仓库的数字都是3,正常情况下是你先实现加一的功能使本地的数字变为4然后上传到远程使远程的数字变为4,然后另一位程序员将远程更改后的数字4同步到本地使本地的数字也变为4,然后在本地4的基础上实现减二的功能使其变为2然后上传到远程使其也变为2,最后你同步远程的2到本地使你的本地数字也变为2,这样就实现了该功能。但是由于你的个人原因,让另一位程序员提前你一步实现减二的功能并上传到远程,导致远程的数字变为了0,而你现在上传加一的功能肯定是会报错的,如果成功那么远程就变为了1这显然是达不到功能需求的。
解决方案
- 错误的解决方案(注意是错误的解决方案,但如果这个项目只是你一个人的话,可以执行下面的操作)
1 | 在终端下输入: |
这句话执行的后果就是在远程仓库中进行的相关修改会被删除,使远程仓库回到你本地仓库未修改之前的那个版本,
然后上传你基于本地仓库的修改。这如果在企业开发中就会让别的程序员的这些天的开发付之东流,一切回到解放前。
正确的解决方案
1
先在终端下输入:git pull origin master
这句话是说将远程中进行的相关修改保存下来
但这时可能会报错:error: Your local changes to the following files would be overwritten by merge:
解决方案看我另一篇博客:https://blog.csdn.net/IT_SoftEngineer/article/details/107133284
解决上述问题后就可保证远程仓库的更新会被同步到本地而本地仓库的修改也不会被覆盖
然后就是add,commit,push命令将本地的修改上传到远程仓库中
0x05 参考链接
菜鸟教程:https://www.runoob.com/w3cnote/git-guide.html
知乎:https://zhuanlan.zhihu.com/p/369486197
csdn:https://blog.csdn.net/IT_SoftEngineer/article/details/107133313