三、远程仓库
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的默认叫法,但一般无需修改,learngit
为repository
的名字。
使用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_rsa
和id_rsa.pub
3)添加秘钥到ssh-agent
$ eval “$(ssh-agent -s)”
得到agent pid
为xxxx,再输入以下指令
$ ssh -add ~/.ssh/id_rsa
4)在Github中添加ssh key
登陆Github,选择settings
→ SSH and GPG keys
→ add 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
。此时cd
到gitskills
文件夹,就可以在本地看到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 fetch
和git 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
,找回原文件。