目前比较常用的代码管理方式主要是分布式的git和集中式的svn,这里的分布和集中针对的是代码存储的方式以及代码推送拉取的模式,下面主要总结下git的使用和常用命令。
git下载地址:https://git-scm.com/download
安装完成后,在git安装目录下打开"Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
接下来设置用户名和邮箱:
$ git config --global user.name "XXX"
$ git config --global user.email "XXX@163.com"
创建一个目录:
$ mkdir learngit
$ cd learngit
$ pwd
将learngit文件夹纳入git管理:$ git init
$ ls -ah
$ git add readme.txt
$ git commit -m "wrote a readme file"
$ git add .
$ git commit -a -m "comments"
$ git status
$ git diff readme.txt
查看提交历史:$ git log
$ git log --pretty=oneline
查看当前版本:$ git reset --hard head^
查看内容:$ cat readme.txt
回退至具体版本:$ git reset --hard 3628164
查看命令历史:$ git reflog
工作区和暂存区的概念:
前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
Git管理的是修改,而不是文件,每次修改,如果不add到暂存区,那就不会加入到commit中。
删除文件的场景:
$ git add test.txt
$ git commit -m "add test.txt"
场景1:提交删除至版本库
$ git rm test.txt
$ git commit -m "remove test.txt"
场景2:误删,则从版本库checkout误删文件
$ git checkout -- test.txt
远程仓库:
在本地生成私钥和公钥:$ ssh-keygen -t rsa -C "XXX@163.com"
添加远程仓库origin: $ git remote add origin https://github.com/dali-lyc/learngit.git
查看远程库:$ git remote -v
删除远程仓库origin: $ git remote rm origin
将本地库内容推送到远程库上
(第一次):$ git push -u origin master
(以后):$ git push origin master
创建远程origin的dev分支到本地: $ git checkout -b dev origin/dev
推送失败则拉取远程库更新: $ git pull origin dev
因此,多人协作的工作模式通常是这样:
- 首先,可以试图用git push origin branch-name推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin branch-name推送就能成功
提交代码流程:
-->修改本地工作空间文件
-->添加至本地库暂存区$ git add .
-->提交至本地库分支$ git commit -m "comments"
-->推送至远程库对应分支$ git push origin master
从远程库克隆:
使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。
-->github新建远程库
-->克隆到本地工作空间$ git clone https://github.com/dali-lyc/gitskills.git
-->走上面的提交代码流程
分支管理:
(1)新建本地库dev分支:$ git branch dev
(2)切换至dev分支:$ git checkout dev
查看本地库分支:$ git branch
合并dev分支到当前master分支:$ git merge dev
删除分支:$ git branch -d dev
注:ctrl+z:退出git当前执行的命令
合并冲突问题:
原因:master中创建分支dev,在dev分支中修改文件,同时master分支也修改文件,此时将dev合并到master分支,就会出现冲突。
解决方法:根据提示手动修改冲突的文件,重新合并
在master分支中$ git merge dev
查看分支合并图:$ git log --graph --pretty=oneline --abbrev-commit
bug分支:
当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,当前正在dev上进行的工作还没有提交,
并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
保存dev工作现场:$ git stash
切换要修复的分支:$ git checkout master
创建临时分支:$ git checkout -b issue-101
$ git add readme.txt
$ git commit -m "fix bug 101"
$ git checkout master
合并:$ git merge --no-ff -m "merged bug fix 101" issue-101
$ git branch -d issue-101
$ git checkout dev
回到dev工作现场:$ git stash pop
标签管理:
发布一个版本时,我们通常先在版本库中打一个标签,这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
$ git tag v1.0
$ git tag -d v0.1
忽略无需推送的文件:
有些时候,你必须把某些文件放到git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件等,可以在git项目工作区的根目录下创建一个.gitignore文件,然后把要忽略的文件名填进去,git就会自动忽略这些文件。