Git教程
更新12/14/2017 5:21:57 PM
更新11/22/2017 6:27:24 PM
写在前面,在heroku上部署了python web应用,迎合大众,所有操作都是在Ubuntu上操作。由于git版本管理没有掌握好,在Ubuntu和Windows上面的命令有一定的不同,造成了迥异的报错。现整理归类一下:
方法一
在电脑本地生成ssh,并添加ssh keys到GitHub设置中。如此,电脑可以和GitHub repository进行通信。
1.ssh-keygen -t rsa -C"1622571327@qq.com" #邮箱为GitHub注册邮箱主要大写C 2.在本地某个地方生成.ssh文件,打开id_rsa.pub并将其中的字符串添加到GitHub网站SSH keys即可通信 #ssh也是一个通信标准,这里是本地电脑和GitHub网站的一个通信,.ssh文件在本地位置无恙 #通信建立完成了,就这么简单
本地新建文件夹(避免汉字),Git bash here终端切换进去,并执行git初始化。
1.mkdir myproject 2.cd /home/leng/myproject 3.git init #初始化仓库,会生成.git文件 #主要git安装比较简单,而且无需更改环境途径
在GitHub网页上新建自己的一个new repository用来储存我们的myproject项目文件,文件名和本地一致。
1.直接new repository新建版本仓库 #为了方便,取名和本地保持一致吧
将本地文件推送到GitHub仓库
0.提交前事项 0.1. git add . #将我们的新文件添加至commit 0.2. git commit -m'message'#将内容commit后准备提送 1.git remote add origin git@github.com:lq-jar-head/myproject.git #此处的origin为远程库的名字-默认叫法,一看就知道是远程库 #这一本就是将远程仓库和本地仓库绑到一起了 2.git push -u origin master #第一次推送,主要-u,以后都没必要了 #步骤2也没有必要,直接在步骤1的基础上,git push即可 3...多次操作 git push origin master
方法二
上面是先有本地库,后有远程库,再关联远程库。有另外一个不同的方法,先在GitHub新建一个远程库,然后在本地git clone git@github.com:lq-jarhead/heroku.git
克隆到本地就可以了。
总结上面普通步骤:
git status
此命令用来查看当前仓库的情况–新增啊、修改等等git add .
将新增/修改内容添加进来,进行commit前准备git commit -m'message'
将新内容进行commit提交git push
最后的提交了- 以上步骤2-4是最基本最主要的操作了, 更详细的不谈了。
END
前言
本文为本人阅读廖雪峰教程的总结和笔记,教程见 廖雪峰Git教程
1分布式vs集中式
Git是分布式的版本管理系统,和其他集中式的版本管理系统相比,如SVN,最大的优点是本地管理、多人同时开工,
Git与SVN的主要差别:
- 这两个工具主要的区别在于历史版本维护的位置,Git本地仓库包含代码库还有历史库,在本地的环境开发就可以记录历史,而SVN的历史库存在于中央仓库,每次对比与提交代码都必须连接到中央仓库才能进行。
- Git中,自己可以在脱机环境查看开发的版本历史
- 多人开发时如果充当中央仓库的Git仓库挂了,任何一个开发者的仓库都可以作为中央仓库进行服务,不过开发者仓库一般不直接充当中央库,但你可以随时创建一个新的中央库然后同步就立刻恢复了中央库
2基本操作
- 在Ubuntu下安装:
sudo apt-get install git
;Windows下就是一个基本软件的安装了。 - 创建仓库:在某个文件夹里面右击打开git bash here
mkdir learngit
#创建文件夹cd learngit
#进入文件夹目录pwd
#在显示当前目录git init
# 初始化git config --global user.email "xx"
#注意yy和name之间的空格git config --global user.name "yy"
#email和name的配置没有作用,主要本地生成的ssh_key添加到GitHub配置中起作用。
- ****提交文件到仓库及修改、查看更改:
- 新建readme.txt
git add readme.txt
#添加文件到仓库–精准添加单个文件git commit -m "this is the first version"
#提交文件到仓库,可以多个一起提交,message用来保存提交的描述信息手动改动readme.txt中的内容并保存
git status
#查看仓库的当前状态,提交修改和新文件一样需要两步git diff
#见后面的解释说明,列出修改的信息git add readme.txt
上面status和diff可以看到仓库修改过,就需要再次提交。git commit -m"the second"
- 版本回退:
git log
#查看版本详细的操作记录情况,方便我们版本回退到那个那个版本。git reset --hard head^^
#HEAD是当前版本,^^往前两个版本HEAD~4
,回退4个git reflog
#查看所有的版本操作git reset --hard xxx
回退到未来版本,最常用,xxx为版本号,前面几个即可–不少于四位,系统自动搜索- 版本向前或向后的回退,显示获取各个版本情况,再用命令回到希望的版本。
操作解释说明:
git status
两个作用,1用来监控工作区文件的增加或减少(文件的改动只有git diff可以查询出来),2.用来查询当前版本位置,缓存区有无文件需要commitgit diff
#比较工作区和缓存区的区别,若commit了,则无返回。但是,改变了readme.txt文件保存后,不用add,用git diff即可返回出哪里更改了git add readme.txt(git add . #一股脑全加入缓存区),git commit -m"xxx"
两个命令常一起使用。git add xxx可以使用多次,就是将多个文件添加到缓存区,git commit就是将缓存区内容全部提交到repository版本仓库。
3 工作区和版本库、缓存区
- 工作区:working directory工作目录,就是我们放置文件的目录,在这里就是readme.txt所在的目录,即是我们的工作目录。
- 版本库:repository,版本仓库,就是.git文件夹,用来储存各个版本信息
- 缓存区:版本库中有一个stage文件夹,就是我们的缓存区
用实际操作说明他们的关系:在工作区我们编辑readme.txt文件并保存,通过git add readme.txt
添加到缓存区,再通过git commit -m"xxx"
将缓存区所有东西提交到版本库,就成了一个明确的版本了。
4 管理、撤销修改和删除文件等
git rm readme.txt
#删除工作区的文件git checkout --readme.txt
#”在commit之前,该命令为撤销删除”,我这里没有实现,总是报错。checkout 就用来回退版本了
5 本地仓库和远程仓库
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
创建本地仓库:
- 创建SSH key:
$ ssh-keygen -t rsa -C"1622571327@qq.com"
(win下直接在gitBash中操作,若在Ubuntu中,打开shell)。可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人. - 登录GitHub,create ssh key 并在其中填入我们的公共钥匙
创建远程仓库:
- 登录GitHub,create a new repository ,创建一个新的仓库,命名最好与本地一致
- 按照提示,在本地仓库命令栏中输入
git remote add origin git@github.com:lq-jarhead/learngit.git
完成添加。
克隆仓库:
- 在某个目录处,打开git shell,此处就是根目录
git clone https://github.com/lq-jarhead/learngit
就是将仓库复制到此处
6 分支管理:
涉及到分支的创建、合并和删除,还有解决冲突。比如,我们在同一个readme.txt文件编辑了,最后两个分支和master合并,就会产生冲突,需要人工解决了。不用纠结太多,分支管理更多用在不同模块更改吧。
git checkout -b xxx
#创建并切换到xxx分支git checkout xxx
#就是切换到xxx分支在Dev分支下,对文件readme.txt进行更改等
git add readme.txt
git commit -m"lengqian"
git checkout master
#切换到mastergit merge --no-ff -m"merge" xxx
#将dev分支和当面master合并,no fastforward和-m”共存”,为了后期查看具体merge信息。git branch -d xxx
#删除xxx分支 git branch -D xxx#确认删除(强行删除)git branch
#查看当前目前所有分支,星号标记的为当前分支git log
#就可以查看合并记录了
注意:目前是在master分支,我们创建一个分支test,在其中更改并保存readme.txt,再提交给版本库。返回到master分支,在其中更改并保存readme.txt,再提交给版本库。这时候,二者就有冲突的地方了,我们用合并命令就知道冲突在那里,手动消除冲突后。直接提交给版本库即可。(这里不是再次合并,应为第一次已经合并了,尽管有冲突,我们手动消除后就没有了冲突,直接提交即可!)
7 Bug分支管理
- 目前,lengqian正在leng分区上修改
- 老大说master有一个bug,需要马上更改
git stash
#将leng分区临时保存起来git checkout master
#切换到master分区git checkout -b bug
#创建bug分区,用来修改- 修改好了,直接将bug合并到master中
git checkout leng
#切换到leng分区git stash list
#可以看到我们的保存的文件git stash pop
#切换为最近一次临时保存的界面,并删除stash用stash list可以查看stash列表,
git stash apply stash@{1}
#用来恢复那个版本,
8 多人协作
- 大家公用一个远程仓库,开发之前
git remote -v
查看远程仓库的信息。 git clone ...
拷贝至本地,用git branch可以看出只有master分区git checkout -b dev
创建自己本地的开发分区,并用git push origin dev
推送至仓库,也是同伴的开发分区基础- 同伴
git pull origin dev
#即可将dev分区复制到本地 - 在本地dev中修改完成后,用
git push origin dev
将本地的dev分区push到远程仓库(这个推送之后,也就是合并到远端的dev中去了)
作者小总结:
- 查看远程库信息,使用git remote -v,前提是拷贝下来,并且在.git目录处打开Bash;
- 本地新建的分支如果不推送到远程,对其他人就是不可见的;
- 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
- 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
- 建立本地分支和远程分支的关联,使用git branch –set-upstream branch-name origin/branch-name;
- 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。
注意:多人协作的情况比较复杂,问题关键在于远端仓库、本人和他,这三个不同的仓库临时保存了不同的更改和文件。本人、他,这两方要分主次,有个为主要的,决定了最终master主分区的操作。9/25/2017 3:44:33 PM
9 标签tag管理
创建tag标签,标签有点类似HEAD,目的是为了用自己语言去给某个commit操作贴上标签,方便以后查看。有以下几种方法:
- 给某个分支贴上标签,
git checkout dev
紧接着git tag v1.0
就可以了git show v1.0
就可以查看 - 给历史操作贴上标签,
git log
找到合适的commit id,git tag v0.9 34mlj
即可 - 标签加上说明,
git tag -a v1.2 -m"this is v1.2"
-a指标签, – m指说明 git tag
#查看所有标签,git show vxx
查看xvv标签
标签操作
作者小总结:
- 命令git push origin tagname可以推送一个本地标签;
- 命令git push origin –tags可以推送全部未推送过的本地标签;
- 命令git tag -d tagname可以删除一个本地标签;
- 命令git push origin :refs/tags/tagname可以删除一个远程标签 #就是替换
注意:tag是全局的,各个分支的tag互相是可以看到的。
10 忽略特殊文件
在版本管理时候,有些文件仅仅自己本地使用,不能提交到GitHub,例如邮箱授权码、密码等,这个时候就要借助git特有的.gitignore文件来忽略。”.gitignore.”用来创建文件,避开“”
方法:在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件
忽略原则:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如Java编译产生的.class文件;
- 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件
注意:
1.在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中 .gitignore 文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:
# 此为注释 – 将被 Git 忽略
*.cs # 忽略所有 .cs 结尾的文件
!ABC.cs# 但 ABC.cs 除外
/BLL # 仅仅忽略项目根目录下的 BLL 文件,不包括 subdir/BLL
build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
规则很简单,不做过多解释,但是有时候在项目开发过程中,突然心血来潮想把某些目录或文件加入忽略规则,按照上述方法定义后发现并未生效,原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
11 配置别名
简而言之,就是自定义快捷键,节省时间.
git config --alias.co checkout
git config --alias.ci commit
git config --alias.br branch
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"
#神器
总结
三天时间看完教程,git的作用就是一个版本的分布式管理,其目的是为了多人更好的协同工作和版本管理。教程也只是简单的介绍了基本的操作,在工作中常用的命令。在工作中,多操作,会用就行。
9/26/2017 4:15:33 PM
END