WHS GIS Engineer

常用Git命令及问题

2017-05-03
WHS

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)

解决方法:

  1. Click File-> Settings. Keyboard shortcut is Ctrl+Alt+S.
  2. Search for “Version Control”
  3. Choose “Git” under “version Control”
  4. 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

Comments