趁着最近在做一个基于Github的开源作业库,决定把Git操作写一写。
Git的安装
首先你要下载Git软件:下载链接
安装过程很普通。装完以后在右键菜单里看见Git GUI Here
和Git Bash Here
就安装成功了。
SSH key配置
Github,Bitbucket是国外较著名的项目托管平台,速度较慢,可以用国内的Coding,速度还不错。要使用这些远程的平台的仓库,需要SSH的配置。
以Github举例。在Github用邮箱注册完帐号,在本地通过Git Bash打开命令行窗口,生成SSH key语句如下:
ssh-keygen -t rsa -C "xxx@xxx.com"
弹出的第一个问题是填写存放的文件名,比如我写id_rsa
,后面的设置密码直接回车,这时在~/.ssh
目录下多了id_rsa
和id_rsa.pub
两个文件。前者是生成的私钥,后者是公钥。将公钥填写在代码托管平台的SSH配置里,这样就可以使用了。
多个SSH key的配置
如果要配置两个Github的帐号怎么办?同样输入:
ssh-keygen -t rsa -C "xxxx@xxx.com"
填写存放的文件名不要和已有的一样,就不会覆盖,比如我写second
,这样就生成了second
和second.pub
两个文件。还需要新建default文件对两个SSH key进行配置:
touch ~/.ssh/config
defualt文件中的Host是映射在本地的Host,用以区分你要使用的Git帐号,而HostName是真正的访问服务器地址。
#defualt
Host github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
User chairyfish
#second
Host git.github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/second
User CUGpotato
别忘了在Github添加公钥~打开命令行测试:
ssh -T git@github.com #测试第一个帐号
ssh -T git@git.github.com #测试第二个帐号
第一句会返回Hi,chairyfish! You’ve successfully authenticated,but Github does not provide shell access.
第二句会返回Hi,CUGpotato! You’ve successfully authenticated,but Github does not provide shell access.
这样就测试成功了。下面就可以上传本地代码到远程仓库了。
上传代码到远程仓库
在github添加仓库,命名为CUG-Asmtlib
。
在需要新建本地仓库的文件夹下执行bash,输入git init
,可以看到新生成.git文件夹。
将文件添加到仓库,很简单:
git add index.html #添加文件
git add CSS/Layer #添加文件夹
然后提交修改:
git commit -m "添加了index.html和CSS文件夹"
新建README.md,用来写项目说明,当然也不是一定要。
touch README.md
添加远程仓库的地址,建议用ssh:
#因为我们使用的是第二个帐号,所以改成git.github.com
git remote add origin git@git.github.com:CUGpotato/CUG-Asmtlib.git
最后pull到远程仓库:
git push -u origin master
如果没有上传成功,可能是由于代码冲突,可以将远程仓库pull到本地:
git pull git@git.github.com:CUGpotato/CUG-Asmtlib.git
然后再push就解决了。
版本回退
查看提交记录,每次提交都有一个唯一的记录值commit id
:
git log
#下面是记录结果
commit 0cae52557b45e267e827fb69dde7ffc3fef31996
Author: chairyfish <chairyfish@gmail.com>
Date: Mon Apr 10 17:51:28 2017 +0800
上传了C语言课程设计
commit 262a3fa01b279473fe5e105ed7d3264f8f64ba99
Author: chairyfish <chairyfish@gmail.com>
Date: Fri Apr 7 15:29:25 2017 +0800
提交了复习资料
回退到上一版本:
git reset --hard HEAD
这样的回退会使commit的次数-1,但是如果还记得原来的版本号,可以回到未来的版本:
git reset --hard 0cae525
但是如果已经push了,怎样撤销错误提交?先查到想退回版本的commit id,再执行:
git revert #commit id
revert可以优雅地撤销到制定版本并commit。commit记录不会删除,而是创建一个新的提交来撤销更改。最后进行push操作,远程代码就回退完成了。
fork项目与原项目的同步
当我们用第一个帐号fork了CUG-Asmtlib这个项目,这个项目就新生成了一个分支克隆到仓库。当我们在fork的项目上提进行了修改,原项目的的仓库并不会受到影响,如果我们想在fork的项目上向原项目提交修改,可以发起Pull request。原项目的管理员看到了以后可以选择merge,就可以覆盖原项目了。而这时如果原项目又进行了修改,fork的项目是不会进行自动同步的。如果想要和原项目同步,可以这么执行——
先指定上游仓库:
#此处是github.com,因为fork项目在使用第一个帐号。
git remote add upstream git@github.com:CUGpotato/CUG-Asmtlib.git
从上游仓库获取到分支,及相关的提交信息,并保存到本地的upstream/master分支:
git fetch upstream
这时本地文件并没有改变。切换到本地的master分支:
git checkout master
把 upstream/master 分支合并到本地的 master 分支,本地的修改依旧会保留:
git merge upstream/master
最后将本地仓库push到自己的远程仓库,就可以了。
友情提醒:评论区翻墙后可用~