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

  1. 安装git for window
  2. 安装TortoiseGit-1.8.16.0-64bit.msi
  3. 配置path C:\Program Files\Git\bin
  4. 详见enter link description here

Mac

  1. 最为简单的方式是安装 .dmg 格式的安装包。其中带有一个正在解包图标的文件(扩展名为 .pkg )是 Git 的安装程序
  2. 点击扩展名为 .pkg 的安装程序,开始 Git 的安装
  3. 安装完毕,git 会被安装到 /usr/local/git/bin/ 目录下。重启终端程序,才能让 /etc/paths.d/git 文件为 PATH 环境变量中添加的新路径注册生效。然后就可以在终端中直接运行 git 命令了。
  4. 下载地址: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页面内找到添加公钥选项,粘贴刚刚复制的内容,添加即可.

add-key.png

测试是否配置成功,首次建立链接会要求信任主机:

ssh -T git@github.com

ssh -T git@git.coding.net

ssh-add ~/.ssh/id_rsa 运行此命令,解决每次都需要输入密码的问题。

git多次输入密码.png

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相关学习资源

  1. git的详细介绍:Git详解之一:Git起步
  2. git安装和配置:Git安装与配置
  3. git与TortoiseGit(小乌龟)的基本操作:Git与TortoiseGit基本操作
  4. git的基础教程:廖雪峰的gitgit教程
  5. git的使用流程:Git使用教程
  6. git远程操作详解:阮一峰的Git远程操作详解
  7. git常用命令总结:git常用命令总结
  8. 搭建基于SSH的Git服务器:Windows下搭建基于SSH的Git服务器;自己动手搭建Git服务器-Gitblit
  9. git整体介绍:30 分钟 git 命令入门到放弃 - 掘金