双月湾,适合让心灵小憩的美貌渔村军事

4.2 代码回滚  

近来,你早已学会了修改文件,然后把修改提交到Git版本库,现在,再练习1次,修改first_git_file.txtt文件如下: 

1
2
3
4
5
First time using git, excited! update ...
insert line here..改之前的.
第一次用git哈哈
insert line again haha...
加点新内容 

接下来尝试提交:

1
2
3
4
5
$ git add first_git_file.txt
$ git commit -m "add new content"
[master 4459657] add new content
 Committer: Alex Li <alex@Alexs-MacBook-Pro.local>
 file changed, 2 insertions(+), 1 deletion(-)

像这么,你不休对文件举行修改,然后不断提交修改到版本库里,就好比玩奥迪Q5PG游戏时,每经过一关就会活动把嬉戏情形存盘,假诺某一关没过去,你仍是可以够挑选读取前一关的景观。有些时候,在打Boss此前,你会手动存盘,以便万一打Boss失败了,能够从近来的地方重新开头。Git也是千篇一律,每当你认为文件修改到一定水准的时候,就可以“保存二个快速照相”,这些快速照相在Git中被喻为commit。一旦你把文件改乱了,或许误删了文件,还足以从近日的三个commit回复,然后继续工作,而不是把多少个月的办事战果全体有失。

当今,大家想起一下first_git_file.txt文件一共有多少个版本被交给到Git仓Curry了: 

版本1

1
2
first time using git, excited!
第一次用git哈哈

版本2

1
2
3
first time using git, excited!
insert line here...
第一次用git哈哈

版本3

1
2
3
4
first time using git, excited!
insert line here...
第一次用git哈哈
insert line again haha...

版本4

1
2
3
4
5
First time using git, excited! update ...
insert line here..改之前的.
第一次用git哈哈
insert line again haha...
加点新内容

本来了,在其实工作中,我们脑子里怎么大概记得3个几千行的文件每便都改了什么内容,不然要版本控制系统为何。版本控制系统肯定有某些命令能够告诉大家历史记录,在Git中,大家用git log指令查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$ git log
commit 445965781d1fd0d91e76d120450dd18fd06c7489
Author: Alex Li <alex@Alexs-MacBook-Pro.local>
Date:   Tue Oct 4 18:44:29 2016 +0800
 
    add new content
 
commit be02137bb2f54bbef0c2e99202281b3966251952
Author: Alex Li <alex@Alexs-MacBook-Pro.local>
Date:   Tue Oct 4 17:55:16 2016 +0800
 
    update again
 
commit 50ad6b526810bb7ccfea430663757ba2337b9816
Author: Alex Li <alex@Alexs-MacBook-Pro.local>
Date:   Tue Oct 4 17:46:51 2016 +0800
 
    commit changes
 
commit 621e6e44d04fa6a1cdc37826f01efa61b451abd1
Author: Alex Li <alex@Alexs-MacBook-Pro.local>
Date:   Tue Oct 4 17:42:50 2016 +0800
 
    commit my first git file

git log指令彰显从近来到最远的交由日志,我们得以见见四次提交,如今的一回是add
new content,上3次是update
again,最早的二遍是commit my first git file
如果嫌输出音讯太多,看得乌烟瘴气的,能够试试加上--pretty=oneline参数:  

1
2
3
4
5
$ git log --pretty=oneline
445965781d1fd0d91e76d120450dd18fd06c7489 add new content
be02137bb2f54bbef0c2e99202281b3966251952 update again
50ad6b526810bb7ccfea430663757ba2337b9816 commit changes
621e6e44d04fa6a1cdc37826f01efa61b451abd1 commit my first git file

急需友情提醒的是,你看来的一大串类似3628164...882e1e0的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是二个SHA1总括出来的1个不行大的数字,用十六进制表示,而且你见到的commit id和自家的必定分歧,以你本人的为准。为何commit id亟需用那样第一次全国代表大会串数字代表呢?因为Git是分布式的版本控制系统,后边大家还要研究五个人在同一个版本Curry工作,假设咱们都用1,2,3……作为版本号,那必然就争辨了。  

 

回滚回滚回滚  

好了,未来大家运维时光穿梭机,准备把first_git_file.txt回退到上2个本子,也正是“update
again”的可怜版本,如何是好呢?

先是,Git必须精晓当前版本是哪些版本,在Git中,用HEAD意味着近日版本,也正是流行的交给be02137bb2f54bbef0c2e99202281b3966251951(注意自身的付出ID和您的早晚分歧等),上3个版本就是HEAD^,上上三个版本就是HEAD^^,当然往上九十七个本子写九拾八个^正如易于数不回复,所以写成HEAD~100

现今,大家要把近年来版本“add new content”回退到上一个本子“update
again”,就足以利用git reset命令:

1
2
$ git reset --hard HEAD^
HEAD is now at be02137 update again

那儿再看你的文件内容,果然就退回去了

1
2
3
4
5
more first_git_file.txt
First time using git, excited! update ...
insert line here...
第一次用git哈哈
insert line again haha...

那时候还足以一而再再往前回退3个本子,然则且慢,然我们用git log再看看未来版本库的处境:

1
2
3
4
$ git log --pretty=oneline
be02137bb2f54bbef0c2e99202281b3966251952 update again
50ad6b526810bb7ccfea430663757ba2337b9816 commit changes
621e6e44d04fa6a1cdc37826f01efa61b451abd1 commit my first git file

摩登的10分版本add new
content已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回到已经回不去了,如何是好?

办法其实如故有个别,只要上边的命令行窗口还尚未被关掉,你就足以顺着往上找啊找啊,找到分外add
new content的commit id是445965781d1fd0d91e76d120450dd18fd06c7489

,于是就可以钦定回到未来的某些版本:

1
2
git reset --hard 4459657
HEAD is now at 4459657 add new content

版本号没供给写全,前3人就足以了,Git会自动去找。当然也无法只写前一两位,因为Git大概会找到八个版本号,就不可能分明是哪一个了。

再严刻地探访first_git_file.txt的内容:

1
2
3
4
5
First time using git, excited! update ...
insert line here..改之前的.
第一次用git哈哈
insert line again haha...
加点新内容

果不其然,笔者胡汉三又重返了。

Git的版本回退速度一点也相当慢,因为Git在中间有个针对当前版本的HEAD指南针,当你回退版本的时候,Git仅仅是把HEAD从指向add new content

 

如今,你回退到了有个别版本,关掉了微型总结机,第②天晚上就后悔了,想苏醒到新本子怎么做?找不到新本子的commit
id咋办?

在Git中,总是有忏悔药能够吃的。当你用$ git reset –hard
HEAD^回退到update again版本时,再想过来到最新add new
content的本子,就必须找到add new contentL的commit
id。Git提供了三个下令git reflog用来记录您的每趟命令:

1
2
3
4
5
6
7
8
9
10
11
$ git reflog
4459657 HEAD@{0}: reset: moving to 4459657
be02137 HEAD@{1}: reset: moving to HEAD^
4459657 HEAD@{2}: commit: add new content
be02137 HEAD@{3}: reset: moving to be02137bb
50ad6b5 HEAD@{4}: reset: moving to 50ad6b5
621e6e4 HEAD@{5}: reset: moving to 621e6e44
50ad6b5 HEAD@{6}: reset: moving to HEAD^
be02137 HEAD@{7}: commit: update again
50ad6b5 HEAD@{8}: commit: commit changes
621e6e4 HEAD@{9}: commit (initial): commit my first git file

到底舒了口气,第1行展现add new content的commit
id是4459657,将来,你又能够乘坐时光机回到今后了。  

 

 

对于影友们的话,能够考虑花一两日时间,扛着照相机,搭起帐篷,从日出到日落,将自然美景尽收眼底,定格每3个佳绩弹指间。

8. 远程仓库  

到近日甘休,大家早已控制了何等在Git仓Curry对一个文件进行时光穿梭,你再也不用担心文件备份恐怕丢失的难点了。

不过有用过集中式版本控制系统SVN的童鞋会站出来说,这一个效能在SVN里早就有了,没看出Git有怎么着尤其的地方。

毋庸置疑,如若只是在3个仓Curry管理文件历史,Git和SVN真没啥区别。为了确定保障你将来所学的Git物超所值,现在断然不会后悔,同时为了打击已经不幸学了SVN的童鞋,本章初步介绍Git的刺客级功效之一(注意是之一,也正是前边还有之二,之三……):远程仓库。

Git是分布式版本控制系统,同多个Git仓库,能够分布到差异的机器上。怎么分布呢?最早,肯定唯有一台机器有3个原始版本库,此后,其他机器能够“克隆”那一个原始版本库,而且每台机械的版本库其实都以一模一样的,并从未先后之分。

你势必会想,至少要求两台机械才能玩远程库不是?可是作者唯有一台微型计算机,怎么玩?

实际上一台微型总括机上也是能够仿造多个本子库的,只要不在同1个索引下。可是,现实生活中是不会有人这么傻的在一台微型计算机上搞多少个长途库玩,因为一台计算机上搞多少个长途库完全没有意思,而且硬盘挂了会招致全体库都挂掉,所以自个儿也不报告你在一台总结机上怎么克隆八个仓库。

实则情状屡屡是这么,找一台电脑充当服务器的剧中人物,每日24钟头开机,其余每种人都从这几个“服务器”仓Cook隆一份到本人的电脑上,并且各自把各自的交给推送到服务器仓Curry,也从服务器仓库中拉取别人的付出。

完全能够团结搭建一台运营Git的服务器,可是当下,为了学Git先搭个服务器相对是神经过敏。幸亏这些世界上有个叫GitHub的神奇的网站,从名字就足以看出,那几个网站就是提供Git仓库托管服务的,所以,只要注册四个GitHub账号,就足以防费得到Git远程仓库。

在再三再四读书后续内容前,请自行注册GitHub账号。由于你的当地Git仓库和GitHub仓库之间的传导是经过SSH加密的,所以,要求或多或少安装:

第③步:成立SSH
Key。在用户主目录下,看看有没有.ssh目录,要是有,再看看那些目录下有没有id_rsaid_rsa.pub那七个公文,假如已经有了,可直接跳到下一步。倘若没有,打开Shell(Windows下开拓Git
Bash),创造SSH Key:

1
ssh-keygen -t rsa -C "youremail@example.com"

您要求把邮件地址换来你协调的邮件地址,然后共同回车,使用默许值即可,由于那几个Key也不是用来军事指标,所以也无需安装密码。

一经一切顺遂的话,能够在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub四个文本,那五个正是SSH
Key的秘钥对,id_rsa是私钥,不可能泄揭发来,id_rsa.pub是公钥,能够放心地告诉任何人。

第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:

下一场,点“Add SSH
Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文本的始末:

军事 1

点“Add Key”,你就应当看到已经增进的Key

为何GitHub须要SSH
Key呢?因为GitHub须求识别出您推送的交给确实是您推送的,而不是人家冒充的,而Git援救SSH协议,所以,GitHub只要领悟了您的公钥,就能够确认唯有你协调才能推送。

自然,GitHub允许你添加多个Key。假定你有好多电脑,你说话在合营社付给,一会儿在家里提交,只要把每台总计机的Key都拉长到GitHub,就能够在每台电脑上往GitHub推送了。

最终友情提示,在GitHub上免费托管的Git仓库,任何人都能够看来喔(但唯有您本人才能改)。所以,不要把敏感音讯放进去。

假定您不想让外人看来Git库,有三个章程,贰个是交点敬重费,让GitHub把公开的仓库变成私有的,那样外人就看不见了(不可读更不得写)。另三个方式是团结入手,搭三个Git服务器,因为是你自身的Git服务器,所以旁人也是看不见的。那个方法大家前面会讲到的,格外不难,集团内部支出必备。

确定保障您有所2个GitHub账号后,大家就将要开端远程仓库的求学。

  

作者查了下资料,那一个自然尊崇区是列入
《Lamb萨尔公约》国际最首要湿地名录的历史观水龟产卵场,也是黄安徽部大陆沿岸唯一的产卵场。

4. 代码回滚

回忆碑全部占地面积1500平米,建有回想碑台、休息石座、娱乐棋盘等,个中碑台主体占地面积150平米,碑高约4.3米。回想碑背山面海,建筑雄伟壮观,庄体面穆,四周郁郁葱葱。

9.4 bug分支  

软件开发中,bug就像普通便饭一样。有了bug就须要修补,在Git中,由于支行是那般的强劲,所以,每种bug都能够通过一个新的权且分段来修复,修复后,合并分支,然后将近期分段删除。

当您接到三个修复多个代号101的bug的职分时,很自然地,你想创设一个分段issue-101来修复它,然则,等等,当前正在dev上海展览中心开的工作还没有提交:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git status
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   hello.py
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   readme.txt
#

  

并不是你不想付出,而是工作只进行到五成,还没办法交付,估算达成还需1天时间。不过,必须在七个钟头内修复该bug,怎么做?

幸亏,Git还提供了多个stash成效,可以把当前工作现场“储藏”起来,等之后苏醒现场后持续工作:

1
2
3
$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge

现在,用git status查阅工作区,便是根本的(除非有没有被Git管理的文本),由此可以放心地开创分支来修复bug。

率先鲜明要在哪些分支上修复bug,假定需求在master分层上修复,就从master始建一时半刻分段:

1
2
3
4
5
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
$ git checkout -b issue-101
Switched to a new branch 'issue-101'

昨天修复bug,必要把“Git is free software …”改为“Git is a free software
…”,然后交给:

1
2
3
4
$ git add readme.txt
$ git commit -m "fix bug 101"
[issue-101 cc17032] fix bug 101
 file changed, 1 insertion(+), 1 deletion(-)

修补完结后,切换来master分层,并成功合并,最后删除issue-101分支:

1
2
3
4
5
6
7
8
9
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.
 readme.txt |    2 +-
 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-101
Deleted branch issue-101 (was cc17032).

  

太棒了,原布署多个时辰的bug修复只花了四分钟!以后,是时候随着回到dev支行干活了!

1
2
3
4
5
$ git checkout dev
Switched to branch 'dev'
$ git status
# On branch dev
nothing to commit (working directory clean)

  

工作区是根本的,刚才的干活现场存到哪去了?用git stash list指令看看:

1
2
$ git stash list
stash@{0}: WIP on dev: 6224937 add merge

办事现场还在,Git把stash内容存在某些地点了,可是急需还原一下,有多个格局:

一是用git stash apply复原,可是还原后,stash内容并不删除,你须求用git stash drop来删除;

另一种办法是用git stash pop,复苏的还要把stash内容也删了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git stash pop
# On branch dev
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   hello.py
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   readme.txt
#
Dropped refs/stash@{0} (f624f8e5f082f2df2bed8a4e09c12fd2943bdd40)

再用git stash list查看,就看不到任何stash内容了:

1
$ git stash list

您能够频繁stash,恢复生机的时候,先用git stash list翻开,然后还原钦赐的stash,用命令:

1
$ git stash apply stash@{0}

 

  

 

各种人对此骑行的意义都有区别的明亮。于自家而言,让心灵获得歇息,安贫乐道,与文相伴,四处皆为美景。

把文件添加到版本库

率先那里再显明一下,全部的版本控制系统,其实只能跟踪文本文件的改观,比如TXT文件,网页,全数的程序代码等等,Git也不例外。版本控制系统能够告诉你每趟的变更,比如在第4行加了1个单词“Linux”,在第⑨行删了一个单词“Windows”。而图片、录像那个二进制文件,即使也能由版本控制系统管理,但无奈跟踪文件的浮动,只可以把二进制文件每回变更串起来,也便是只略知一二图片从100KB改成了120KB,但究竟改了什么,版本控制系统不明了,也迫于理解。

倒霉的是,Microsoft的Word格式是二进制格式,因而,版本控制系统是迫于跟踪Word文件的改观的,前面我们举的例证只是为了演示,借使要实在使用版本控制系统,就要以纯文本形式编写文件。

因为文件是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,假若没有历史遗留难题,强烈提议使用规范的UTF-8编码,全体语言应用相同种编码,既没有争论,又被有着平台所协助。

言归正传,以后我们编辑二个first_git_file.txt文件,内容如下:

1
2
3
4
$ vim first_git_file.txt
 
first time using git, excited!
第一次用git哈哈

毫无疑问要放到git_trainning目录下(子目录也行),因为这是2个Git仓库,放到任啥地点方Git再厉害也找不到这么些文件。

和把大象放到双门电冰箱供给3步比较,把三个文书放到Git仓库只须求两步。

第一步,用命令git add告知Git,把文件添加到仓库:

1
$ git add first_git_file.txt

履行上边的指令,没有其余展现,表明添加成功。

第二步,用命令git commit告诉Git,把公文提交到仓库:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ git commit -m "commit my first git file"
 
[master (root-commit) 621e6e4] commit my first git file
 Committer: Alex Li <alex@alexs-macbook-pro.local>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly. Run the
following command and follow the instructions in your editor to edit
your configuration file:
 
    git config --global --edit
 
After doing this, you may fix the identity used for this commit with:
 
    git commit --amend --reset-author
 
 file changed, 2 insertions(+)
 create mode 100644 first_git_file.txt
</alex@alexs-macbook-pro.local>

中间鲜蓝部分的意趣是,你在往gitCurry提交代码时,你必要告诉git你是哪个人,那样git就会纪录下来是哪个人改的代码,其实就是为着未来查询方便,你只供给提供一个名字和邮件地址就足以,那里小编的git直接通过主机名本人创造了2个,但您能够经过git
config –global –edit
修改

 

简短解释一下git commit命令,-m末端输入的是本次交付的印证,能够输入随机内容,当然最佳是有意义的,那样你就能从历史记录里方便地找到改动记录。

嫌麻烦不想输入-m "xxx"好依旧倒霉?确实有办法能够这么干,可是鲜明不提出您如此干,因为输入表明对协调对外人阅读都很重要。

何以Git添加文件须求addcommit总括两步呢?因为commit能够1次提交很多文书,所以你能够屡屡add不等的文本,比如:

1
2
3
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

  

三只听海浪的声音

安装Git

最早Git是在Linux上支付的,非常短一段时间内,Git也不得不在Linux和Unix系统上跑。可是,稳步地有人把它移植到了Windows上。未来,Git能够在Linux、Unix、Mac和Windows这几大平台上寻常运作了。

 

 

 

 

 

 

要使用Git,第1步当然是安装Git了。根据你日前采取的平台来读书下边包车型大巴文字:

假日率后天,我们睡了个饱觉,10点钟才从保定益州的家里出发,早晨1点左右到达目标地。

10.1 推送分支

推送分支,正是把该支行上的拥有地点提交推送到远程库。推送时,要内定地点分支,那样,Git就会把该支行推送到远程库对应的长距离分支上:

1
$ git push origin master

一旦要推送别的分支,比如dev,就改成:

1
$ git push origin dev

而是,并不是听之任之要把本地分支往远程推送,那么,哪些分支要求推送,哪些不须求吗?

  • master支行是主分支,因而要时时与长途同步;

  • dev支行是支付分支,团队拥有成员都须要在上头工作,所以也急需与长途同步;

  • bug分支只用于在地点修复bug,就没须要推到远程了,除非COO要看看你每全面底修复了多少个bug;

  • feature分支是否推到远程,取决于你是不是和您的同伙合营在地点开发。

综上说述,正是在Git中,分支完全能够在本地本人藏着玩,是或不是推送,视你的心理而定!

在双月湾,晌午看日出,漫步沙滩,玩玩沙滩车、水翼船,下午吃美食,早上捡贝壳,深夜抓螃蟹,进行篝火晚会都以很完美的感触。

9.3 分支策略

在事实上支出中,我们理应根据多少个主旨标准开始展览分层管理:

首先,master支行应该是老大安静的,也正是仅用来公布新本子,平常无法在地点干活;

那在哪干活呢?干活都在dev支行上,也正是说,dev支行是不安定的,到有个别时候,比如1.0本子公布时,再把dev支行合并到master上,在master分段宣布1.0本子;

你和您的同伙们各种人都在dev支行上工作,各个人都有谈得来的分层,时不时地往dev支行上统一就能够了。

为此,团队同盟的分层看起来就如这么:

军事 2

 

 

出自地狱的海鲜

在Linux上安装Git

率先,你能够试着输入git,看看系统有没有安装Git:

1
2
3
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git

像上面包车型客车一声令下,有诸多Linux会友好地告知您Git没有设置,还会报告你怎么设置Git。

假若你刚好用Debian或Ubuntu
Linux,通过一条sudo apt-get install git就足以一直完事Git的装置,万分简单。

 

我们的第叁天午夜即是在多个不盛名的礁石山上度过的。后来写那篇文时发现这里正是当地人所说的“情人岛”。

11. github使用

咱俩直接用GitHub作为免费的远程仓库,假诺是个人的开源项目,放到GitHub上是一点一滴没分外的。其实GitHub如故3个开源同盟社区,通过GitHub,既可以让别沙插手你的开源项目,也得以涉足外人的开源项目。

在GitHub现身在此之前,开源项目开源简单,但让周边人民群众加入进来比较辛勤,因为要参与,就要交给代码,而给各种想付出代码的公众都开三个账号那是不具体的,因而,群众也仅限于报个bug,尽管能改掉bug,也只好把diff文件用邮件发过去,很不便宜。

不过在GitHub上,利用Git极其强大的仿造和支行作用,广大老百姓群众实在得以率先次自由参加各类开源项目了。

什么出席2个开源项目呢?比如人气极高的bootstrap项目,这是一个万分强劲的CSS框架,你能够访问它的档次主页https://github.com/twbs/bootstrap,点“Fork”就在祥和的账号下仿制了几个bootstrap仓库,然后,从友好的账号下clone:

1
git clone git@github.com:michaelliao/bootstrap.git

必然要从友好的账号下clone仓库,那样您才能推送修改。假若从bootstrap的笔者的堆栈地址git@github.com:twbs/bootstrap.git仿造,因为尚未权力,你将不可能推送修改。

Bootstrap的法定仓库twbs/bootstrap、你在GitHub上克隆的仓库my/bootstrap,以及你本身克隆到地头电脑的仓库,他们的关联就如下图体现的那么:

军事 3

 

设若你想修复bootstrap的3个bug,恐怕新增3个职能,立时就足以最先工作,干完后,往团结的库房推送。

假设你指望bootstrap的官方库能经受你的改动,你就足以在GitHub上提倡1个pull
request。当然,对方是或不是接受你的pull request就不自然了。

若果你没能力修改bootstrap,但又想要试一把pull
request,那就Fork一下自身的仓库:https://github.com/triaquae/gitskills ,创造二个your-github-id.txt的文本文件,写点本身上学Git的体会,然后推送四个pull
request给自己,小编会视心理而定是不是接受。

小结

  • 在GitHub上,能够任意Fork开源仓库;

  • 协调有着Fork后的堆栈的读写权限;

  • 能够推送pull request给官方仓库来进献代码。

  

  

第二个是大星山炮台。也等于我们日前提到能够俯瞰双月湾全貌的地点。

 

自身觉得在那之中有二个尤其值得大家关心:

 

而若不会开车或不赶时间朋友,坐公汽或火车过来也是能够的,马尼拉天河站有车可以坐到惠东风小车公司车总站,再转乘惠东—港口专线到海港车站总站,步行一段距离可到双月湾。也能够到Taobao上订直达的专车,100多块能够跟团去惠东车站有成千成万大巴接客,包车100-130元一般都足以走的,淡季要砍更低一些。

10.2 抓取分支

三个人合作时,我们都会往masterdev分段上推送各自的修改。

现行,模拟1个您的同伙,能够在另一台微型计算机(注意要把SSH
Key添加到GitHub)只怕千篇一律台总计机的另二个目录下仿制:

1
2
3
4
5
6
7
$ git clone git@github.com:triaquae/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (7/7), done.
remote: Total 16 (delta 0), reused 10 (delta 0), pack-reused 0
Receiving objects: 100% (16/16), done.
Checking connectivity... done.

当您的同伙从远程库clone时,暗中同意情状下,你的伙伴只可以看看地面包车型客车master分段。不信能够用git branch命令看看:

1
2
$ git branch
* master

近来,你的伴儿要在dev支行上开发,就必须创设远程origindev支行到地点,于是她用这些命令制造本地dev分支:

1
$ git checkout -b dev origin/dev

以后,他就足以在dev上继承修改,然后,时不时地把dev分支push到远程:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ git add .
$ git commit -m "small updates"
 
[dev f1b762e] small updates
 2 files changed, 5 insertions(+), 1 deletion(-)
Alexs-MacBook-Pro:gitskills alex$ git push origin dev
Counting objects: 4, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 438 bytes | 0 bytes/sdone.
Total 4 (delta 0), reused 0 (delta 0)
To git@github.com:triaquae/gitskills.git
   33ec6b4..f1b762e  dev -> dev

  

你的同伴已经向origin/dev分支推送了他的交付,而刚好你也对同样的文件作了修改,并试图推送:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git add .
$ git commit -m "add Dog class"
[dev 7e7b1bf] add Dog class
 2 files changed, 7 insertions(+)
 
 
$ git push origin dev
 
To git@github.com:triaquae/gitskills.git
 ! [rejected]        dev -> dev (fetch first)
error: failed to push some refs to 'git@github.com:triaquae/gitskills.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again. #提示你了,先把远程最新的拉下来再提交你的
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

推送失利,因为你的同伙的风行提交和你准备推送的交给有争论,解决办法也很简短,Git已经提示大家,先用git pull把新型的提交从origin/dev抓下来,然后,在当地合并,化解顶牛,再推

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git pull
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:triaquae/gitskills
   33ec6b4..f1b762e  dev        -> origin/dev
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
 
    git pull <remote> <branch>
 
If you wish to set tracking information for this branch you can do so with:
 
    git branch --set-upstream-to=origin/<branch> dev

git pull也破产了,原因是尚未点名地点dev分段与长途origin/dev支行的链接,依据提醒,设置devorigin/dev的链接:

1
2
$ git branch --set-upstream-to=origin/dev dev
Branch dev set up to track remote branch dev from origin.

再pull:

1
2
3
4
5
6
$ git pull
Auto-merging hello.py
CONFLICT (content): Merge conflict in hello.py
Auto-merging branch_test.md
CONFLICT (content): Merge conflict in branch_test.md
Automatic merge failed; fix conflicts and then commit the result.

这回git pull成功,然而合并有争持,需求手动消除,消除的措施和支行政管理理中的解决冲突完全平等。消除后,提交,再push:  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git add .
$ git commit -m "merge & fix hello.py"
[dev 93e28e3] merge & fix hello.py
 
$ git push origin dev
 
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 819 bytes | 0 bytes/sdone.
Total 8 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), done.
To git@github.com:triaquae/gitskills.git
   f1b762e..93e28e3  dev -> dev

 

所以,四人搭档的工作方式经常是如此:

  1. 首先,能够试图用git push origin branch-name推送本人的改动;

  2. 只要推送战败,则因为远程分支比你的本土更新,供给先用git pull意欲合并;

  3. 要是统一有争论,则化解争论,并在当地提交;

  4. 从未争持或许消除掉争辨后,再用git push origin branch-name推送就能学有所成!

如果git pull唤醒“no tracking
information”,则证实地点分支和长途分支的链接关系并未开创,用命令git branch --set-upstream branch-name origin/branch-name

那正是多人合营的干活方式,一旦熟练了,就十一分不难。

  

  

出去玩当然首要选用自驾游。一般情形下,华盛顿到双月湾约一个小时,博洛尼亚到双月湾约三个钟头,布拉迪斯拉发则三个半钟头大致就到了。

8.2 从远程库克隆  

大家讲了先有当地库,后有长途库的时候,怎么样关联远程库。

今昔,若是我们从零付出,那么最佳的措施是先创设远程库,然后,从远程Cook隆。

首先,登陆GitHub,成立多少个新的仓库,名字叫gitskills

军事 4

作者们勾选Initialize this repository with a README,那样GitHub会自动为大家创设1个README.md文件。创制实现后,能够看来README.md文件:

  

军事 5

于今,远程库已经准备好了,下一步是用命令git clone克隆2个当地库:

军事 6

在地方找1个你想存放这几个远程仓库的目录,然后在地面命令行用git clone
命令来克隆这么些远程库

1
2
3
4
5
6
7
8
9
10
11
$ git clone git@github.com:triaquae/gitskills.git
Cloning into 'gitskills'...
Warning: Permanently added the RSA host key for IP address '192.30.253.112' to the list of known hosts.
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (3/3), done.
Checking connectivity... done.
 
cd gitskills/  #进入刚clone下来的目录
ls
README.md

设若有多少人同盟开发,那么每一种人各自从远程克隆一份就能够了。

您只怕还在意到,GitHub给出的地方不止1个,还可以够用https://github.com/triaquae/gitskills.git 那样的地点。实际上,Git协助七种协议,默许的git://应用ssh,但也足以利用https等其余协商。

使用https除此而外速度慢以外,还有个最大的劳动是历次推送都无法不输入口令,然则在少数只开花http端口的小卖部里面就无法利用ssh商量而不得不用https

 

在双月湾,住宿的挑选令人眼花缭乱。有富华酒馆,有平价商旅,更有特色民宿,酒馆式公寓,总有一款符合你心中的供给。

9. 支行政管理理  

分段便是科学幻想电影里面包车型客车平行宇宙,当你正在电脑前努力学习Git的时候,另三个您正在另三个平行宇宙里努力学习SVN。

如若多个平行宇宙互不干扰,那对今后的你也没啥影响。可是,在某些时间点,七个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

军事 7

 

 

分段在骨子里中有什么样用吗?假使你准备开发1个新作用,不过要求两周才能做到,第捌日你写了4/8的代码,假若当时交给,由于代码还没写完,不完整的代码库会导致别人不可能做事了。假如等代码全部写完再二回提交,又存在丢失每日进程的宏大风险。

现行反革命有了分层,就毫无怕了。你制造了2个属于你协调的分段,外人看不到,还持续在原先的分层上健康办事,而你在和谐的分支上干活,想付出就付出,直到开发实现后,再贰回性统一到原来的支行上,那样,既安全,又不影响外人干活。

其余版本控制系统如SVN等都有分支管理,然而用过之后您会意识,那个版本控制系统创设和切换分支比蜗牛还慢,简直令人不能忍受,结果分支功效成了安置,我们都不去用。

但Git的道岔是卓绝的,无论创立、切换和删除分支,Git在1分钟之内就能成功!无论你的版本库是二个公文照旧1万个文件。

 

立刻已到了晚饭时光,我们从沙滩玩回来,一路走,一路看,哒看见顺眼的店面就停一停,作者主动上网查看价格做决定。

5. 工作区和暂存区

Git和任何版本控制系统如SVN的几个区别之处便是有暂存区的定义。

先来看名词解释。

工作区(Working Directory

即便你在微机里能看到的目录,比如小编的git_trainning文件夹正是3个工作区:

1
2
ls git_trainning/
first_git_file.txt

版本库(Repository)

工作区有一个隐形目录.git,这几个不算工作区,而是Git的版本库。

Git的版本Curry存了众多东西,个中最要紧的便是名为stage(大概叫index)的暂存区,还有Git为大家自行创设的率先个支行master,以及针对性master的叁个指南针叫HEAD

军事 8

分支和HEAD的定义大家之后再讲。

前边讲了大家把公文往Git版本Curry增进的时候,是分两步执行的:

第三步是用git add把文件添加进去,实际上正是把公文修改添加到暂存区;

其次步是用git commit交付更改,实际上便是把暂存区的全体内容提交到当前支行。

因为我们创立Git版本库时,Git自动为我们制造了唯一3个master分支,所以,现在,git commit就是往master分段上付出更改。

你能够不难明了为,供给付出的公文修改通通放到暂存区,然后,1回性交给暂存区的拥有修改。

俗话说,实践出真知。未来,大家再演习3遍,先对first_git_file.txt做个修改,比如加上一行内容:

1
2
3
4
5
6
First time using git, excited! update ...
insert line here..改之前的.
第一次用git哈哈
insert line again haha...
加点新内容
update v5

然后,在工作区新增三个readme.md文件文件(内容随便写)。

先用git status查阅一下景况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   first_git_file.txt
 
Untracked files:
  (use "git add <file>..." to include in what will be committed)
 
    readme.md
 
no changes added to commit (use "git add" and/or "git commit -a")

Git相当掌握地报告我们,first_git_file.txt被改动了,而readme.md还向来没有被添加过,所以它的气象是Untracked

今昔,使用命令git add .,再用git status再查看一下:

1
2
3
4
5
6
7
8
9
$ git add .
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
    modified:   first_git_file.txt
    new file:   readme.md
</file>

现今,暂存区的意况就成为这样了:

军事 9

(盗图关系, 那里readme.txt = first_git_file.txt , LICENSE =
readme.md)

所以,git add一声令下实际上正是把要付出的富有修改放到暂存区(Stage),然后,执行git commit就能够一遍性把暂存区的有着修改提交到支行。

1
2
3
4
$ git commit -m "知道暂存区stage的意思了"
[master 9d65cb2] 知道暂存区stage的意思了
 2 files changed, 2 insertions(+)
 create mode 100644 readme.md

若是付出后,倘诺你又从不对工作区做其余改动,那么工作区正是“干净”的:

1
2
3
$ git status
On branch master
nothing to commit, working directory clean

今后版本库变成了那样,暂存区就从未有过此外内容了:

军事 10

(盗图关系, 这里readme.txt = first_git_file.txt , LICENSE =
readme.md)

* *暂存区是Git非凡重要的定义,弄驾驭了暂存区,就弄掌握了Git的成百上千操作到底干了怎样。

 

  

双月湾的沙滩宽绰平坦,碧海晴空邀映夕阳西下,是满世界仅有两处的双湾双海奇景之一。

2. git安装

自小编对革命旅游区平常无感,走走逛逛才是笔者想要的美好。

本节内容

可是,出门在外,小编习惯性听哒的,两个人都仁者见仁,很不难让旅程扩大很多不喜悦。

3.版本库创制

怎样是版本库呢?版本库又名仓库,英文名repository,你能够不难明了成贰个索引,这些目录里面包车型大巴装有文件都得以被Git管理起来,每种文件的改动、删除,Git都能跟踪,以便任哪一天刻都可以追踪历史,可能在今后有个别时刻能够“还原”。

因此,成立贰个版本库分外简单,首先,选拔2个适用的地点,创建三个空目录:

1
2
3
4
5
mkdir git_trainning
cd git_trainning/
 
$ git init
Initialized empty Git repository in /Users/alex/git_trainning/.git/

转眼Git就把库房屋修建好了,而且告诉你是二个空的库房(empty Git
repository),细心的读者能够窥见当前目录下多了八个.git的目录,那么些目录是Git来跟踪管理版本库的,没事千万不要手动修改这一个目录里面的文书,不然改乱了,就把Git仓库给毁掉了。

万一你从未看出.git目录,那是因为那一个目录默认是隐身的,用ls -ah指令就足以望见。

按我们的传道,每一餐都很重庆大学,可别随便吃吃,浪费了肚子。依照哒的经历,人多的地点,一般都不会太差。

6. 撤回修改  

理所当然,你是不会犯错的。可是今后是黎明(Liu Wei)两点,你正在赶一份工作报告,你在readme.md中添加了一条龙:

1
2
3
#git study repo
git is great
but my stupid boss still prefers SVN.

在你准备提交前,一杯咖啡起了效益,你突然发现了“stupid
boss”恐怕会让你丢掉那些月的奖金!

既然如此错误发现得很及时,就能够很简单地校正它。你能够删掉最终一行,手动把公文苏醒到上三个版本的动静。即使用git status查看一下:

1
2
3
4
5
6
7
8
9
10
git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   readme.md
 
no changes added to commit (use "git add" and/or "git commit -a")
</file></file>

您能够窥见,Git会告诉您,git checkout -- file能够废弃工作区的修改:  

1
2
3
4
$ git checkout -- readme.md
 
more readme.md
#git study repo

您刚才添加的2行骂老总的话就被撤消了,

命令git checkout -- readme.md意思就是,把readme.md文本在工作区的修改总体注销,那里有两种状态:

一种是readme.md自修改后还并未被停放暂存区,今后,撤消修改就回来和版本库一模一样的情事;

一种是readme.md现已添加到暂存区后,又作了修改,现在,打消修改就回来添加到暂存区后的情形。

由此可见,正是让那一个文件回到方今1回git commitgit add时的景色。

git checkout -- file一声令下中的--很重要,没有--,就成为了“切换成另一个拨出”的通令,大家在前面包车型客车道岔管理中会再一次碰着git checkout命令。  

 

至今假使是黎明先生3点,你非但写了部分谬论,还git add到暂存区了:

1
2
3
4
5
6
7
8
cat readme.md
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
My stupid boss still prefers SVN.
 
$ git add readme.md

   

幸甚的是,在commit事先,你发觉了那么些题目。用git status查看一下,修改只是丰裕到了暂存区,还不曾付诸: 

1
2
3
4
5
6
7
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
 
    modified:   readme.md
</file>

Git同样告诉我们,用命令git reset HEAD file能够把暂存区的改动打消掉(unstage),重新放回工作区:

1
2
3
$ git reset HEAD readme.md
Unstaged changes after reset:
M   readme.md

git reset一声令下既能够回退版本,也能够把暂存区的修改回退到工作区。当大家用HEAD时,表示最新的本子。

再用git status翻看一下,未来暂存区是根本的,工作区有修改

1
2
3
4
5
6
7
8
9
$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   readme.md
#
no changes added to commit (use "git add" and/or "git commit -a")

还记得如何遗弃工作区的修改吗?

1
2
3
4
$ git checkout -- readme.md
 
more readme.md
#git study repo

凡事世界到底冷静了!

  

除开狗爪螺,关于双月湾的特产的介绍也没别的尤其的,大多是惠东前后的海味和农产品,比如水糍(糍粑)、大顶苦瓜、大圆萝卜、火龙果、紫菜等等。

10. 多个人搭档  

当您从远程仓Cook隆时,实际上Git自动把本地的master支行和远程的master分层对应起来了,并且,远程仓库的暗中认可名称是origin

要翻开远程库的音信,用git remote

1
2
$ git remote
origin

或者,用git remote -v显示更详尽的音讯:

1
2
3
$ git remote -v
origin  git@github.com:triaquae/gitskills.git (fetch)
origin  git@github.com:triaquae/gitskills.git (push)  

地点呈现了足以抓取和推送的origin的地点。假使没有推送权限,就看不到push的地方。

狗爪螺是一种生长在濒海石缝中的节肢动物,一般一簇一簇群生群长,挤附在石头缝中,长年不活动,靠吃水中的微生物生长。

4.1代码修改并交给  

咱俩早就打响地增加并付出了三个first_git_file.txt文件,将来,是时候继续做事了,于是,大家后续修改first_git_file.txt文件,改成如下内容:

1
2
3
First time using git, excited! update ...
insert line here...
第一次用git哈哈

现在,运行git status一声令下看看结果:

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    modified:   first_git_file.txt
 
no changes added to commit (use "git add" and/or "git commit -a")

虽说Git告诉大家first_git_file.txt被涂改了,但只要能看看具体修改了怎么着内容,自然是很好的。比如您休假两周从国外回来,第二天上班时,已经记不清上次怎么修改的readme.txt,所以,须求用git diff本条命令看看:  

1
2
3
4
5
6
7
8
9
10
11
$ git diff first_git_file.txt
diff --git a/first_git_file.txt b/first_git_file.txt
index 2d13c2c..248d853 100644
--- a/first_git_file.txt
+++ b/first_git_file.txt
@@ -1,3 +1,4 @@
-first time using git, excited!
+First time using git, excited! update ...
 insert line here...
 第一次用git哈哈
+insert line again haha...

输出中+号铁蓝呈现的就是修改或新增的内容,-号钴紫突显的正是去掉或被改动的剧情

明亮了对first_git_file.txt 作了怎么修改后,再把它交给到库房就放心多了,提交修改和付出新文件是均等的两步,第3步是git add

1
2
3
4
5
$ git add . # .  代表把当前目录下所有改动的文件都提交到代码库
Alexs-MacBook-Pro:git_trainning alex$ git commit -m "commit changes"
[master 50ad6b5] commit changes
 Committer: Alex Li <alex@Alexs-MacBook-Pro.local>
 file changed, 1 insertion(+)

交付后,我们再用git status命令看看仓库的当下景况:  

1
2
3
$ git status
# On branch master
nothing to commit (working directory clean)

Git告诉大家近来尚未索要交给的改动,而且,工作目录是干净(working
directory clean)的。

  

第二天夜里大家点了多少个菜,有海胆炒饭,泥猛酸菜汤、红焖鱼,还有一盘炒油菜总共200元左右。

12. 马虎特殊文件.gitignore

稍稍时候,你必须把一些文件放到Git工作目录中,但又无法交到它们,比如保留了数据库密码的安插文件啦,等等,每一遍git status都会议及展览示Untracked files ...,有精神分裂症的童鞋心里一定不爽。

万幸Git考虑到了我们的感触,那一个标题消除起来也非常粗大略,在Git工作区的根目录下开创一个分裂平日的.gitignore文件,然后把要不经意的文书名填进去,Git就会活动忽略那些文件。

不要求初步写.gitignore文本,GitHub已经为我们准备了种种配置文件,只供给组合一下就能够应用了。全部配置文件能够一直在线浏览:https://github.com/github/gitignore

不经意文件的条件是:

  1. 马虎操作系统自动生成的文本,比如缩略图等;
  2. 不经意编写翻译生成的中级文件、可执行文件等,相当于只要二个文件是因而另一个文件自动生成的,那自动生成的文件就没供给放进版本库,比如Java编写翻译发生的.class文件;
  3. 马虎你协调的隐含敏感消息的配置文件,比如存放口令的配置文件。

举个例证:

假设你在Windows下开始展览Python开发,Windows会自动在有图表的目录下转移隐藏的缩略图像和文字件,如果有自定义目录,目录下就会有Desktop.ini文本,因而你要求忽略Windows自动生成的垃圾文件:

1
2
3
4
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini

下一场,继续忽略Python编写翻译发生的.pyc.pyodist等公事或目录:

1
2
3
4
5
6
7
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build

累加你协调定义的文本,最后收获叁个完好无损的.gitignore文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Windows:
Thumbs.db
ehthumbs.db
Desktop.ini
 
# Python:
*.py[cod]
*.so
*.egg
*.egg-info
dist
build
 
# My configurations:
db.ini
deploy_key_rsa

说到底一步就是把.gitignore也提交到Git,就完了了!当然检验.gitignore的专业是git status命令是否说working directory clean

动用Windows的童鞋注意了,借使您在财富管理器里新建一个.gitignore文件,它会尤其弱智地提醒您无法不输入文件名,不过在文件编辑器里“保存”或许“另存为”就能够把公文物保护留为.gitignore了。

稍加时候,你想添加3个文件到Git,但发现加上不了,原因是其一文件被.gitignore忽略了:

1
2
3
4
$ git add App.class
The following paths are ignored by one of your .gitignore files:
App.class
Use -f if you really want to add them.

比方您实在想添加该文件,能够用-f强制添加到Git:

1
$ git add -f App.class

或许你意识,大概是.gitignore写得很是,必要找出来到底哪些规则写错了,能够用git check-ignore指令检查:

1
2
$ git check-ignore -v App.class
.gitignore:3:*.class    App.class  

Git会告诉大家,.gitignore的第2行规则忽略了该公文,于是咱们就能够知晓应该修订哪个规则。

小结

  • 大意有个别文件时,必要编写制定.gitignore

  • .gitignore文件本身要放权版本Curry,并且能够对.gitignore做版本管理!

  

  

  

上述小说多量参阅或转发自: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
 

自笔者出门日常不欣赏买东西,越发不爱带手信,主要怕麻烦。但是大多数人外出总喜欢顺便带点东西回家或给心上人。

9.2 解决争辨

人生比不上意之事十之八九,合并分支往往也不是胜利的。

预备新的feature1分层,继续大家的新支行开发:

1
2
$ git checkout -b feature1
Switched to a new branch 'feature1'

修改readme.txt最后一行,改为:

1
added this line from branch feature 1

feature1分段上交给:

$ git add readme.txt 
$ git commit -m "add feature"
[feature1 75a857c] AND simple
 1 file changed, 1 insertion(+), 1 deletion(-)

切换到master分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.

Git还会自动唤醒大家脚下master分段比远程的master支行要超前1个提交。

master分层上把readme.txt文件的终极一行改为:

1
added this line from master

提交:

$ git add readme.txt 
$ git commit -m "master update"
[master 400b400] & simple
 1 file changed, 1 insertion(+), 1 deletion(-)

现在,master分支和feature1分层各自都分别有新的付出,变成了这么:

军事 11

那种情景下,Git不可能执行“火速合并”,只好试图把各自的改动合并起来,但那种统一就恐怕会有争持,大家尝试看:

1
2
3
4
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

果然顶牛了!Git告诉大家,readme.txt文件存在顶牛,必须手动化解争持后再交付。git status也能够告知大家争持的文本:

1
2
3
4
5
6
7
8
9
10
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Unmerged paths:
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       both modified:      readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

大家能够直接查看readme.txt的内容:

1
2
3
4
5
6
7
#git study repo
Creating a new branch is quick.
<<<<<<< HEAD
added this line from master
=======
added this line from branch feature 1
>>>>>>> feature1

Git用<<<<<<<=======>>>>>>>标记出不一致分支的内容,大家修改如下后保存:

1
2
3
4
#git study repo
Creating a new branch is quick.
added this line from master
added this line from branch feature 1

再提交

1
2
3
$ git add readme.txt
$ git commit -m "conflict fixed"
[master 59bc1cb] conflict fixed

现在,master分支和feature1分层变成了下图所示:

军事 12

用带参数的git log也能够见见分支的见面情形:

1
2
3
4
5
6
7
8
$ git log --graph --pretty=oneline
*   feedd786cad3e18323a41846fcc1b0d52fc0c98e fix conflict
|\ 
| * 01f8f8d168e113fac9fbe24c4cfa6d4c351a9821 update from branch
* | 743ccee30f3d74f1993f17e7312032b7399b1306 from master
|/ 
* edfbc29982927236596539e0f1971b0575f803c0 branch test
* 8675486bfeeb340914369e80d2cfcf3e854e88a3 add home page

  

我们五个人,点了四份,7块钱一份,有蛋有肉,肠粉韧滑口感好,味道还真的不错。

9.1 成立与统一分支 

在上学版本回退部分时,你已经驾驭,每一次提交,Git都把它们串成一条时间线,那条时间线正是三个分支。停止到当下,只有一条时间线,在Git里,这些分支叫主分支,即master分支。HEAD严酷来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD本着的就是当前支行。

一起初的时候,master分段是一条线,Git用master本着最新的交给,再用HEAD指向master,就能明确当前支行,以及当前支行的提交点:

军事 13

 

历次提交,master支行都会上前移动一步,那样,随着你不休提交,master分段的线也尤为长, 当大家创制新的分段,例如dev时,Git新建了叁个指针叫dev,指向master一样的交给,再把HEAD指向dev,就表示方今支行在dev上: 

军事 14

要是大家在dev上的工作完结了,就能够把dev合并到master上。Git怎么统一呢?最简单易行的法子,正是一向把master指向dev的此时此刻付出,就完事了合并:

军事 15

据此Git合并分支也火速!就修改指针,工作区内容也不变!

联合完分支后,甚至能够去除dev分支。删除dev分段正是把dev指南针给删掉,删掉后,大家就剩下了一条master分支:

军事 16

当成太神奇了,你看得出来有个别提交是由此分层实现的啊?

 

上边开头实战

第二,大家创造dev支行,然后切换成dev分支:

1
2
$ git checkout -b dev
Switched to a new branch 'dev'

git checkout一声令下加上-b参数表示创立并切换,也等于以下两条命令:

1
2
3
$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前支行:

1
2
3
$ git branch
* dev
  master

git branch一声令下会列出具有支行,当前支行前边会标贰个*号。

然后,大家就足以在dev分段上健康提交,比如对readme.txt做个修改,加上一行:

1
Creating a new branch is quick.

接下来提交:

1
2
3
4
$ git add readme.txt
$ git commit -m "branch test"
[dev fec145a] branch test
 file changed, 1 insertion(+)

现在,dev支行的工作实现,大家就足以切换回master分支:

1
2
$ git checkout master
Switched to branch 'master'

切换回master支行后,再查看2个readme.txt文件,刚才添加的剧情不见了!因为13分提交是在dev分支上,而master支行此刻的提交点并不曾变:

军事 17

现在,我们把dev分层的办事战果合并到master分支上:

1
2
3
4
5
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
 readme.txt |    1 +
 file changed, 1 insertion(+)

git merge一声令下用于合并钦命分支到当前支行。合并后,再查看readme.txt的剧情,就足以阅览,和dev支行的流行提交是全然一样的。

只顾到上边的Fast-forward音讯,Git告诉我们,此次合并是“快进格局”,也正是平素把master指向dev的此时此刻付出,所以集合速度非常的慢。

当然,也不是每一趟合并都能Fast-forward,大家后边会讲别的艺术的联结。

合并达成后,就足以放心地删除dev分支了:

1
2
$ git branch -d dev
Deleted branch dev (was fec145a).

删除后,查看branch,就只剩余master分支了:

1
2
$ git branch
* master

因为创制、合并和删除分支非常的慢,所以Git鼓励你利用分支实现有些职分,合并后再删掉分支,那和直接在master分段上行事功能是均等的,但经过更安全。

 

第一天,为了幸免浪费钱,哒精明地在深夜就翻开周边的酒店价格。于是自身给她报了小编平昔想去尝试住住的商旅式公寓。

7. 删减操作

在Git中,删除也是3个修改操作,大家实战一下,先添加贰个新文件test.txt到Git并且付诸:  

1
2
3
4
5
$ git add .
$ git commit -m "add test.txt"
[master a8fa95a] add test.txt
 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 test.txt

诚如情形下,你数见不鲜直接在文件管理器中把没用的文件删了,可能用rm命令删了

1
rm test.txt

那一个时候,Git知道你剔除了文本,由此,工作区和版本库就分裂等了,git status命令会即刻告知你如何文件被删除了:

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
 
    deleted:    test.txt
 
no changes added to commit (use "git add" and/or "git commit -a")

后天您有三个挑选,一是当真要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

1
2
3
4
5
6
7
x$ git rm test.txt
rm 'test.txt'
 
$ git commit -m "remove test"
[master 03df00a] remove test
 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 test.txt

近年来,文件就从版本库中被删去了。

另一种情况是删错了,因为版本Curry还有啊,所以能够很自在地把误删的文件苏醒到新型版本:

1
$ git checkout -- test.txt

git checkout事实上是用版本Curry的本子替换工作区的版本,无论工作区是修改依然去除,都足以“一键还原”。  

 

  

  

大星山炮台建于清清圣祖五十七年。鸦片战争前夕,帝国主义列强不断派兵侵袭中国,为对抗外来入侵,清清圣祖五十六年(1718年),广西、莱茵河地点军务兼理粮饷兵部右御史兼都察院右副都等捐银在此修建炮台,筑成军事要塞。

8.1 创设远程仓库 

以后的景色是,你曾经在该地创立了八个Git仓库后,又想在GitHub成立三个Git仓库,并且让那八个仓库实行长距离同步,那样,GitHub上的仓库既能够看做备份,又足以让别的人通过该仓库来合营,真是一举多得。

率先,登陆GitHub,然后,在右上角找到“New
repository”按钮,创立3个新的库房:

军事 18

 军事 19

 

 

始建好的仓库

军事 20

 

当下,在GitHub上的那一个oldboy_website仓库依然空的,GitHub告诉大家,能够从那么些库房克隆出新的库房,也得以把一个已有个别地点仓库与之提到,然后,把当地仓库的始末推送到GitHub仓库。

后天,咱们依据GitHub的晋升,在地面已部分git_trainning仓库下运作命令:

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ git remote add origin git@github.com:triaquae/oldboy_website.git #添加远程仓库
$ git push -u origin master #推到远程
 
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes   #第一次推会出现,写yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
Counting objects: 20, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (14/14), done.
Writing objects: 100% (20/20), 1.76 KiB | 0 bytes/sdone.
Total 20 (delta 4), reused 0 (delta 0)
remote: Resolving deltas: 100% (4/4), done.
To git@github.com:triaquae/oldboy_website.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

请千万注意,把地方的triaquae替换成你自个儿的GitHub账户名,不然,你在地面关联的就是本身的远程库,关联平常,不过你今后推送是推不上来的,因为你的SSH
Key公钥不在作者的账户列表中。

添加后,远程库的名字就是origin,那是Git暗中认可的叫法,也得以改成其他,不过origin本条名字一看就知道是远程库。

把当地库的始末推送到长途,用git push指令,实际上是把当下支行master推送到长途。  

 

这会儿刷新远程仓库页面, 就观察了您刚从本土推上来的代码了

军事 21

从今后起,只要本地作了交给,就能够通过命令:

1
$ git push origin master

what ? 不信?那帮您试一下吧

创设1个index.html文件,同时上传到长途

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ vim index.html
$ git add .
$ git commit -m "add home page"
 
[master 8675486] add home page
 file changed, 6 insertions(+)
 create mode 100644 index.html
 
$ git push origin master #推到远程
 
Counting objects: 3, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 362 bytes | 0 bytes/sdone.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:triaquae/oldboy_website.git
   03df00a..8675486  master -> master

然后刷新下远程仓库页面,就观察你的新创设的文件了

军事 22

 

哒是为着钓鱼才选中了那个点。我和幼子将野餐垫铺在宽敞的礁岩上,听海浪的动静,看海浪拍打岸礁激起的浪花,或坐或躺,看看书,磕嗑瓜子,聊聊天就到了上午。

1.github介绍

成都百货上千人都知道,Linus在1993年创制了开源的Linux,从此,Linux系统不断进化,已经变成最大的服务器系统软件了。

Linus即使成立了Linux,但Linux的恢宏是靠举世热心的志愿者参加的,这么四人在世界各州为Linux编写代码,这Linux的代码是怎么着保管的吗?

谜底是,在二零零三年在此之前,世界内地的志愿者把源代码文件通过diff的措施发给Linus,然后由Linus自己通过手工业方式合并代码!

您大概会想,为啥Linus不把Linux代码放到版本控制系统里吗?不是有CVS、SVN那些免费的版本控制系统啊?因为Linus坚定地反对CVS和SVN,这几个集中式的版本控制系统不但速度慢,而且必须联网才能利用。有一对商用的版本控制系统,即使比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。

可是,到了二〇〇〇年,Linux系统已经进步了十年了,代码库之大让Linus很难继续通过手工业格局管理了,社区的小兄弟们也对那种艺术表达了强烈不满,于是Linus选拔了三个商贸的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这么些版本控制系统。

安居乐业的大好局面在二零零七年就被打破了,原因是Linux社区牛人聚集,不免沾染了有的梁山民族铁汉的人间习惯。开发萨姆ba的Andrew试图破解BitKeeper的情商(这么干的实际上也不只她三个),被BitMover公司发现了(监察和控制工作做得正确!),于是BitMover公司怒了,要收回Linux社区的免费使用权。

Linus能够向BitMover集团道个歉,保险以往严谨管教弟兄们,嗯,那是不也许的。实际境况是这么的:

Linus花了两周时间自个儿用C写了二个分布式版本控制系统,那就是Git!二个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的吗?大家能够回味一下。

Git神速成为最流行的分布式版本控制系统,尤其是2010年,GitHub网站上线了(github是二个依照git的代码托管平台,付开支户能够建私人仓库,大家一般的免耗费户只可以选取集体仓库,也正是代码要当着。),它为开源项目免费提供Git存款和储蓄,无数开源项目开始搬迁至GitHub,蕴涵jQuery,PHP,Ruby等等。

野史就是这么偶然,即使不是这时BitMover公司勒迫Linux社区,也许今后大家就没有免费而拔尖好用的Git了。

 

今天,GitHub已是:

  • 三个颇具143万开发者的社区。当中不乏Linux发明者Torvalds那样的头等黑客,以及Rails开创者DHH如此的年轻极客。
  • 其一星球上最流行的开源托管服务。方今已托管431万git项目,不仅进一步多著名开源项目迁入GitHub,比如Ruby
    on
    Rails、jQuery、Ruby、Erlang/OTP;近三年流行的开源库往往在GitHub头阵,例如:BootStrapNode.jsCoffeScript等。
  • alexa满世界排名414的网站。

 

在美团上看,周边的商旅式公寓环境优雅,价格便宜,基本在130元左右就能够化解富华双床房,300多元则可以住两房一厅的套房了。关键是,这个在小区里的旅店都靠海边很近,步行到沙滩也很方便。

  1. github介绍
  2. 安装
  3. 库房创造& 提交代码
  4. 代码回滚
  5. 工作区和暂存区
  6. 撤销修改
  7. 去除操作
  8. 远程仓库
  9. 分段管理
  10. 四个人搭档
  11. github使用
  12. 忽视特殊文件.gitignore

双月湾全貌,网络图片

游:那里至少有7个景色供您选拔

据称中中原人民共和国沿海唯有那里终年能观察雌海龟上岸产卵,在历史上也向来是乌龟下蛋的场面,所以当地人称“乌龟湾”。

哒喜欢开到哪住到哪,关键要彻底卫生又利于。笔者则喜欢上美团、去哪儿、携程等网站搜索,看价格和评价,选取自身最喜爱的条件。

本人最终并未用责备的口吻摆明那几个谜底,却让她接受了本身的视角。那里应该给自个儿2个赞是或不是?

那二遍出外,小编学会了守候,也学会了隐忍。不论安插什么改变,规划好温馨的岁月,抚慰好易躁的心灵,一亲戚各得其乐,走到哪都是新鲜愉悦的心得。

住:种种商旅公寓民宿任挑任选

此刻,他静钓在海边。笔者一面码字,一边陪娃扔石头打水漂,不亦博客园。

有人说双月湾相对是个让学子墨客和拍照咳嗽友流连忘返的地点。这一点作者相当的赞成!

二〇一六年三月二三十日,横跨大亚湾和阿蒙森湾湾的海湾大桥正式通车,全长2714米,跨越船澳和巽寮两地之间的范和湾,是哈尔滨首席跨海南大学桥。

那七个海湾即使紧密相靠,性子却区别等,左边的大亚湾畔的半月湾,和风细浪,阿娜多姿。左边的台湾海峡湾畔的半月湾,波涛汹涌,气势磅礴。那性子,像极了作者和哒。

首先个是海龟湾。惠东港口海龟国家级自然爱慕区面积共有1400公顷,是亚洲陆上唯一的水龟自然保养区。作者明天就很想去看看爱抚区,但哒和幼子都不是很有来头,所以最后没去成。

对此短假小憩的大家的话,让激情欢腾,让心灵放松是最根本的,玩不完的,吃不够的,顶多下次再来咯。

宽大舒适的亲子房

其多个是现已有名全国的“小星山应战壮士岛”。那里有个为思量上世纪六十时期初在小星山打仗中全歼美蒋敌方特务的惠东口岸民兵连豪杰烈士而修筑的记念碑。

本人还没体验过看日出的感觉到,想象着寒冷的清早,裹着雄厚大衣,偎依在情人的怀抱,静坐在静静的的礁岩上,看海平线上害羞的朝日一跃而起。心脏律动的韵律与宇宙一起,天人合一,生命的记得在那一刻成为一定,多么美好!

还乡开到半路时,哒发现一处好钓点,于是拿着鱼杆提着箱下车,作者提着地毯牵着娃跟随,走到哪玩到哪。

经验丰盛的小捕鱼人

那会儿,小编正在阳台的吊床上可心地敲着这篇文字,外孙子偎依在身旁,安静地听着典故,他的爹爹还在酣睡。

收工,回家。

哒说下次来玩要带上爸妈和叔大爷母,一家里人租一套豪华住房式的旅舍。白天先生们出海打渔,女生们带着娃到沙滩游玩,能够在科普买点食材,自个儿在家里做饭,也是很漂亮好的感受。

作者领会了一下,双月湾有一种特产叫狗爪螺,又名九爪螺(英文名Goose
Baracle)属杨帆洋贝类,因其长相怪异形状酷似狗的爪子而得名。

全体区域由大亚湾和哈得孙湾湾相邻的七个半月形组成,登上海高校星山的观景台能够望见整个度假区的全貌。从高处俯瞰,就像两轮新月,所以称为双月湾。

单个的狗爪螺比不上大拇指粗多少,长约两三寸,有”来自鬼世界的海鲜”之称。那一个称谓来源于西方,第①次被人发觉时,因外表像妖怪的手,被人熟练。

对于外孙子的话,没吃过的都是特殊美味有意思的。娘两在凉台享受了早饭后,聊天写字听典故,等父亲醒后去吃午餐。

值得推荐介绍的小店

150元半钟头的沙滩驰骋

要是选取搭高铁或火车,就得弄清楚徐州的三个火车站,惠城站(西站)、惠东站、惠南站、南通站(北站)。至于怎样方便,就看大家的路途布置做选择了。

娱:必须带着相机来收割美景

出于第③天点的剩太多,接下去的几餐我们都相比较低迷。日常一份海鲜主菜,2个青菜,再加1个海鲜汤,100元多一点就消除。

据此第贰天的早餐,我们溜达了许久才选择了一家名叫七妹肠粉的早餐店。这家店偏僻简陋,人气却十分旺。

那对于出门不希罕做攻略,又想方便又想省钱的大家的话,确实是个争执。有宏图的驴友当然依然越早订越好的。

购:那里有一种特产叫狗爪螺

双床房美团种种减价后报价178元,哒进客厅询价为198元,当然要在网上买,最终用了闪付再省5元,173元化解。

路边的窑鸡摊

以此爱戴区主要为了保障国际濒临灭绝的危险、国家二级维护动物乌龟,及其产卵繁殖栖息地。1989年经青海省人民政坛批准创设,1993年荣升为国家级。

古桥通车后,马尼拉、柏林(Berlin)、温尼伯、香港(Hong Kong)及中山市区等地前去滨海出行度假胜地惠东巽寮湾的光阴裁减约半时辰,前来游玩的人也就越多了。

那边有欧式建筑主体西班牙王国(The Kingdom of Spain)格调小镇,随意即可拍出异域风情的相片。很多婚纱油画集团都将那里设为天然的雕塑集散地。

其1一日根据哒的安排是睡饱觉优先。于是经验丰富的自笔者提前买好了香飘飘奶茶和面包做早饭。

美味的七妹肠粉

在十二分不盛名的弄堂里,排队吃肠粉的小小车足有七八辆,吃早餐的桌子从店里摆到店外。小小的木桌,小小的胶凳,坐满了人。

食:沿途食品摊肆众多丰俭由君

冬日,冬辰的狗爪螺最肥,单个的狗爪螺不及大拇指粗居多,长约两三寸,正因为狗爪螺太好吃,过去人们只管采撷,不注意爱护,岛上的的狗爪螺已越来越少。

夕阳照耀下的人力船

外边来的游人,可以设想租车,因为此地打车不太有利,要是都靠步行,会浪费广大时光。

受保证的大乌龟,互联网图片

那年的蒲节,作者哒第①回带自个儿来巽寮湾玩,理由正是当今身故有利了,比过去快很多。

价廉物美的商旅

先是天夜晚我们住在指标地·曦岸旅馆,位于东月湾畔和通往平山的213主干路边。

欣赏情人能够到市集去逛逛,在濒海市镇购进的鱼儿或鱼干平时都相比较实际。

细心的地面驴友将双月湾细分成几个景色:双月湾西半湾、亚得里亚海湾东半湾、小星山浮潜、大澳沙滩、平海古村、乌龟湾、情人岛、大星山观景台。

这家目标地饭店外观察起来绝相比较较高大上,深红霓虹灯招牌很惹外甥喜欢,店名很文化艺术,也很招本人喜欢。

这几天我们差不多都在一家叫捕鱼人海鲜饭店的客栈就餐。这家茶馆总是越发的旺,按哒的评论,这家店是低廉的。

出门吃东西,有时真的靠运气,就算都说便宜没好货,可是贵的也不必然正是对的。常常状态下,很多贵的店,反而做得很倒霉吃。

在微信晒第二张旅行照片时,小编发觉大家到的地点叫双月湾。那里属于江门市潮安区港湾滨海旅游度假区管理委员会会(原港雅溪镇)。

为了维护珍稀贝类,有些地点已明确命令禁止采撷狗爪螺。所以也不太简单吃到了,反正小编是连看都没来看那种螺。

炮台用麻石砌筑,周长295米,平平均高度3.5米,宽2.55米,位于港南明山街道最南面包车型大巴大星吉林北面,是平海诸炮布里斯托保留得格外完好的炮台。大星山炮台现为龙川县文物珍视单位,因为有炮台的留存又被当地人称作“炮台山”。

行:跨海南大学桥减弱了都会的离开

男唱女随

小编只见过夕阳西下的美貌

白芷/文图

其余,电影《黄海长城》、《湖北五虎之铁拳无敌孙那格浦尔》,电视机片《“大京九”从此处通过》都在此处摄取了重重镜头。还有由蔡卓妍(Charlene Choi)、谢霆锋(英文名:xiè tíng fēng)、范冰冰(英文名:Fan Bingbing)、张致恒主角的东方之珠电影《情癫大圣》。由王传君先生、邓阳光主角的影视《夏天表示情爱》(又名《两情双月》)都在此地取景拍片。

一阵筛选后,我定下了双月湾一克拉酒馆式公寓的日出湾亲子房,美团折完126元。环境当然是如意的,装修精致,感觉很新,宽敞舒适,还有厨房可以做饭,有平台能够看海,很像家。

比起那天2头窑鸡、一盘青菜,1个蚝仔烙就210多元的午饭来说,实在太赞了。而结尾一餐大家在中途任选一家吃,感觉也很不好。

对了,假如喜欢吃鸡,在路边买只现做的窑鸡是毋庸置疑的选项。我们回家的路上就买了二只,75元,比到店里花138元吃的可口太多了。

二零一八年三元休假,哒(小编汉子)说带笔者去巽寮湾玩。遵照我们的习惯,平常不会去看好景点,也不会去人多的地点,说去巽寮湾,平常只是到常见的海域。活动项目仍然是她钓鱼,娃玩沙,小编陪着拍录、看书。

曦岸旅社的环境还是对的起价格的,那天夜里孙子睡得早,作者也跟着睡着了。从10点左右睡到了第贰天的8点半,将近拾个钟头的上流睡眠,为一年来累积的乏力和相当慢意,画上了周详的符号。

自家只拍到一张远眺的桥梁

尽管哒已很中意,但我依旧约略迫不如待想要呶呶不休地批评。因为假设早晨一到就订房,大家得以在130元左右就订到周边环境很好的特价房,可哒却以为如若先订房,万一玩的地点太远,会很劳顿。

里面蒙受了一对朋友,坐在高高的岩石上,他们说第叁天晚上要来看日出。可惜恋爱时自身没令人家陪本身做那件事,今后再提只好被批无聊。

发表评论

电子邮件地址不会被公开。 必填项已用*标注