团队开发、代码维护利器——github
前言
github是一种基于git的代码托管平台,我们在本地的电脑上安装上git后,并建立本地仓库,然后与github远程仓库有建立连接,就可以实现代码的上产(push)和下载(pull)。在团队开发过程中,多个成员可以共同向远程仓提交代码,共同维护代码,提高开发效率。既然github是基于git的,那么git是什么呢?git就是一个软件,官方名称是版本控制系统(工具),git学会了github就水到渠成了。
目录
关于git的几个概念
commit (提交)
git的提交是文件历史状态的快照
,也就是历史仓库。
branch (分支)
Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。
HEAD
Git 是如何知道你当前在哪个分支上工作的呢?其实答案也很简单,它保存着一个名为 HEAD 的特别指针。它是一个指向你正在工作中的本地分支的指针(将 HEAD 想象为当前分支的别名)。
每次提交后 HEAD 随着当前分支一起向前移动 。切换到哪个分支,哪个分支就成为自动向前移动的指针HEAD。
索引
就是一个暂存区,通过git add 将当前目录文件添加到索引。提交文件到历史仓库分两步,先add文件到索引,然后commit将暂存区的文件到历史仓库。
合并
合并分两种情况,fast-forward(快进),分叉合并。前者中两个分支是直系亲属,后者,没有直系关系,但是有共同的祖先。
本地仓操作
本地建立库(项目)
mkdir test touch readme.md git init #初始化 git status #查看git状态,随时都可以敲
添加并提交文件
git add <filename> git commit -m "my first commit"
新建分支并切换到分支
git branch <branchname> #新建分支 git checkout <branchname> #切换分支 git branch -D <branchname> #删除分支
打标签
git tag v1.0 #为当前状态打标签 git tag #查看所有历史标签 git checkout v1.0 #切换到v1.0的状态
git常用命令
diff: 比较 两次提交/两个分支/两个文件 的不同
git diff <id1> <id2> #比较两次提交的不同,提交的id号可以通过 git log 查看 git diff <branch1> <branch2> #比较两个分支的不同 git diff <file1> <file2> #比较两个文件的不同
checkout: 切换分支/tag/提交 (撤销)
git checkout v1.0 #切换tag git checkout <COMMIT_ID> #切换某次提交之前的状态 git checkout HEAD~ #撤销最后一次提交 git checkout <branchname> #切换到分支
stash: 保留当前未完成的工作,用户可以着手去完成别的工作。
git stash #把当前分支没有commit的代码暂存起来 git stash list #查看暂存记录 git stash apply #代码恢复 git stash drop #删除上一条记录
merge: 合并分支
#切换到主分支,然后将分支1合并进来 git checkout master git merge branch1 #注:rebase 也有合并的功能,与merge有所区别. 合并之后有时会有冲突。
分支管理
git branch #查看本地分支 git branch -r #查看远程分支 git checkout branchName origin/branchName #将远程分支迁移到本地
查看所有与本地关联的远程仓
git remote
远程仓的移除和重命名
git remote rename <old_name> <new_name> #移除 git remote rm <name> #重命名
撤销:reset 与 checkout 对比
reset :
- 不带路径时,移动当前分支 和HEAD ,并且有选择的变动工作目录和索引。
- 带路径时,用来在从历史仓库中复制文件到索引,不改变当前分支和HEAD指向,不动工作目录(除非使用–hard选项)。
checkout :
- 不带路径时,移动HEAD,同时更改索引和工作目录,
- 带路径时,将指定的文件从历史提交中恢复到索引和工作目录,不改变HEAD。注意:两种情况都不改变当前分支的指向。
# reset git reset HEAD~ #移动HEAD和当前分支到上一次提交的节点,即撤销提交,索引改变,但是工作目录不变 # => 还原分支和索引 git reset [HEAD~] <files> #将历史提交中的文件还原到索引,工作目录不变 # checkout git checkout <branch_name> #切换分支,只改变head指向 git checkout HEAD~ #将head指向上一次提交的节点,同时恢复索引和工作目录,注意分支指向不动 git checkout [HEAD~] <files> #将历史提交中的文件还原到索引和工作目录
总结:
- 如果要撤销本地修改,使用 git checkout [HEAD~] files
- 如果要撤销提交,使用 reset。
- 如果要重新提交,使用 git commit –amend , 实际上也可以用 reset实现。
与远程仓交互
配置密钥
生成ssh key
ssh-keygen -t rsa
之后输入三次回车,在用户目录下生成两个文件,id_rsa 和id_rsa.pub
在github添加ssh,将id_rsa.pub的内容复制到github的添加公钥的位置
测试
ssh -T git@github.com
出现 successful 说明成功。
建立关联
#方式1:克隆远程到本地->建立关联->修改提交
git clone git@github.com:Daibingh/hello.git
#在修改clone的项目后
git push origin master
#方式2:本地有完整项目->与远程仓建立关联->远程本地同步
git remote add origin git@github.com:Daibingh/test.git
git push origin master