您的位置:首页 > 编程语言

Git远程仓库及github的使用备注

2015-02-09 15:01 375 查看
远程仓库:

第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,

如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ ssh-keygen -t rsa -C "youremail@example.com"
</span></strong>


你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

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

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

把本地仓库的内容推送到GitHub仓库:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git remote add origin "SSH clone URL"	如:--git@github.com:omsvip/HelloGit.git</span></strong>


下一步,就可以把本地库的所有内容推送到远程库上:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push -u origin master </span></strong>


第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:

The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.

RSA key fingerprint is xx.xx.xx.xx.xx.

Are you sure you want to continue connecting (yes/no)?

这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。

Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:

Warning: Permanently added 'github.com' (RSA) to the list of known hosts.

这个警告只会出现一次,后面的操作就不会有任何警告了。

如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。

之后,只要本地作了提交,就可以通过命令:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push origin master</span></strong>


把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!

从远程库克隆:

在github上创建一个远程库后使用如下命令进行克隆:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git clone git@github.com:omsvip/gitskills.git</span></strong>


此处需要注意的是:clone 是整个库克隆,也就是一个远程库的文件夹及里面的文件,所以clone项目可以不要创建文件夹,直接进入项目保存目录执行此命令即可!

要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。

创建与合并分支:

创建dev分支,然后切换到dev分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git checkout -b dev
Switched to a new branch 'dev'

</span></strong>


git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch dev
$ git checkout dev
Switched to branch 'dev'

</span></strong>


用git branch命令查看当前分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch
* dev
master
</span></strong>


git branch命令会列出所有分支,当前分支前面会标一个*号。

把dev分支的工作成果合并到master分支上:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt |    1 +
1 file changed, 1 insertion(+)
</span></strong>


git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

删除dev分支了:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch -d dev
Deleted branch dev (was fec145a).
</span></strong>


删除后,查看branch,就只剩下master分支了:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git branch
* master
</span></strong>
因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

小结

Git鼓励大量使用分支:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>

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

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

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

Bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:

$ git status

Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
</span></strong>
现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:

<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ 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
#
</span></strong>


并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash
Saved working directory and index state WIP on dev: 6224937 add merge
HEAD is now at 6224937 add merge
</span></strong>


现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ 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'
</span></strong>


现在修复bug,需要把“Git is free software ...”改为“Git is a free software ...”,然后提交:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git add readme.txt
$ git commit -m "fix bug 101"
[issue-101 cc17032] fix bug 101
1 file changed, 1 insertion(+), 1 deletion(-)
</span></strong>


修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ 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 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git branch -d issue-101
Deleted branch issue-101 (was cc17032).
</span></strong>


用git stash list命令查看工作区:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash list
stash@{0}: WIP on dev: 6224937 add merge
</span></strong>


工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

另一种方式是用git stash pop,恢复的同时把stash内容也删了:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git stash pop</span></strong>


修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。

Feature分支:

开发一个新feature,最好新建一个分支;
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git checkout -b feature-vulcan
Switched to a new branch 'feature-vulcan'</span></strong>


如果要丢弃一个没有被合并过的分支,可以通过git branch -D <name>强行删除。

多人协作:

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

要查看远程库的信息,用git remote:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git remote
origin</span></strong>


或者,用git remote -v显示更详细的信息:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)
</span></strong>


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

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push origin master
</span></strong>


如果要推送其他分支,比如dev,就改成:
<strong><span style="font-family:FangSong_GB2312;font-size:14px;">$ git push origin dev
</span></strong>


但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

    master分支是主分支,因此要时刻与远程同步;

    dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

    bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

    feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!


查看远程库信息,使用git remote -v;

    本地新建的分支如果不推送到远程,对其他人就是不可见的;

    从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;

    在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;

    建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;

    从远程抓取分支,使用git pull,如果有冲突,要先处理冲突

    命令git tag <name>用于新建一个标签,默认为HEAD,也可以指定一个commit id;

    git tag -a <tagname> -m "blablabla..."可以指定标签信息;

    git tag -s <tagname> -m "blablabla..."可以用PGP签名标签;

    命令git tag可以查看所有标签。

    命令git push origin <tagname>可以推送一个本地标签;

    命令git push origin --tags可以推送全部未推送过的本地标签;

    命令git tag -d <tagname>可以删除一个本地标签;

    命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  github git