远程仓库:
访问GitHub速度慢的解决办法
1. 修改本地hosts文件
windows系统的hosts文件的位置如下:C:\Windows\System32\drivers\etc\hosts
mac/linux系统的hosts文件的位置如下:/etc/hosts
2. 增加http://github.global.ssl.fastly.net和http://github.com的映射
获取Github相关网站的ip
访问https://www.ipaddress.com,拉下来,找到页面中下方的“IP Address Tools – Quick Links”
分别输入github.global.ssl.fastly.net和github.com,查询ip地址
下面是我的配置
140.82.114.4 github.com
199.232.5.194 github.global.ssl.fastly.net
3.命令提示符中输入ping github.com
保存更新DNS
Winodws系统的做法:打开CMD,输入ipconfig /flushdns
1.请自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的
- 第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
- 一路回车,使用默认值即可
- 在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
- 登陆GitHub,打开“Account settings”,“SSH Keys”页面:
- 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
2.添加远程库
- 首先,登陆GitHub,创建一个新的仓库learngit:
- 在本地的learngit仓库下运行命令:
$ git remote add origin git@github.com:michaelliao/learngit.git //origin表示远程仓库
$ git push -u origin master
//由于远程库是空的,第一次推送时,加上了-u参数,
//不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,
//在以后的推送或者拉取时就可以简化命令。
从现在起,只要本地作了提交,就可以通过命令把本地master分支的最新修改推送至GitHu:
$ git push origin master
3.克隆远程仓库
$ git clone git@github.com:michaelliao/gitskills.git
分支管理
1.创建和合并分支
-
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
-
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
-
假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:
1.1创建dev分支,然后切换到dev分支:
$ git checkout -b dev
Switched to a new branch 'dev'
- 查看当前分支:
$ git branch
* dev //当前分支前面会标一个*号。
master
- 对readme.txt做个修改
- 提交
$ git add readme.txt
$ git commit -m "branch test"
[dev b17d20e] branch test
1 file changed, 1 insertion(+)
- 切换回master分支
$ git checkout master
Switched to branch 'master'
- 把dev分支的工作成果合并到master分支上
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward //这次合并是“快进模式”
readme.txt | 1 +
1 file changed, 1 insertion(+)
- 合并完成后,就可以放心地删除dev分支了:
$ git branch -d dev
Deleted branch dev (was b17d20e).
- 删除后,查看branch,就只剩下master分支了
$ git branch
* master
2.解决分支间的冲突
- 准备新的feature1分支
$ git checkout -b feature1
Switched to a new branch 'feature1'
- 修改readme.txt
- 在feature1分支上提交
- 切换到master分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit. //显示当前master分支比远程的master分支要超前1个提交
(use "git push" to publish your local commits)
- 再修改readme.txt
- 提交
- 然后合并,看提示会有什么,然后打开冲突的文件看看有什么
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt //合并冲突在readme文件
Automatic merge failed; fix conflicts and then commit the result.
- 在readme.txt文件的冲突
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
-
必须手动解决冲突后再提交,就是自己再一次修改readme.txt,目的是将master指向的节点向前走一步,提交就解决了
-
删除分支
3.分支管理策略
- 在实际开发中:
master分支应该仅用来发布新版本,平时不能在上面干活;
干活都在dev分支,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
- 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
$ git merge --no-ff -m "merge with no-ff" dev
3.bug分支
- 当工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
- Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge
- 用git status查看工作区,就是干净的,因此可以放心地创建分支来修复bug
- 首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.
(use "git push" to publish your local commits)
$ git checkout -b issue-101
Switched to a new branch 'issue-101'
- 修复bug
- 修复完成后,切换到master分支,并完成合并,最后删除分支
- 现在,是时候接着回到dev分支干活了
4.feature功能分支
- 每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
5.多人协作
- 查看远程库的信息
$ git remote -v
origin git@github.com:michaelliao/learngit.git (fetch)
origin git@github.com:michaelliao/learngit.git (push)
- 推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支
$ git push origin master
- 如果要推送其他分支,比如dev,就改成:
$ git push origin dev
5.1 多人协作时,大家都会往master和dev分支上推送各自的修改。
- 假设你的小伙伴要在dev分支上开发,就必须创建远程origin的dev分支到本地,于是他用这个命令创建本地dev分支:
$ git checkout -b dev origin/dev
- 然后,时不时地把dev分支push到远程
$ git add env.txt
$ git commit -m "add env"
[dev 7a5e5dd] add env
1 file changed, 1 insertion(+)
create mode 100644 env.txt
$ git push origin dev
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:michaelliao/learngit.git
f52c633..7a5e5dd dev -> dev
- 而碰巧你也对同样的文件作了修改,并试图推送,发送了错误
$ cat env.txt
env
$ git add env.txt
$ git commit -m "add new env"
[dev 7bd91f1] add new env
1 file changed, 1 insertion(+)
create mode 100644 env.txt
$ git push origin dev
To github.com:michaelliao/learngit.git
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'git@github.com:michaelliao/learngit.git'
//更新被拒绝,因为您当前分支的提示位于后面
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again. //先 git pull 然后再推
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
-先 git pull
$ git pull
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 branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.
- 再git pull:
$ git pull
Auto-merging env.txt
CONFLICT (add/add): Merge conflict in env.txt //文件冲突,此时需要手动在本地文件修改
Automatic merge failed; fix conflicts and then commit the result.
-提交后push到远程
6.标签管理
- 给版本打标签,将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来,它就是指向某个commit的指针。所以,标签也是版本库的一个快照。
- 打一个新标签
$ git tag v1.0
- 查看所有标签
$ git tag
v1.0
- 比方说要对add merge这次提交打标签,它对应的commit id是f52c633,敲入命令:
$ git tag v0.9 f52c633
- 删除标签
$ git tag -d v0.1