git.md
是目前世界上最先进的分布式版本控制系统
补充说明
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 [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]选项
例子
init
git init #初始化
status
git status #获取状态
add
git add file # .或*代表全部添加
git rm --cached <added_file_to_undo> # 在commit之前撤销git add操作
git reset head # 好像比上面git rm --cached更方便
commit
git commit -m "message" #此处注意乱码
remote
git remote add origin [email protected]:JSLite/test.git #添加源
push
clone
git clone git://github.com/JSLite/JSLite.js.git
git clone git://github.com/JSLite/JSLite.js.git mypro #克隆到自定义文件夹
git clone [user@]example.com:path/to/repo.git/ #SSH协议还有另一种写法。
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。git clone <版本库的网址> <本地目录名>
配置
首先是配置帐号信息 ssh -T [email protected] 测试。
修改项目中的个人信息
配置自动换行
自动转换坑太大,提交到git是自动将换行符转换为lf
常见使用场景
创建SSH密钥
这个密钥用来跟 github 通信,在本地终端里生成然后上传到 github
多账号ssh配置
1.生成指定名字的密钥
ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa
会生成 jslite_rsa 和 jslite_rsa.pub 这两个文件
2.密钥复制到托管平台上
vim ~/.ssh/jslite_rsa.pub
打开公钥文件 jslite_rsa.pub ,并把内容复制至代码托管平台上
3.修改config文件
vim ~/.ssh/config #修改config文件,如果没有创建 config
Host这里是个别名可以随便命名HostName一般是网站如:[email protected]:username/repo.git填写github.comUser通常填写gitIdentityFile使用的公钥文件地址
4.测试
5.使用
5.注意
如果你修改了id_rsa的名字,你需要将ssh key添加到SSH agent中,如:
免密码登录远程服务器
编辑 ~/.ssh/config
上面配置完了,可以通过命令登录,不需要输入IP地址和密码 ssh aliyun1
https协议下提交代码免密码
通过上面方式克隆可能需要密码,解决办法:进入当前克隆的项目 vi rep/.git/config 编辑 config, 按照下面方式修改,你就可以提交代码不用输入密码了。
文件推向3个git库
1. 增加3个远程库地址
2. 删除其中一个 set-url 地址
git remote set-url --delete origin https://oschina.net/wang/JSLite.js.git
3.推送代码
4.拉代码
只能拉取 origin 里的一个url地址,这个fetch-url
默认为你添加的到 origin的第一个地址
如果远程主机删除了某个分支,默认情况下,git pull 不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止,由于其他人操作了远程主机,导致git pull不知不觉删除了本地分支。 但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
5.更改pull
只需要更改config文件里,那三个url的顺序即可,fetch-url会直接对应排行第一的那个utl连接。
修改远程仓库地址
撤销远程记录
放弃本地的文件修改
git reset --hard FETCH_HEAD 出现错误
解决方法:
最简单放弃本地修改内容
通过存储暂存区stash,在删除暂存区的方法放弃本地修改。
回滚到某个commit提交
回退到某一个版本
去掉某个commit
新建一个空分支
合并多个commit
修改远程Commit记录
保存并退出,会弹出下面提示
添加忽略文件
利用commit关闭一个issue
这个功能在Github上可以玩儿,Gitlab上特别老的版本不能玩儿哦,那么如何跟随着commit关闭一个issue呢? 在confirm merge的时候可以使用一下命令来关闭相关issue:
fixes #xxx、 fixed #xxx、 fix #xxx、 closes #xxx、 close #xxx、 closed #xxx、
同步fork的上游仓库
Github教程同步fork教程,在Github上同步一个分支(fork)
设置添加多个远程仓库地址。
在同步之前,需要创建一个远程点指向上游仓库(repo).如果你已经派生了一个原始仓库,可以按照如下方法做。
同步更新仓库内容
同步上游仓库到你的仓库需要执行两步:首先你需要从远程拉去,之后你需要合并你希望的分支到你的本地副本分支。从上游的存储库中提取分支以及各自的提交内容。 master 将被存储在本地分支机构 upstream/master
检查你的 fork's 本地 master 分支
合并来自 upstream/master 的更改到本地 master 分支上。 这使你的前 fork's master 分支与上游资源库同步,而不会丢失你本地修改。
批量修改历史commit中的名字和邮箱
1.克隆仓库
注意参数,这个不是普通的clone,clone下来的仓库并不能参与开发
2.命令行中运行代码
OLD_EMAIL原来的邮箱 CORRECT_NAME更正的名字 CORRECT_EMAIL更正的邮箱
将下面代码复制放到命令行中执行
执行过程
3.同步到远程仓库
同步到push远程git仓库
我还遇到了如下面错误,lab默认给master分支加了保护,不允许强制覆盖。Project(项目)->Setting->Repository 菜单下面的Protected branches把master的保护去掉就可以了。修改完之后,建议把master的保护再加回来,毕竟强推不是件好事。
当上面的push 不上去的时候,先 git pull 确保最新代码
查看某个文件历史
打造自己的git命令
配置好后再输入git命令的时候就不用再输入一大段了,例如我们要查看状态,只需:
中文乱码的解决方案
新建仓库
init
git init #初始化
status
git status #获取状态
add
git add file # .或*代表全部添加
git rm --cached <added_file_to_undo> # 在commit之前撤销git add操作
git reset head # 好像比上面git rm --cached更方便
commit
git commit -m "message" #此处注意乱码
remote
git remote add origin [email protected]:JSLite/test.git #添加源
push
clone
git clone git://github.com/JSLite/JSLite.js.git
git clone git://github.com/JSLite/JSLite.js.git mypro #克隆到自定义文件夹
git clone [user@]example.com:path/to/repo.git/ #SSH协议还有另一种写法。
git clone支持多种协议,除了HTTP(s)以外,还支持SSH、Git、本地文件协议等,下面是一些例子。git clone <版本库的网址> <本地目录名>
本地
help
add
rm
commit
reset
revert
checkout
diff
stash
merge
cherry-pick
rebase
分支branch
删除
提交
拉取
git fetch -p #拉取远程分支时,自动清理 远程分支已删除,本地还存在的对应同名分支。
分支合并
重命名
git branch -m old new #重命名分支
查看
新建
连接
分支切换
远端
submodule
克隆项目同时克隆submodule
克隆项目,之后再手动克隆 submodule 子项目
当使用git clone下来的工程中带有submodule时,初始的时候,submodule的内容并不会自动下载下来的,此时,只需执行如下命令:
删除文件
remote
git是一个分布式代码管理工具,所以可以支持多个仓库,在git里,服务器上的仓库在本地称之为remote。个人开发时,多源用的可能不多,但多源其实非常有用。
标签tag
当开发到一定阶段时,给程序打标签是非常棒的功能。
日志log
选项
说明
选项
说明
%H
提交对象(commit)的完整哈希字串
%ad
作者修订日期(可以用 -date= 选项定制格式)
%h
提交对象的简短哈希字串
%ar
作者修订日期,按多久以前的方式显示
%T
树对象(tree)的完整哈希字串
%cn
提交者(committer)的名字
%t
树对象的简短哈希字串
%ce
提交者的电子邮件地址
%P
父对象(parent)的完整哈希字串
%cd
提交日期
%p
父对象的简短哈希字串
%cr
提交日期,按多久以前的方式显示
%an
作者(author)的名字
%s
提交说明
%ae
作者的电子邮件地址
-
-
重写历史
改成
删除仓库
其它
报错问题解决
1. git fatal: protocol error: bad line length character: No s
解决办法:更换remote地址为 http/https 的
2. The requested URL returned error: 403 Forbidden while accessing
解决github push错误的办法:
3. git status 显示中文问题
在查看状态的时候 git status 如果是中文就显示下面的情况
解决这个问题方法是:
参考资料
Last updated
Was this helpful?