Git学习笔记(2)

三、远程仓库

1.添加远程库

Step1:登陆GitHub,创建一个new repository(新仓库),填写仓库名称learngit,其他保持默认设置;
Step2:GitHub提示,可以从该仓库clone出新仓库,也可以关联已有的本地仓库,将本地内容push到GitHub仓库。现在,选择后者,根据网页提示在终端输入

$ git remote add origin https://github.com/ZhouXiaorui1993/learngit.git

来添加远程库。这里使用的是https协议,也可以用ssh协议,将上述地址改为:

$ git remote add origin git@github.com:ZhouXiaorui1993/learngit.git

ZhouXiaorui1993为GitHub账户名origin为远程库的名字,是Git的默认叫法,但一般无需修改,learngitrepository的名字。
使用ssh协议可能会得到一个警告,此时需要将github公钥添加到信任列表,若仍出现问题则需要手动配置ssh秘钥,方法如下。(相比之下,ssh速度更快,且无需每次push都输入账户名和密码,推荐使用)

ssh秘钥配置

1)设置本地git的username和email(前面已经设置过)

$ git config --global user.name “ZhouXR”
$ git config --global user.email “8437×××××@qq.com”

2)生成秘钥

$ ssh-keygen -t rsa -C “8437×××××@qq.com”

连续三个回车,得到两个文件:id_rsaid_rsa.pub

3)添加秘钥到ssh-agent

$ eval “$(ssh-agent -s)”

得到agent pid为xxxx,再输入以下指令

$ ssh -add ~/.ssh/id_rsa

4)在Github中添加ssh key

登陆Github,选择settingsSSH and GPG keysadd ssh key,将~/.ssh/id_rsa.pub中的内容复制到框中,再点击add即可。

Step3:将本地所有内容推送至远程库。终端输入git push -u origin master,这里的git push命令实际上是将当前分支master推送到远程。注:由于此时远程库是空的,第一次推送时加上了-u参数,Git不但会将本地分支内容推送至远程,还会将本地master和远程master关联起来,在以后的推送或拉取中就可以简化命令。
此后,只要本地做了commit,就可以通过命令git push <仓库名> <分支名>来将本地分支的最新修改推送至GitHub。
注意:并不是一定要将本地所有分支都推送至远程,在项目开发过程中,其中master为主分支,故要时刻与远程同步;对于团队成员都需要在上面工作的开发分支,也需要与远程同步;而诸如bug修复一类的分支,只在本地使用,就无需推送到远程了。

2.从远程库克隆(clone)

假设没有本地库,先创建一个远程库,然后从远程库克隆。
Step1:登陆GitHub,创建一个新仓库,命名为gitskills,勾选initialize this repository with a README,这样GitHub会自动创建一个README.md文件。

Step2:现在远程库已经准备完成,用命令

$ git clone [-o <name>] https://github.com/ZhouXiaorui1993/gitskills.git

克隆一个本地库,这里选项-o可以将克隆下来的库在本地重命名为指定name,若不加则默认为origin。此时cdgitskills文件夹,就可以在本地看到README.md文件了。
若有多人协作开发,则每人从远程克隆一份就可以了。

3.远程库的信息

1)命令git remote [-v]:不带参数时,列出所有远程库名,带有参数-v时,可以查看远程主机的网址。
2)命令git remote show <远程库名>:可以查看该远程库的详细信息。
3)命令git remote add <远程库名> <网址>:添加远程库。
命令 git remote rm <远程库名>:删除远程库。

3.利用远程库多人协作工作

Step1:从远程库clone文件到本地,默认情况下只能看到本地的master分支。如果要在其中的dev分支上进行开发,则用命令git checkout -b dev origin/dev 来创建本地的dev分支;
Step2:修改完成后,试图使用命令git push origin <branch name>来推送自己的修改至远程;
Step3:如果推送失败,则是由于远程分支比自己的本地更新,需要先用命令
git pull origin <远程分支名>:<本地分支名>取回远程该分支的更新,并与本地的指定分支合并。
若是远程分支与当前分支合并,则可省略冒号后的部分。
Step4:如果合并有冲突,则手动解决冲突,并在本地提交;
Step5:若没有冲突或冲突解决以后,再用git push origin <branch name>推送自己的修改至远程。

:若git pull命令提示“no tracking information”,则说明本地分支和远程分支之间的链接关系未创建,此时可用命令git branch –set-upstream <本地分支名> origin/<远程分支名>来建立二者的关联。

补充
1)命令git fetch <远程库名> [分支名]:将远程的某个分支的更新取回本地,若不加分支名,则将远程所有分支的更新取回本地。所取回的更新,在本地要用远程库名/分支名的形式读取。
2)取回远程更新后,可在其基础上,使用git checkout -b <newbranch> <远程库名>/<分支名>创建一个新的分支。此外,也可使用git merge <远程库名>/<分支名>在本地分支上合并远程分支。
可以看出,git pull命令相当于git fetchgit merge两个命令的结合使用。


四、分支管理

1.创建与合并分支

Step1:创建新的分支(branch),命名为dev,然后切换到dev分支,命令如下

$ git branch dev
$ git checkout dev

也可以用命令git checkout -b dev来代替上述两条命令,其中参数-b表示创建并切换。

master为主分支,HEAD指向当前分支,master指向提交,新建的分支指向master相同的提交。
Step2:可以用命令git branch来查看所有分支,当前分支前会有*标志。
补充:git branch命令可带选项,其中-r选项可用来查看远程分支;-a选项查看所有分支。

Step3:在当前分支上正常add和提交文件。
命令 git checkout master 可切换回maser分支,此时在master分支上无法看到dev分支上提交到的修改内容。
Step4:将dev分支的工作成果合并到master分支上,先切换到master分支,再使用命令git merge dev。注:git merge命令是用于将指定分支合并到当前分支。
Step5:合并完成后,如果不在需要dev分支,则可用命令git branch -d dev来删除dev分支。
注1:若某分支未进行合并但想要将其舍弃,可以采用命令git branch -D dev来强行删除。
命令git push origin :dev可用来删除远程库中的dev分支。

注2:命令git reflog –date=local | grep <branchname>:查看对某一分支的操作记录,从而找出该分支的创建来源。

2.解决冲突

若同一文件在不同分支都进行了修改并提交,则合并时可能会出现冲突(git会有提示),此时需要手动修改文件以消除冲突,提交后再进行合并即可(可cat查看文件内容以发现冲突所在位置)。
命令git log –graph可以看到分支合并图。

3.分支管理策略

一般情况下,git默认合并分支为Fast Forward模式,此模式下,若删除原分支,则会丢失其信息。若想保留该历史信息,则可强制禁止该模式,这样合并时Git会生成一个新的commit
命令git merge --no-ff -m “新的commit描述” branch_name可以禁止Fast Forward模式

4.bug分支

当出现bug的时候,我们会通过创建新的bug分支去进行修复,修复完成后提交合并,最后删除bug分支。若此时手头工作未完成,可通过git stash命令来将工作现场“储藏”,然后去修复bug,修复后再利用git stash pop,回到工作现场。命令git stash list可用来查看储藏列表。

git stash命令的实验
1)现有主分支master,从主分支分出的子分支dev。现在在子分支dev上修改了文件test,由于还没完成,所以不能进行提交。
2)假定此时master分支上的problem文件出现bug,则切换到master分支进行修复。切换过来以后,安全考虑,先用cat指令查看了一下test文件,发现刚才在子分支上的修改被带过来了。
3)为避免接下来修复后提交时将该修改也一起提交,故切换回dev。利用git stash指令将这里的工作隐藏。
4)再切换回master分支,再次用cat指令查看test文件,发现该文件不见了。证明隐藏生效,可以修复bug了。首先从master创建临时分支——issue-001,切换到这个分支上打开problem文件,对其进行修改后提交,再切换回master分支,将临时分支合并到主分支,bug解决,删除issue-001分支。
5)为继续进行dev中未完成的工作,切换回dev分支,执行命令git stash pop,找回原文件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容