git入门
一、集中式与分布式
集中式:版本库存放在中央服务器,干活需要从其中取出,干完再放回去;必须联网才能工作
分布式:没有了中央服务器之说,远端只是负责交换修改等,每个电脑上都是完整的版本库。不需联网,只需要做好了,有网再推送远端就可以与其他人交换;分支管理功能强大。
二、安装
0.windows 安装完成后 ,从Git Bash 进入shell界面
1. $ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
分布式版本控制系统需要每个机器自报家门:名字和email地址
三、创建本地版本库
$ cd f: 进入系统f盘目录 (cd 会进入系统根目录)
$ mkdir learngit 创建learngit 目录(文件夹)
$ cd learngit
$ pwd 显示当前目录
$ git init 初始化(创建)一个版本库(跟踪控制整个当前目录文件夹 learngit),默认是master分支
注意git下修改相关txt文件 用notepad++的UTF-8 without Bom模式,windows自带记事本会更改格式。
四、编写文件readme 并推送到本地版本库默认master分支
$ git status 查看当前版本库与工作目录(working directory——电脑里能看到的文件内容)之间的变化
$ git add readme 将readme添加到stage暂存区,这里add 后面可以跟几个文件
$ git commit -m "create readme" 将readme 推送到本地仓库的master分支(默认分支),这里git commit 一次性推送所有stage暂存区内容到master分支,此时stage(working tree clean)里是空
五、版本回滚
$ git log 分布式版本控制 追踪的是版本库中快照commit的改变,git log 查看所有的改变(每个commit 都有一个版本ID, 对应一个改变) 单行显示 加 --pretty=oneline 后缀
按时间线,每个版本都会产生一个节点,HEAD指向最终的版本节点
$ git reset --hard HEAD^ 回退到HEAD前的一个节点,HEAD~num 回退到HEAD的往前的第num节点。HEAD就是一个指向当前branch的指针引用, branch其实也是一个指向节点的指针。
$ git reset --hard commit_ID的前几位
$ git reflog 显示记录的每一次commit以及ID (git tag 打标签也是针对每个commit ID进行的)
$ cat readme 可以查看文件中内容
$ git diff HEAD -- file_name 查看工作区的file_name文件与版本库中最新版本的区别。git 里面当前分支的内容控制着工作区的显示情况
六、撤销工作区的修改:git checkout -- readme 让文件回到最近一次commit
或add
时的状态
case1: 工作区修改还没有放到stage暂存区
$ git checkout -- readme 撤销后工作区和版本库一致(其实就是用版本库的版本替换工作区的版本)
case 2: 文件readme已经放到stage暂存区,又作了修改(暂存区有想要的备份)
$ git checkout -- readme 撤销后就回到添加到stage暂存区之前的状态
case 3: 工作区已经修改,然后还放到了stage暂存区(暂存区都没有想要的修改前的备份了),但还没有commit
$ git status 查看一下,git会有很多提示命令
$ git reset HEAD readme 撤销暂存区的提交 unstage,暂存区变空
$ git checkout -- readme 此时 又可以用case1解决了
七、删除文件
$ rm readme 删除工作区的readme文件
$ git status 提示工作区和版本库不同
case1:确定要删除,因此也删除版本库中的readme文件
$ git rm readme
case2:误操作 恢复工作区的readme文件
$ git checkout -- readme
八、添加远程仓库。用已创建的本地仓库关联这个远程仓库(远端库名字默认 origin)
0.登录github, create a new repo(每个repo就是一个版本库,比如 learngit)
1.创建一个ssh秘钥关联本机和此git账户,一定要记得创建秘钥时加本人的注册git账户的邮箱。然后git认证此ssh
2.关联本地仓库到远端仓库, 在本地仓库的分支master下 运行 $ git remote add origin git@github.com:zhaohengzhen/learngit.git 默认用SSH,很快。http模式传输速度慢
3.$ git push -u origin master 将本地版本库当前分支推送到远端的master分支。第一次推送到远端的空库时,加上-u参数不仅作了推送,还会将本地的master分支与远端的master分支关联起来。
4.$ git push origin master 之后推送到本地库master的内容都可以通过此命令推送至远端库的master
九、从远程库克隆——从零开发最好的方式:先fork别人版本库,然后克隆到本地
$ git clone git@github.com:zhaohengzhen/origin_new_repo.git
十、创建和合并分支
master指向的最后提交的节点,HEAD指向当前分支
$ git branch dev 创建新分支dev
$ git branch 查看所有分支 , *前缀的是当前分支
$ git switch dev 移动到dev上(将HEAD从master移动到dev上)。此后所做修改从dev这个分支向前延伸,但是master停在远处了。
在dev分支进行一系列开发,最后合并到master分支上。
$ git switch master 先跳到最终保留的分支
$ git merge dev 将dev分支merge到当前master上
$ git branch -d dev 删除dev分支(其实删除的是dev指针)
如果dev分支开发完,不merge直接丢弃删除
$ git branch -D dev
还可以创建加跳转分支一步到位
$ git switch -c dev
十一、分支策略
git鼓励大量使用分支
master分支应该非常稳定,一般对应发布的新版本,不能在上面干活
多人协作时远端创建一条dev分支
每人再创建各自的远端分支,将各自提交经常合并到dev分支,dev分支作为开发测试分支,没问题了再merge到master分支
$ git merge --no-ff -m "merge with no-ff" dev 合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
十二、bug分支
$ git switch master 本来在dev开发呢,需要修复master上的bug
$ git stash
把当前工作现场“储藏”起来,等以后恢复现场后继续工作
$
git stash pop 恢复现场
此时master已经修复了bug,我们想master上修复的bug 提交复制到dev上
$ git switch dev
$ git cherry-pick commit_id_bug
feature分支
添加一个新功能时,你肯定不希望因为一些实验性质的代码,把主分支搞乱了,所以,每添加一个新功能,最好新建一个feature分支,在上面开发,完成后,合并,最后,删除该feature分支。
十三、创建标签
$ git tag v1.0 默认打在最近一次的commit_id上
$ git tag v0.9 f52c633 也可以指定commti_id打标签
$ git show v0.9 查看此标签的所有信息
$ git tag -a v0.1 -m "version 0.1 released" 1094adb 创建带有说明的标签,用-a
指定标签名,-m
指定说明文字
$ git tag -d v0.1 删除标签
$ git push origin v1.0 推送某个标签到远程
删除远程标签:先删除本地标签,再删除远程
0.$ git tag -d v0.9
删除本地标签
1.
$ git push origin :refs/tags/v0.
9
删除远程标签
十四、使用github
-
自己只拥有Fork后的仓库的读写权限;
-
可以克隆自己fork后的仓库到本地,修改后推送到自己的fork远端库,然后再pull request给开源的官方仓库来贡献代码。
十五、忽略特殊文件
0.用notepad++ 编写.gitignore文件
1.忽略原则:操作系统自动生成的缩略图,python编译产生.pyc文件.pyo文件 .so文件 dist目录等
# Windows:
Thumbs.db ehthumbs.db Desktop.ini # Python: *.py[cod] *.so *.egg *.egg-info dist build # My configurations: db.ini deploy_key_rsa
2.先单独commit 提交 .gitignore文件到git(.gitignore
文件本身要放到版本库里,并且可以对.gitignore
做版本管理!)
git问题:提示access权限
原因:由于电脑账号更改了密码,此密码绑定了gitlab密码。
处理办法:直接在控制面板的用户凭据处修改git密码,修改后如果不可以,直接将凭据删除。然后重新输入用户名及邮箱,配置ssh。
注意:一般来讲
如果是别人的仓库,用http服务
自己的仓库,用ssh.