git学习
字数 2.7k / 10 min 读完 / 阅读Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
可视化软件
官网在这里:https://www.git-scm.com/,在git 官网上这种GUI工具多达十几款,在Mac平台我推荐一两款好用的软件GUI,官网GUI客户端列表:https://www.git-scm.com/downloads/guis
- DiffMerge
是一款可视化的文件比较(也可进行目录比较)与合并工具。该软件主要具有文件差异比较、自动化的文件合并、以及文件夹差异比较这三大功能。这里下载:http://sourcegear.com/diffmerge/
- SourceTree
(Windows/Mac)免费,官网在这里:https://www.sourcetreeapp.com/
- Gitup
(Mac)免费开源,好玩的Gitup是 Mac OS X 的全功能开源 Git 客户端,提供快速,安全的操作,直接在硬盘上与 Git 数据库交互,操作库的图而不是操作 commits,官网在这里:http://gitup.co/
安装步骤
Windows
- 安装git for window
- 安装TortoiseGit-1.8.16.0-64bit.msi
- 配置path C:\Program Files\Git\bin
- 详见enter link description here
Mac
- 最为简单的方式是安装 .dmg 格式的安装包。其中带有一个正在解包图标的文件(扩展名为 .pkg )是 Git 的安装程序
- 点击扩展名为 .pkg 的安装程序,开始 Git 的安装
- 安装完毕,git 会被安装到 /usr/local/git/bin/ 目录下。重启终端程序,才能让 /etc/paths.d/git 文件为 PATH 环境变量中添加的新路径注册生效。然后就可以在终端中直接运行 git 命令了。
- 下载地址:enter link description here
绑定远程仓库
配置Git
git config --global user.name "xxx" # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
git config --list # 检查已有的配置信息
创建SSH Key
- 打开终端,输入
ssh-keygen -t rsa -C "xxxxxx@qq.com"
邮箱更新为自己的 - 回车保存默认位置
- 输入密码,用来加密私钥(以后就要用这个密码)
- 输入
cat ~/.ssh/id_rsa.pub
,即返回对应id_rsa.pub(公钥)信息,复制所有内容(待用)
与远程仓库绑定
- 在远程服务器,如coding/github页面内找到
添加公钥选项
,粘贴刚刚复制的内容,添加即可.
测试是否配置成功,首次建立链接会要求信任主机:
ssh -T git@github.com
ssh -T git@git.coding.net
ssh-add ~/.ssh/id_rsa
运行此命令,解决每次都需要输入密码的问题。
git config --global credential.helper store
ssh-add ~/.ssh/id_rsa
Enter passphrase for /Users/lionluo/.ssh/id_rsa:
Identity added: /Users/lionluo/.ssh/id_rsa (/Users/lionluo/.ssh/id_rsa)
可参考coding官方文档
如果返回的结果如下:
输入yes,就能看到
这样你的SSH key就配置完成了。
到这里github仓库已经建好了。接下来是本地部分了。
常用命令
基础操作
git init
#初始化git仓库
git add .
#添加所有文件到暂存区
git status
#查看Git仓库状态,要随时掌握工作区的状态
git commit -m 'xxx'
#提交已添加的文件到git仓库
git commit -am 'xxx'
#将add和commit合为一步
git log /git reflog
#显示最近到最远的提交日志(历史)/(未来)
git reset --hard <commitId>
#HEAD^--返回上个版本,
#HEAD~100--返回上100个版本
#commit_id--对应版本的commitId
远程命令
git remote
命令就用于管理主机名。
git remote add <主机名> <网址>
#用于添加远程主机
git remote rm <主机名>
#用于删除远程主机
git remote rename <原主机名> <新主机名>
#用于远程主机的改名
git remote (-v)
#要查看远程库的信息(显示更详细的信息)
git fetch
命令用于取回远程更新至本地
git fetch <远程主机名>
#将某个远程更新,全部取回本地
git fetch <远程主机名> <分支名>
#取回特定分支的更新
#所取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。比如origin主机的master,就要用origin/master读取。
git pull
取回远程主机某个分支的更新,再与本地的指定分支合并。
git pull origin next(:maste)
#取回origin主机的next分支,与当前(本地的master)分支合并
git push
命令用于将本地分支的更新,推送到远程主机
git push origin <本地分支名>:<远程分支名>
#提交本地的某分支,与origin主机的某分支合并
git push -u origin master
#将本地master分支推送到origin主机,同时指定origin为默认主机,之后就可以不加任何参数使用git push
git push --all origin
#将本地`所有分支`推送到origin主机
git push origin master
#将master分支推送到origin远程主机的master分支上
#如果推送失败,先用git pull抓取远程的新提交;
git push origin --tags
#推送包含标签(tag)
git push -f
#强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容
git clone
命令用于克隆远程仓库到本地
git clone <url>
#克隆远程仓库到本地
git clone <版本库的网址> <本地目录名>
#克隆远程仓库到本地指定文件名
分支操作
master
分支是主分支,因此要时刻与远程同步,程序的稳定版本;dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;bug
分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;feature
分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
git branch
#查看所有分支
git branch <name>
#创建分支
git checkout <name>
#切换分支
git checkout -b <name>
#创建并切换分支
git checkout -b newBrach origin/master
#在origin/master的基础上,创建一个新分支
git merge <name>
#合并某分支到当前分支
git branch -d <name>
#删除分支
git branch -a
#显示所有分支
git branch -r
#显示所有远程分支
git branch --merged
#显示所有已合并到当前分支的分支
git branch --no-merged
#显示所有未合并到当前分支的分支
git branch -m master master_copy
#本地分支改名
标签操作
git tag <name>
#用于新建一个标签,默认为HEAD,也可以指定一个commit id;
git tag -a <tagname> -m "blablabla..."
#可以指定标签信息;
git tag -s <tagname> -m "blablabla..."
#可以用PGP签名标签;
git tag
#查看所有标签
git push origin <tagname>
#推送一个本地标签;
git push origin --tags
#推送全部未推送过的本地标签;
git tag -d <tagname>
#删除一个本地标签;
git push origin :refs/tags/<tagname>
#删除一个远程标签。
其他使用场景
- 保存进度
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;当手头工作没有完成时,先把工作现场
git stash
一下,然后去修复bug,修复后,再git stash pop
,回到工作现场。
- 合并分支
git merge --no-ff -m "merge with no-ff" dev
合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
- 撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- <fileName>。
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <fileName>
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,则需要版本回退
git reset --hard HEAD^
,不过前提是没有推送到远程库。
访问本地git服务器
ssh 指定私钥的配置管理,为本地添加 ssh 别名,编辑 ~/.ssh/config ,如果没有该文件,创建一个:
$ vi ~/.ssh/config
在 config 中添加:
# 注释说明
# Host 别名
# HostName 域名或 ip
# User 登陆服务器用的账号
# Port 端口号(默认22,可以不填,如果服务器修改了`ssh`登录端口号,此处需要修改)
# IdentityFile 密钥文件的位置
例如设置为:
Host git.project-y.com
HostName 192.168.126.213
User lion1ou
# Port (不填则为默认值)
# IdentityFile (不填则为默认值)
现在,可以通过 git clone 命令克隆远程仓库了:
$ git clone git@git.project-y.com:y/docs.git
.gitignore
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可。
如下:
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/
/themes/next
问题解决
出现私钥权限太开放
{ .ssh } » ssh -T git@github.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0670 for '/home/Lion/.ssh/id_rsa' are too open.
It is recommended that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "/home/Lion/.ssh/id_rsa": bad permissions
Permission denied (publickey).
解决办法:
执行命令:chmod 600 /home/Lion/.ssh/id_rsa
出现github上传ssh-key后仍须输入密码的问题
原因是因为我们使用https方式克隆
git clone https://github.com/Name/project.git
这样便会在你git push或者git pull时候要求输入用户名和密码
解决办法:
使用ssh方式克隆仓库
git clone git@github.com:Name/project.git
当如,如果你已经用https方式克隆了仓库,就不必删除仓库重新克隆,只需将.git/config
文件中的
url = https://github.com/Name/project.git
# 改成 =>
url = git@github.com:Name/project.git
git相关学习资源
- git的详细介绍:Git详解之一:Git起步
- git安装和配置:Git安装与配置
- git与TortoiseGit(小乌龟)的基本操作:Git与TortoiseGit基本操作
- git的基础教程:廖雪峰的gitgit教程
- git的使用流程:Git使用教程
- git远程操作详解:阮一峰的Git远程操作详解
- git常用命令总结:git常用命令总结
- 搭建基于SSH的Git服务器:Windows下搭建基于SSH的Git服务器;自己动手搭建Git服务器-Gitblit
- git整体介绍:30 分钟 git 命令入门到放弃 - 掘金