码迷,mamicode.com
首页 > 其他好文 > 详细

Git教程_持续更新

时间:2018-03-09 00:19:20      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:uri   second   fas   rem   email   别名   远程   其他   推送   

Git教程

更新12/14/2017 5:21:57 PM

更新11/22/2017 6:27:24 PM

写在前面,在heroku上部署了python web应用,迎合大众,所有操作都是在Ubuntu上操作。由于git版本管理没有掌握好,在Ubuntu和Windows上面的命令有一定的不同,造成了迥异的报错。现整理归类一下:

方法一

  1. 在电脑本地生成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文件在本地位置无恙
    #通信建立完成了,就这么简单
  2. 本地新建文件夹(避免汉字),Git bash here终端切换进去,并执行git初始化。

    1.mkdir myproject
    
    2.cd /home/leng/myproject
    
    3.git init #初始化仓库,会生成.git文件
    #主要git安装比较简单,而且无需更改环境途径
  3. 在GitHub网页上新建自己的一个new repository用来储存我们的myproject项目文件,文件名和本地一致。

    1.直接new repository新建版本仓库
    #为了方便,取名和本地保持一致吧
  4. 将本地文件推送到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克隆到本地就可以了。

总结上面普通步骤:

  1. git status 此命令用来查看当前仓库的情况--新增啊、修改等等
  2. git add . 将新增/修改内容添加进来,进行commit前准备
  3. git commit -m‘message‘ 将新内容进行commit提交
  4. git push 最后的提交了
  5. 以上步骤2-4是最基本最主要的操作了, 更详细的不谈了。

END


前言

本文为本人阅读廖雪峰教程的总结和笔记,教程见 廖雪峰Git教程

1分布式vs集中式

Git是分布式的版本管理系统,和其他集中式的版本管理系统相比,如SVN,最大的优点是本地管理、多人同时开工,
Git与SVN的主要差别

  1. 这两个工具主要的区别在于历史版本维护的位置,Git本地仓库包含代码库还有历史库,在本地的环境开发就可以记录历史,而SVN的历史库存在于中央仓库,每次对比与提交代码都必须连接到中央仓库才能进行。
  2. Git中,自己可以在脱机环境查看开发的版本历史
  3. 多人开发时如果充当中央仓库的Git仓库挂了,任何一个开发者的仓库都可以作为中央仓库进行服务,不过开发者仓库一般不直接充当中央库,但你可以随时创建一个新的中央库然后同步就立刻恢复了中央库

2基本操作

  1. 在Ubuntu下安装:sudo apt-get install git ;Windows下就是一个基本软件的安装了。
  2. 创建仓库:在某个文件夹里面右击打开git bash here
    1. mkdir learngit #创建文件夹
    2. cd learngit #进入文件夹目录
    3. pwd #在显示当前目录
    4. git init # 初始化
    5. git config --global user.email "xx" #注意yy和name之间的空格
    6. git config --global user.name "yy" #email和name的配置没有作用,主要本地生成的ssh_key添加到GitHub配置中起作用。
  3. ****提交文件到仓库及修改、查看更改
    1. 新建readme.txt
    2. git add readme.txt #添加文件到仓库--精准添加单个文件
    3. git commit -m "this is the first version"#提交文件到仓库,可以多个一起提交,message用来保存提交的描述信息
    4. 手动改动readme.txt中的内容并保存

    5. git status #查看仓库的当前状态,提交修改和新文件一样需要两步
    6. git diff #见后面的解释说明,列出修改的信息
    7. git add readme.txt 上面status和diff可以看到仓库修改过,就需要再次提交。
    8. git commit -m"the second"
  4. 版本回退:
    1. git log #查看版本详细的操作记录情况,方便我们版本回退到那个那个版本。
    2. git reset --hard head^^ #HEAD是当前版本,^^往前两个版本HEAD~4,回退4个
    3. git reflog #查看所有的版本操作
    4. git reset --hard xxx 回退到未来版本,最常用,xxx为版本号,前面几个即可--不少于四位,系统自动搜索
    5. 版本向前或向后的回退,显示获取各个版本情况,再用命令回到希望的版本。

操作解释说明:

  • git status 两个作用,1用来监控工作区文件的增加或减少(文件的改动只有git diff可以查询出来),2.用来查询当前版本位置,缓存区有无文件需要commit
  • git 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#切换到master
  • git 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分支管理

  1. 目前,lengqian正在leng分区上修改
  2. 老大说master有一个bug,需要马上更改
  3. git stash#将leng分区临时保存起来
  4. git checkout master#切换到master分区
  5. git checkout -b bug #创建bug分区,用来修改
  6. 修改好了,直接将bug合并到master中
  7. git checkout leng#切换到leng分区
  8. git stash list#可以看到我们的保存的文件
  9. git stash pop#切换为最近一次临时保存的界面,并删除stash
  10. 用stash list可以查看stash列表,git stash apply stash@{1}#用来恢复那个版本,

8 多人协作

  1. 大家公用一个远程仓库,开发之前git remote -v 查看远程仓库的信息。
  2. git clone ... 拷贝至本地,用git branch可以看出只有master分区
  3. git checkout -b dev 创建自己本地的开发分区,并用git push origin dev 推送至仓库,也是同伴的开发分区基础
  4. 同伴git pull origin dev#即可将dev分区复制到本地
  5. 在本地dev中修改完成后,用git push origin dev 将本地的dev分区push到远程仓库(这个推送之后,也就是合并到远端的dev中去了)

作者小总结:

  1. 查看远程库信息,使用git remote -v,前提是拷贝下来,并且在.git目录处打开Bash;
  2. 本地新建的分支如果不推送到远程,对其他人就是不可见的;
  3. 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
  4. 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
  5. 建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
  6. 从远程抓取分支,使用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‘

gitigonre自动生成网址

gitignore_config_fom_github

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


Git教程_持续更新

标签:uri   second   fas   rem   email   别名   远程   其他   推送   

原文地址:https://www.cnblogs.com/lengqian/p/8531453.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!