Git学习第二天
github
第一步创建SSH Key
用户主目录下,感觉就是之前lerarngit的上一级目录下,有没有.ssh目录,有的话看目录下有没有id_rsa和id_rsa.pub两个文件,没有的话打开Git Bash创建SSH Key:
$ ssh-keygen -t -C "myemail@email.com"
把邮箱换成自己邮箱,全部回车。找到.ssh文件夹,id_rsa和id_rsa.pub是SSH Key密钥对,前者是私钥,不能泄露,后者是公钥,可以透露
第二步登录GitHub
登录GitHub,打开账户设置,SSH Key页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点击添加。
运行第一步生成了key,但如果不上账号添加(第二步)的话时不能推送的
GitHub上免费托管的仓库任何人都可以看到,但只有自己才能改
不想让别人看两种方法
1. 交保护费
2. 自己搭Git服务器
添加远程库
- 登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
- 在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
$ git remote add origin git@github.com:myname/learngit.git
把本地库推送到远程库上
$ git push -u origin master
把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
以后只要本地做了提交,就可以
$ git push origin master
把本地master分支最新修改推送到GitHub
本地库空的话会出异常
小结
要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master
第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master
推送最新修改;
从远程库克隆
1.创建一个仓库名叫gitskills
勾选Initialize this repository with a README
这样GitHub会自动创建一个README.md文件
大约克隆空库也出异常
2.
$ git clone git@github.com:myname/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
$ cd gitskills
$ ls
README.md
git clone git@github.com:michaelliao/gitskills.git
git remote add origin git@github.com:myname/learngit.git
分支管理
每次提交,Git把它们串成一条时间线,这条时间线是一个分支,到现在为止,在Git里只有一个分支即master分支,HEAD指向master,master指向提交
创建分支
$ git checkout -b dev
Switched to a new branch 'dev'
等同于:
$ git branch dev
$ git checkout dev
Switched to branch 'dev'
checkout -b build ?
查看分支
$ git branch
* dev
master
当前分支前面会标一个*
号,修改文件然后提交
$ git add filename
$ git commit -m "branch file"
[dev fec145a] branch test
1 file changed, 1 insertion(+)
切换回master分支
$ git checkout master
Switched to branch 'master'
合并制定分值到当前分支(当前分支master)
$ git merge dev
Updating d17efd8..fec145a
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
Fast-forward
,Git告诉我饿们这次合并是 “快进模式”
就是直接把master指向dev的当前提交,所以合并速度很快
合并后可以删除dev
分支
$ git branch -d dev
Deleted branch dev (was fec145a)
branch -d delete
$ git branch
* master
小结
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
解决冲突
$ git checkout -b feature1 #建立新分支
修改文件
$ git add filename #添加
$ git commit -m "something" #提交
$ git checkout master #切换分支
修改文件
$ git add filename #添加
$ git commit -m "something" #提交
$ git merge feature1 #合并分支,提醒有冲突
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
修改文件,再次添加并提交
$ git log --graph=oneline --abbrev-commit #查看分支合并情况
$ git branch -d feature1 #删除分支
分支管理策略
合并分支时,如果可以,Git会用Fast forward
模式,但这种模式删除分支后会丢掉分支信息,如果强制禁用Fast forward
模式,Git就会在merge
时生成一个新的commit
,这样就可以从分支历史上看出分支信息。
$ git merge --no-ff -m "some message" dev
普通模式合并,能看出痕迹
创建并切换dev分支:
$ git checkout -b dev
修改readme.txt文件,并提交一个commit:
$ git add readme.txt
$ git commit -m "add"
切换回master:
$ git checkout master
$ git merge --no-f -m "merge" dev #禁用ff,因为本次合并要创建一个新的commit,所及加上-m参数,填写描述
$ git log --graph --pretty=oneline --abbrev-commit
* 7825a50 merge with no-ff
|\
| * 6224937 add merge
|/
* 59bc1cb conflict fixed
可以看出合并痕迹
bug分支
当前dev分支上工作没做完,出现一个master分支上的bug需要处理。
git stash
保存工作现场git checkout master
切换到master
分支git checkout -b bug001
从master
分支创建临时分支- 修改,
add
、commit
。 git checkout master
切换到master
分支git merge --no-ff -m "merge" bug001
合并到master分支git branch -d bug001
删除bug001分支git checkout dev
回到dev
分支干活git stash list
查看保存列表- 两种办法恢复
- 用
git stash apply
恢复,但恢复后stash
内容并不删除,需要用git stash drop
删除$ git stash apply stash@{0}
,drop也是这种格式么 - 用
git stash pop
删除,恢复的同时把stash内容也删了
- 用
feature分支
简单来说就是
创建一个新的分支feature
,在这个分支上写完新功能后,不采用,未合并之前,用git branch -d feature
不能删除,需要用git branch -D feature
强制删除
多人协作
远程仓库的默认名称是origin
$ git remote
origin
$ git remote -v #更详细的信息
origin git@github.com:myname/learngit.git (fetch)
origin git@github.com:myname/learngit.git (push)
推送分支
$ git push origin dev
- master
分支是主分支,时刻与远程同步
- dev
分支是开发分支,团队成员需要在上边工作,也需要远程同步
- bug
分支本地修复,没必要
- feature
看是否与小伙伴合作开发