- 最近萌发了使用github的冲动
- 尽管现阶段最大的好处还是将代码保存到了远程
- 因为感觉并不会用到分支等等其他功能的样子
系统版本
$ cat /proc/version
Linux version 4.4.0-57-generic (buildd@lgw01-54) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) ) #78-Ubuntu SMP Fri Dec 9 23:50:32 UTC 2016
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.1 LTS
Release: 16.04
Codename: xenial
安装git
$ sudo apt-get install git
[sudo] username 的密码:
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
git 已经是最新版 (1:2.7.4-0ubuntu1)。
升级了 0 个软件包,新安装了 0 个软件包,要卸载 0 个软件包,有 205 个软件包未被升级。
生成ssh密钥
$ ssh-keygen -t rsa -C "your_email@email.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/username/.ssh/id_rsa): gitkey
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in gitkey.
Your public key has been saved in gitkey.pub.
The key fingerprint is:
SHA256:YbbASU/RttVk7K4Ks/C0v/y+V7HGIYHoJEw1weZuqJw "your_email@email.com"
The key's randomart image is:
"an image made up with characters"
- 这里我生成的key取名为gitkey
- 这样在你用户的根目录(/home/username)下会有一个gitkey.pub的文本文件,里面的内热就是公钥,需要用来添加到你在github网站上的账户里面
- 还会有一个gitkey的文件,也就是私钥
- 如果在“Enter passphrase (empty for no passphrase): ”输入了一个短语,这个是用来对私钥加密的,即访问gitkey文件的时候会提示你输入这个密码。显然我是加了密的,所有才会提示“Enter same passphrase again: ”
- 然后需要把这两个文件cp到/home/username/.ssh/目录下,终端直接操作(为啥咧?因为这样才能让ssh找到。其实还是因为我“擅自”输入了文件名导致ssh没有将密钥直接生成在其默认的目录下)
- 如果直接一路按回车下来的化,会简单很多
- 默认会在/home/username/.ssh/目录下生成id_rsa和id_rsa.pub文件,即私钥和公钥
- 哎找不到这个目录?隐藏的啦( 即前缀了一个 . )。直接在终端中输入路径访问就可以
设置github账户
- 到github网站上登录你的帐号
- settings 里的 SSH and GPG keys
- New SSH key (一个绿色的按钮)
- Title即标题,最好取一个和当前终端设备(系统)相关的标题方便管理,比如我在window下的密钥起名为“GitHub for windows”,在这里就取名为“GitHub for Linux/Ubuntu”
- Key即公钥,也就是前文中gitkey.pub(默认版:/home/username/.ssh/id_rsa.pub)的内容
测试ssh密钥
$ ssh -T git@github.com
- 若出现Permission denied (publickey).
- 个人的解决方法是把这gitkey和gitkey.pub这两个文件cp到了/home/username/.ssh/目录下
- 如果生成密钥那一步是一路回车下来的,就没发生这个问题
- 若出现Hi YourGitHubName! You’ve successfully authenticated, but GitHub does not provide shell access.
- 就可以了
简单使用git
举一个简单的例子
1.首先在github网站上创建一个repository,起名叫test
- 空空如也但是有提示
Quick setup — if you’ve done this kind of thing before
or | HTTPS | SSH | git@github.com:username/test.git
- 即使用git通过ssh来访问的时候利用git@github.com:YourGitHubName/test.git这个url来访问你建立的repository
2.终端移动到你的新项目目录下
$ pwd
/home/username/文档/test
$ ls
test test.c
3.使用git init初始化git仓库
$ git init
初始化空的 Git 仓库于 /home/username/文档/test/.git/
4.使用git add .将所有改动添加到本地仓库
$ git add .
5.使用git commit -m “commit instruction”来编写提交说明
$ git commit -m "firt commit"
[master (根提交) 2c5bcb7] firt commit
2 files changed, 7 insertions(+)
create mode 100755 test
create mode 100644 test.c
6.使用git remote add origin git@github.com:YourGitHubName/test.git
- 尽管还不知道为什么,不过不这样干没办法提交。目前个人的理解是将远程的repository映射到本地的一个origin上,通过origin进行上传。日后有更准确的理解会修正。
7.使用git push origin master上传到远程上
$ git push origin master
对象计数中: 4, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (4/4), 完成.
写入对象中: 100% (4/4), 2.61 KiB | 0 bytes/s, 完成.
Total 4 (delta 0), reused 0 (delta 0)
To git@github.com:YourGitHubName/test.git
* [new branch] master -> master
8.稍作修改
$ echo asd > asd.txt
$ ls
asd.txt test test.c
9.提交更新的版本
$ git add .
$ git commit -m "second commit"
[master c314f60] second commit
1 file changed, 1 insertion(+)
create mode 100644 asd.txt
$ git push origin master
对象计数中: 3, 完成.
Delta compression using up to 4 threads.
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (3/3), 297 bytes | 0 bytes/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:YourGitHubName/test.git
2c5bcb7..c314f60 master -> master
10.下载项目到本地(我这里先删掉了原本的test目录)
$ cd ..
$ rm -r test
rm:是否删除有写保护的普通文件 'test/.git/objects/3d/ede79373fd15383d243b9a99f2340111ef2242'? y
rm:是否删除有写保护的普通文件 'test/.git/objects/c3/14f60b58bcd36894c41e37d62b1c228b19021f'? y
rm:是否删除有写保护的普通文件 'test/.git/objects/87/fae94b03488f770ed94496418ff75531904612'? y
rm:是否删除有写保护的普通文件 'test/.git/objects/af/1fa17d50347d23f2a0562b31dca44748ab5858'? y
rm:是否删除有写保护的普通文件 'test/.git/objects/d7/2af314604e3b98e5c108efeb4815c64d2e267b'? y
rm:是否删除有写保护的普通文件 'test/.git/objects/73/9735de9ca4e5ad57f2353ae65a858c4142319b'? y
rm:是否删除有写保护的普通文件 'test/.git/objects/2c/5bcb7a3b3c768d1007b3f54c33db405fd2f8f0'? y
$ cd test
bash: cd: test: 没有那个文件或目录
$ git clone git@github.com:YourGitHubName/test.git
正克隆到 'test'...
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 7 (delta 0), pack-reused 0
接收对象中: 100% (7/7), 完成.
检查连接... 完成。
$ cd test
$ ls
asd.txt test test.c
更多git的使用
git撤回commit
某次手滑直接commit一个带有私人key的版本
- git log 查看commit历史,可以看到每次commit版本的hash值,即commit id
- git reset [option] [commit id]
- git reset –mixed [commit id]:仅恢复index,不修改work directory中的文件,所有相对于恢复后的版本发生的改变为unstaged状态,即未跟踪
- git reset –soft [commit]:仅恢复index,不修改work directory中的文件,但相对修改的文件为Changes to be committed状态
- git reset –hard [commit id]:恢复index和work directory,即完全回退到之前的版本
- git push origin master –force将回退操作同步到远程。
- wait for more