2

Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?

好在这个世界上有个叫GitHub的神奇的网站,从名字就可以看出,这个网站就是提供Git仓库托管服务的,所以,只要注册一个GitHub账号,就可以免费获得Git远程仓库。

由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,目的(为了确保数据传输的可靠性,因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的),如果你不配置相关命令,则每次本地仓库和远程仓库提交时,都需要验证密码,为了方便,所以,需要一点设置:

git设置免密码登录,生成ssh秘钥命令

创建SSH Key

ssh-keygen -t rsa -C “<email>”

步骤1:命令输入完成后,一直回车。会在本地生成一个.ssh文件,打开该文件会看到默认保存位置当前 ~/.ssh/id_rsa(私密) 和id_rsa.pub(公密),将生成的公密用记事本打开,并复制。

步骤2:把id_rsa.pub里的复制内容添加到github的ssh keys里,一定不能有空格在密钥里面。
如下图:

图片描述

“Add Key”,你就应该看到已经添加的Key:

图片描述

点“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容

测试连通性

在git Bash 中输入以下代码

$ ssh -T git@github.com

当你输入以上代码时,会有一段警告代码,如:

The authenticity of host 'github.com (192.30.255.112)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?

这是正常的,你输入 yes 回车既可。如果你创建 SSH key 的时候设置了密码,接下来就会提示你输入密码,如:

Enter passphrase for key '/home/jeremy/.ssh/id_rsa':

当然如果你密码输错了,会再要求你输入,直到对了为止。

密码正确后你会看到下面这段话,如:

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

如果用户名是正确的,你已经成功设置SSH密钥。如果你看到 “access denied” ,则表示拒绝访问,那么你就需要使用 https 去访问,而不是 SSH 。

可以参考网站:

git使用以及免密码登陆

解决每次push代码到github都需要输入用户名和密码的方法

git-ssh 配置和使用

注意事项:在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去,造成信息泄露。如果你不想让别人看到Git库,有两个办法,一是:让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。

 添加远程仓库(git remote)

现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。

首先,登陆GitHub,然后,在右上角找到“New repository”按钮,创建一个新的仓库:

在Repository name填入studygit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:

根据GitHub的提示,在本地的studygit仓库下运行命令

(1)将远程项目和本地项目进行关联

$ git remote add origin + 分支地址 //origin是远程库的名字,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库

(2).第一次推送master分支的所有内容到远程仓库

$ git push -u origin master   //第一次提交需要这么做,第二次提交就可以直接用`git push origin master`或者 `git push `

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

推送成功后,可以立刻在GitHub页面中看到远程库的内容已经和本地一模一样

从远程库克隆(git clone)

使用 git clone 拷贝一个 Git 仓库到本地,让自己能够查看该项目,或者进行修改。

如果你需要与他人合作一个项目,或者想要复制一个项目,看看代码,你就可以克隆那个项目。 执行命令:

 git clone [url]   //[url] 为你想要复制的项目
 

克隆完成后,在当前目录下会生成一个新 目录,即会远程的目录名称。
*注意事项*:
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。另外,Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

Git 分支管理

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。

有人把 Git 的分支模型称为必杀技特性,而正是因为它,将 Git 从版本控制系统家族里区分出来。

创建分支命令:

git branch 分支名称

切换分支命令:

git checkout (branchname)

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

创建并切换分支

git checkout命令加上-b参数表示创建并切换

git checkout -b + 分支名称
相当于以下两条命令
git branch 分支名称
git checkout (branchname)

列出分支基本命令:

git branch

没有参数时,git branch 会列出你在本地的分支,默认是master。

$ git branch
* master //意思是:有一个叫做 master 的分支,并且该分支是当前分支

如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令:

如果我们要手动创建一个分支。执行 git branch (branchname) 即可。

$ git branch A  //A为分支名称
$ git branch
* master
  A

现在我们可以看到,有了一个新分支 A。

当你以此方式在上次提交更新之后创建了新分支,如果后来又有更新提交, 然后又切换到了 testing 分支,Git 将还原你的工作目录到你创建分支时候的样子。

使用分支将工作切分开来,从而让我们能够在不同开发环境中做事,并来回切换。

删除分支:

git breach -d 分支名称

例如我们要删除A分支:

$ git branch
* master
A
$ git branch -d A
Deleted branch A (was 85fc7e7).
$ git branch
* master

分支合并:

一旦某分支有了独立内容,你终究会希望将它合并回到你的主分支。 你可以使用以下命令将任何分支合并到当前分支中去:

git merge

切换回master分支后,把A分支的工作成果合并到master分支上:

$ git merge A

合并完后就可以删除分支:

$ git branch -d  A 

如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。

Git鼓励大量使用分支:



查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

创建+切换分支:git checkout -b <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>
强制删除分支:git branch -D <name>

解决分支合并的冲突:

如果master分支和A分支各自都分别有新的提交,这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容
再提交:

$ git add gitnote.txt 
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed

注意
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

用git log --graph命令可以看到分支合并图。

多人协作:

当你从远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且,远程仓库的默认名称是origin。

要查看远程库的信息,用git remote

$ git remote
origin

或者,用git remote -v显示更详细的信息:

$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)

上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址。

推送分支:

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

$ git push origin master

如果要推送其他分支,比如dev,就改成:

$ git push origin dev

创建远程origin的dev分支到本地,于:

$ git checkout -b dev origin/dev

多人协作的工作模式通常是这样:

首先,可以试图用git push origin <branch-name>推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。

这就是多人协作的工作模式,一旦熟悉了,就非常简单。

本人小白程序员,初来乍到,请多关照


小白程序员
7 声望1 粉丝