Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。
Git简介
Git是什么?
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Git的诞生
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。
Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!
你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。
不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
Git常用命令
git是分布式的代码管理工具,基于SSH协议。ssh的作用就是为了不用每次都输入账号和密码。 生成的ssh密钥,分为公钥和私钥。公钥就是所要添加的ssh key(.pub文件)。公钥可以看成是一个锁头,私钥就是对应的钥匙。生成的ssh密钥是可以用到不同的地方的,比例同时添加到github,coding,gitlab的平台。
- MAC环境下
# 列出当前已存在的SSH:
ls -al ~/.ssh
# 生成新的ssh
ssh-keygen -t rsa -C "hwwu3@iflytek.com" -b 4096
# 复制ssh公钥
pbcopy < ~/.ssh/id_rsa_gitlab.pub(Mac)
cat ~/.ssh/id_rsa_gitlab.pub | clip (Git Bash)
# 添加公钥到平台
# 测试连接
ssh -T git@你的gitlab服务器地址
# 第一次连接会提示
Are you sure you want to continue connecting (yes/no)? yes
输入yes,回车 如果设了密码,会让你输入密码:
输入密码,如果密码正确的话,就会提示Welcome to GitLab, username!
# 编写config文件,告诉本地git到不同的国家带不同的钥匙
#gitlab
Host gitlab
HostName gitlab.*.com
IdentityFile ~/.ssh/gitlab_id_rsa
#github
Host github
HostName github.com
IdentityFile ~/.ssh/github_id_rsa
# 配置仓库
#gitlab
cd ~/workspace/gitlab
git init
git config --global user.name 'personal'
git config --global user.email 'personal@company.com'
- WINDOWS环境下
# 初始化
git init
# 在存储库中打包解包的对象
git-repack -a
# 创建并切换分支
git checkout -b dev’
# 下载项目
git clone https://github.com/facebook/react-native.
# 创建分支
git branch [branchname]
# 切换分支
git checkout [branchname]
# 命令加上-b参数表示创建并切换
git checkout -b [branchname]
# 查看当前分支(当前分支前面会标一个*号)
git branch
# 查看远程分支
git branch -r
# git push 本地分支到远程仓库
git push origin compose
# 在新增分支上操作
git add test.txt
# Stage ALL(new,modified,deleted) files
git add .
git add -A
git commit -m "说明"
# 切换回master分支
git checkout master
# 合并分支工作成果到master分支上
git merge [branchname]
# 删除本地新增的分支
git branch -d [branchname]
# 删除远程分支
git push origin :[branchname]
# 查看远程仓库信息
git remote
# 提交本地分支到远程仓库分支
git push dev orgin/dev
# 创建远程origin的dev分支到本地
git checkout -b dev origin/dev
# 查看最近三次提交记录
git log
# 查看所有的提交
git reflog
# 回退版本
# 彻底回退到某个版本(包括源码)
git reset --hard [commitid]
# 只回退了commit的信息,不会恢复到index file一级
git reset --soft [commitid]
# 默认方式,只保留源码,回退commit和index信息
git reset [commitid]
# 工作区(work dict)和暂存区(stage)的比较
git diff
# 暂存区(stage)和分支(master)的比较
git diff --cached
# 下载项目到指定目录
git clone https://github.com/Bilibili/ijkplayer.git ijkplayer-android
# clone 断点续传
git fetch https://github.com/Bilibili/ijkplayer.git
# The following untracked working tree files would be overwritten by checkout
# 删除 一些 没有 git add 的 文件;
git clean -d -fx
# git配置信息
git config —list
# 远程仓库信息
git remote -v
参考文章
常见问题及解决方法
错误代码:
getLastSuccessful failed. token: 25dc1437-bde5-414b-8f4c-63e9b7026ea4, userName: git@github.com, client: http://localhost:63342/RPC2
java.lang.RuntimeException: Invocation failed Operation timed out
at org.jetbrains.git4idea.ssh.GitSSHXmlRpcClient.getLastSuccessful(GitSSHXmlRpcClient.java:230)
at org.jetbrains.git4idea.ssh.SSHMain.authenticate(SSHMain.java:212)
at org.jetbrains.git4idea.ssh.SSHMain.start(SSHMain.java:173)
at org.jetbrains.git4idea.ssh.SSHMain.main(SSHMain.java:138)
Caused by: java.net.ConnectException: Operation timed out
at java.net.PlainSocketImpl.socketConnect(Native Method)
解决方法:
- Click File-> Settings. Keyboard shortcut is Ctrl+Alt+S.
- Search for “Version Control”
- Choose “Git” under “version Control”
- In the SSH executable dropdown, choose Native
错误代码:
Clone failed
RPC failed; curl 56 SSLRead() return error -9806
The remote end hung up unexpectedly
early EOF
index-pack failed
解决方法:
git config --global http.postBuffer 1048576000
网上查查资料,才发现是淘宝的镜像源关闭了。
解决方法,很简单,把旧的镜像删除,换成Rubby China.
gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
gem sources -l
gem install rails