为了督促自己能看完这个网站的学习教程,边看边做了些简要的笔记,记录了常用命令,其实也就是自己打了些简单的命令,好多直接就粘贴过来了,也算是一个学习的证明吧,想按详细的教程,还是要去博主的园子学习啊地址是:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
上面的Python教程也是不错,有时间也要学习学习。下面是简单的记录,学习旅程的小开始!
----------------------------lesson 01----------------------------------
git init
git status
git add readme.txt
git commit -m "add readme"
git diff
git log
git log --pretty=oneline
当前版本HEAD,上一个版本HEAD^,上上一个HEAD^^,上一百个HEAD~100
回到上一个版本
git reset --hard HEAD^
会丢失这个版本以后的版本,再想回去只能用--hard后面跟上id号码了,只要当前终端未关闭只需要给出前几位就可,git会自己去寻找,但要确保给出的这个能唯一确定想要恢复的那个版本。
不过忘了id也没关系,Python友好的给了后悔药,使用命令可以查看所有提交过的每次操作然后找到版本id,我的给出了前7位
git reflog
git reset --hard commt_id
--------------------------------lesson 02---------------------------
为什么有两步操作?add 和 commit干了什么?
git的storage暂存区的作用
Git管理的是修改而不是文件
git commit只会提交你刚add过的文件,没add的那些修改不会提交,所以只要工作区修改了就别忘了add,记住真正提交到版本库里需要两步操作。使用如下命令可以查看版本库里和工作区里的文件的区别:
git diff HEAD -- readme.txt
如果反悔了想撤销修改,得看你在哪步犯的糊涂想反悔
1.修改了文件没有add到暂存区:git checkout -- readme.txt
2.修改了文件add到暂存区但还没有commit:先用git reset HEAD file退到原来版本,在用git checkout -- readme.txt撤销更改,暂存区和工作区都干净了
3.修改了文件add了也commit到版本库了但没有提交给远程服务器:利用版本恢复git reset --hard commt_id
4.修改了文件add了也commit到版本库了并提交给远程服务器:目前我帮不了你了啊
删除操作:
git rm test.txt
git commit -m "delete test.txt"
如果误删除想撤销,用git checkout -- test.txt
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
--------------------------------------lesson 03--------------------------
远程仓库
用Github这个神奇的网站,它提供代码托管服务,可以得到免费的远程仓库。首先要有SSH key。
创建SSH Key
ssh-keygen -t rsa -C "[email protected]"
在用户主目录下/home/bmr/会生成.ssh的文件夹(隐藏的),里面会有两个文件id_rsa和id_rsa.pub。前者是私钥不可泄漏出去,后者是公钥,可以告诉别人,也就是用来添加到Github的SSH Key里面的。这样可以免费托管代码,但是别人都能看得见你的代码。要想保护起来,交钱或者自己建立一个Git服务器,以后会讲的~~
1). 创建一个新的Git仓库:
登录后右上角Create a new repo,点击
2). 创建后的提示:
在本地用命令行创建repo:create a new repository on the command line
在本地的目录下执行命令:
将已有的本地repo添加到仓库:$ git remote add origin https://github.com/maoranbian/learngit.git
或者
$ git remote add origin [email protected]:michaelliao/learngit.git
注意两种都可,只是用到的协议不同,前者是https协议,后者是ssh是默认的协议,速度更快。
然后把当前分支推送到远程 $ git push -u origin master
-u的作用,第一次推送时要加此命令。
以后修改了本地文件,可以直接用git push origin master
从远程仓库克隆
在GitHub已有一个建立好的远程库gitskills.git,在本地选定好的文件夹里用命令克隆到本地库
git clone [email protected]:maoranbian/gitskills.git
-------------lesson 04-----------------
分支管理
Git用HEAD指针指向当前分支的最新提交
git branch 查看所有分支,Git会列出所有分支并在当前分支开头标记一个*
git checkout -b dev 创建分支dev并将HEAD指向该分支,相当于合并了下面的两步操作
git branch dev
git checkout dev
git checkout master 将当前分支切换到master
git merge dev 将分支dev的内容合并到当前分支matster,采用Fast-Forward快进模式
git branch -d dev 合并结束后删除dev分支
默认的主分支就是master
练习step:
1.建立并切换到一个dev分支
2.在dev分支修改readme并add和commit
3.切换到master分支并merge dev
4.删除dev分支
解决冲突:
冲突产生的step:
1.创建并切换到分支feature1
2.修改readme并add和commit 内容:and simple
3.切换到分支master并修改readme 内容:& simple
4.直接merge时产生冲突,不能用Fast-Forward的方式进行merge,可以使用git status 查看产生冲突的文件
打开冲突文件可以看到git为我们列出的各个分支下不同的修改
5.在主分支上手动修改后提交
可以使用带参数的log命令查看合并情况 git log --graph --pretty=oneline --abbrev-commit
6.删除feature1分支,ok!
可以用git log --graph 查看分支合并情况
合并方式:
默认的Fst-Forward方式合并删除后会丢掉分支信息,使用--no-ff参数合并可以保留合并过的分支信息。
git merge --no-ff -m "merge with --no-ff" dev 表示将dev分支合并到当前分支并禁用Fast-Forward模式
分支策略:
master分支因该是稳定的,仅仅用来发布新版本,不在上面干活
dev分支是干活用的,不稳定的,发布新版本时把它merge到master上
每个程序员在自己的分支上干活,写好了merge到dev上!
----------lesson 05---------------
Bug分支:
当前分支dev上的工作还没完成,也不能立即提交,但还要去修改个bug?储存当前工作现场的status功能
$ git stash 保存工作现场了
现在可以修理bug了,在那个分支上修复就在那个分支上branch创建一个临时分支。
比如在master分支上修改就在它上面创建一个临时分支issue-101
git checkout master 切换到master分支
git checkout -b issue-101 创建一个临时分支issue-101
.....在issue-101分支上修复bug并提交...
git checkout master 切换到master分支上去
git merge --no-ff -m "merge bug fix 101" issue-101 以保留分支记录的形式完成合并
git branch -d issue-101 删除该分支
好了,现在可以回去干活了
git checkout dev
git status 查看当前工作区是否干净
git stash list 查看储藏的工作区信息
恢复工作区的方法有两个:
1.git stash apply 用来恢复
git stash drop 用来删除stash的储藏信息
2.git stash pop 恢复的同时把stash的信息也删除了
上两个用任何一个删除后,用git stash list 查看已经没有stash的信息了
注:可以多次stash,恢复的时候用git stash list查看,恢复到某个就用它对应的list 中的id信息
git stash apply stash@{0}
Feature分支:
接到通知,产品经理又要加功能了,可不能为了这个新特性干扰了原来已经好用的分支。
所以没添加一个新功能最好新建一个feature分支并在上面实验,成功后合并再删除该分支。
比如当前在dev分支上
git checkout -b feature-vulan 为新功能vulan的开发新建一个分支
开发完毕后提交修改
git add vulan.py
git commit -m "add feature vulan"
git checkout dev 切回到dev分支
如果老板说做的不错合并吧,那就合并分支然后删除feature分支,但他也许会说,这个功能不好,又不想要了,
那也得销毁
git branch -d feature-vulan
不过,不让轻易删,会提示出错信息,还未合并,删除了无法恢复,但可以用下面命令强制删除,只需要将-d改为-D
git branch -D feature-vulan
--------------lesson 06---------
多人协作:
你总得学会团队合作
当从远程仓库克隆时,Git自动把本地master和远程的master对应起来了,默认远程仓库的名字是orign。
git remote 查看远程仓库信息
git remote -v 查看远程仓库详细信息,有抓取和推送两种,有两种权限的才能全部看到
推送分支:
将本地分支提交到远程库
git push origin master 推送本地的master到远程
git push origin dev 推送本地的dev到远程
一般master和dev分支都需要推送到远程,bug和feature分支视情况而定
抓取分支:
多人协作时,每个人都需要向master和dev推送各自的修改
clone只会将远程的master主分支复制并关联到本地,得到远程其他分支?
git checkout -b dev origin/dev 获取远程的dev到本地,注意没有关联,Git只对master默认关联
现在可以在本地修改并提交了,然后时不时的push到远程
git push origin dev
不过要是还有人也push到了远端dev,可能有修改上的冲突,push可能失败,按Git提示先将最新的提交抓下来,在本地
解决冲突后再提交
git pull
git pull 都失败"no track information"是因为还没有和远程的该分支建立链接自然无法从分支抓取
git branch --set-upstream dev origin/dev 建立本地dev和远程dev的链接,然后抓取
git pull
然后在本地解决冲突,手动解决的方法跟以前一样,然后在本地提交后push到远程,仍使用如下命令:
git push origin dev
多人协作的步骤:
1.先试图push自己的修改到远程
2.push失败说明远程的比本地的新,用pull抓取到本地尝试合并
3.合并失败说明有冲突,
到本地解决冲突后先在本地提交
4. 合并成功或解决了冲突后push到远端
------------------lesson 07-----------
发布么某个版本时,打个标签
git checkout master 先切换到药打标签的分支上
git tag v0.1 给这个分支的当前提交打标签
git tag v0.1 commit_id 给id为commit_id的某个历史版本创建标签
git tag 查看所有标签,标签按字母顺序列出
git show v1.0 列出某个标签的信息
git tag -a tag_name -m "tag_info" 创建有说明信息的标签
用-s 还可以创建一个带pgp签名的标签,暂不介绍了
git tag -d v0.1 删除标签
以上都是在本地操作的,也可推送到远程
git push origin v0.1 将一个标签推送到远程
git push origin --tags 一次将所有标签推送到远程
删除远程上的标签药分两步:
git tad -d v0.1 先删除本地标签
git push origin :refs/tags/v0.1 然后用此命令从远程删除,可以从GitHub上验证是否成功删除
-------------lesson 08--------
使用GitHub:
可以用自己的帐号Fork任意开源仓库到个人的GitHub上。
自己拥有自己仓库的读写权限
如果够牛的话,可以推送自己的代码到开源库上,不过人家是否接收你的pull reguest就不一定了
1.访问开源项目的主页,将开源仓库fork到自己的GitHub,比如有名的https://github.com/twbs/bootstrap
2.从自己的帐号下克隆到本地$ [email protected]:maoranbian/bootstrap.git
3.可以自己干活了,然后把自己的结果推送到自己的GitHub仓库
4.如果想试试运气,那就把自己的成果bug或是新功能pull request吧
自定义Git:
1. 让Git显示颜色:
git config --global color.ui true
2. 让Git忽略某些文件,保存在本地,不提交Git也不会出现提示:
在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。配置文件的写法参照https://github.com/github/gitignore
最后,这个配置文件本身也是要加入到Git版本库中的。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
3. 为命令配置别名:
一行命令就可以,比如要让git st 表git status,可以用如下命令设置:
$ gti config --global alias.st status
习惯性的简写比如co表示checkout,ci表示commit,br表示branch
命令中饿global表示是全局参数,表示对这台电脑的所有Git仓库都适用。
还可以对复杂点的命令起别名,比如撤销暂存区修改的reset HEAD命令可以用设置别名unstage,方法如下:
$git config --global alias.unstage "reset HEAD"
配置一个git last让它显示最后一次的信息提交
$git congig --global alias.last "log -l"
有机会你可以试试下面的配置是被哪位牛人配置成什么样子了?
$git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
4. 什么?你想删除别名?好吧,带你去找配置文件
在配置别名时如果不加--global就只对当前仓库起作用,每个仓库的配置文件都放在.git/config中,别名的设置都在[alias]名下,觉得哪个不顺眼删除它所在的行,别名就不起作用了,当然,也可以直接在这个地方配置别名,那就是仅针对这个仓库的了。
5. 搭建自己的Git服务器私用:
不想开源自己的代码的话,就自己在本地搭建吧,保护代码还不用交费
你需要有一台运行Linux系统的电脑,并且有sudo权限,搭建开始:
step1:安装Git
$sudo apt install git
step2: 创建一个用户运行Git服务
$sudo adduser git
step3: 创建证书登陆
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
step4: 初始化Git仓库
在git仓库的目录下执行如下命令创建一个裸仓库sample.git:
$ sudo git init --bare sample.git
裸仓库没有工作区,因为只是为了共享,把owner改为git:
$ sudo chown -R git:git sample.git
step5:禁用shell命令
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
step6:使用git clone命令克隆远程仓库
在小伙伴们各自的电脑上运行克隆命令就可以啦:
$ git clone git@server:/srv/sample.git
然后就是推送什么的了
其他的,要方便管理公钥,用Gitosis;要像SVN那样变态地控制权限,用Gitolite。
友情附赠国外网友制作的Git Cheat Sheet,建议打印出来备用:
Git Cheat Sheet
现在告诉你Git的官方网站:http://git-scm.com
好了,简单知识告一段落,剩下的就是勤学苦练了