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常用命令清单

语法

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_rsajslite_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.com

  • User 通常填写git

  • IdentityFile 使用的公钥文件地址

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 #xxxfixed #xxxfix #xxxcloses #xxxclose #xxxclosed #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

作者的电子邮件地址

-

-

Pretty Formats

重写历史

改成

删除仓库

Github官方教程

其它

报错问题解决

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?