zoukankan      html  css  js  c++  java
  • Git操作步骤--详细版

    Git操作步骤-----详细版

    本地仓库

    安装:

    在Linux上安装
    1.检查是否安装了git
    	终端输入:$ git
    	返回结果若出现:
    		The program 'git' is currently not installed. You can install it by typing:
    		sudo apt-get install git
    	则在你的机器上没有安装Linux,而Linux也会很贴心的给你提示如何安装
    2.安装命令
    	sudo apt-get install git
    
    在Windows上安装git
    • 首先去git官网下载安装程序: git下载网址,选择默认安装

    详细安装步骤:

    这里的安装步骤就不一一详细撰述了,百度即可

    • 在快捷菜单栏里找到Git -> Git Bash

    当出现了一个类似命令行的窗口时,即安装成功,

    安装成功后,还需要进行设置(优先选择全局安装,,方便以后使用)

    $ git config --global user.name "Your Name"
    $ git config --global user.email "email@example.com"
    

    安装上述命令,给控制系统自报家门

    注意:

    git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

    项目搭建

    首先要规划好你的版本库(即Git仓库),在这个目录里边,每个文件的修改、删除、增加,Git都能跟踪,方便我们在任何时间里都可以追踪历史,或者回到过去,将某个历史版本复原

    • git bash终端里,切换到你的目录下,创建一个空目录
    $ mkdir gitdocs        // 新建一个gitdocs文件夹   
    $ cd gitdocs		  // 打开gitdocs文件夹
    $ pwd				 // 查看当前所在位置
    /e/Github/gitdocs	  // 当前所在目录
    

    如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

    • **通过git init命令将这个目录转变成Git可以管理的仓库 **
    $ git init
    Initialized empty Git repository in /e/Github/gitdocs/.git/
    

    此时,我们的本地仓库就建立好了,而此时,这个仓库还是一个空仓库,这就需要我们去填充内容了

    当你去你的文件夹里面去看时,会发现出现了一个 .git的目录,这个目录就是用来跟踪管理仓库的,请勿随意乱动这里面的东西,以免破坏仓库,如果没有的话,可能已设置隐藏,口头语通过ls -ah命令查看

    • 着手文件的建立
    $ touch readme.txt 			// 建立readme.txt文件
    或者是直接用
    $ vim readme.txt			// Linux系统自带的vim文本编译器,可以在没有此文件的情况下自行创建文件
    					       // 打开readme.txt文件进行编辑
    

    ​ 详细vim操作命令:vim操作命令手册

    提交到仓库

    • git add命令上传到临时库
    $ git add readme.txt [readme2.txt] ...  // 可以提交多个文件
    
    • git commit命令告诉git,把文件提交到仓库
    $ git commit -m "[提交说明]"  // 例如你修改了什么,或者是做了什么操作
    执行后,会出现:
    	1 file changed   // 新添加一个文件
       2 insertions:    // 插入了两行内容
    

    注意:

    Q:输入git add readme.txt,得到错误:fatal: not a git repository (or any of the parent directories)。Q:输入git add readme.txt,得到错误:fatal: not a git repository (or any of the parent directories)。
    A:Git命令必须在Git仓库目录内执行(git init除外),在仓库目录外执行是没有意义的。
    
    Q:输入git add readme.txt,得到错误fatal: pathspec 'readme.txt' did not match any files。
    A:添加某个文件时,该文件必须在当前目录下存在,用ls或者dir命令查看当前目录的文件,看看文件是否存在,或者是否写错了文件名。
    
    小结:
    初始化一个Git仓库,使用git init命令。
    
    添加文件到Git仓库,分两步:
    	1.使用命令git add <file>,注意,可反复多次使用,添加多个文件;
    	2.使用命令git commit -m <message>,完成。
    	3.使用 git status 查看结果,git status命令可以让我们时刻掌握仓库当前的状态
    

    查看状态结果

    $ git status
    

    git status命令可以让我们时刻掌握仓库当前的状态

    但是如果想要查看历史修改了什么,这时我们就需要用git diff命令查看了

    $ git diff readme.txt[文件名]
    diff --git a/readme.txt b/readme.txt
    index 460bb99..8546085 100644
    --- a/readme.txt
    +++ b/readme.txt
    @@ -2,4 +2,4 @@ Git is a distributed version control system.
    Git is free software.
    this is git test1
    thanks
    -
    +hello??  it's me!!
    

    git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在最后一行添加了一行hello?? it's me!!

    小结:
    git status告诉你有文件被修改过
    git diff可以查看修改内容。
    

    版本回退

    在我们每次提交项目时,都会对该版本进行一个快照处理,而这个快照在Git中被称为commit。当把文件弄乱了,或者误删了,此时我们就可以从最近的一个commit中恢复,然后继续工作

    • 查看历史记录
    $ git log         // 显示从最近到最远的提交记录,显示过多
    $ git log --pretty=oneline  // 将记录显示在一行
    c5f4d8f3991a6e258beb709ede70426c5ab8b41e (HEAD -> master) 谢谢
    14486e415dd995b3ef2bffbba9517e7d48d3c1a7 新增一行数据
    57350b53707aaa0f597cd0b0d6c37481cc0362e1 add distributed
    b6d9d6e55f82a622b96373f76ddb00f706e8a795 wrote a readme file
    
    • 回退版本
    $ git reset --hard HEAD^ // 回退到上一个版本
    					   // 在Git中,用HEAD表示当前版本,也就是最新的提交,上一个版本就是HEAD^,上上一						   个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成						  HEAD~100
    $ git reset --hard [append GPL的commit id]  // 随意取前面几个十六进制数,最好是五个以上,如果有重复										   的则再取一位 
    
    • 返回到最新版本
    $ git reflog    // 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
    

    工作区和暂存区

    • 工作区

    我的gitdocs文件夹就是一个工作区

    • 版本库

    .git隐藏目录中即为Git的版本库

    版本库中,最重要的就是成为stage(或者叫index)的暂存区,还有Git自动创建的第一个分支master,以及指向master的一个指针HEAD

    git add把文件添加进去,实际上就是把文件修改添加到暂存区;
    git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
    因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
    

    撤销修改

    工作区

    想直接丢弃工作区的修改时,用命令git checkout -- <file>。
    

    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。

    暂存区

    用命令git reset HEAD <file>可以把暂存区的修改撤销掉(unstage),重新放回工作区:
    

    删除文件

    两种方法
    1.
    	$ rm <filename>     // 删除工作区的文件
    2.
    	$ git rm <filename> // 删除版本库里的文件
    	$ git commit -m "description"  // 删除后提交
    

    注意:

    如果删错了,此时我们可以把版本库里的最新版本恢复到本地工作区
    	$ git checkout -- <filename> 
    但是,从来没有被提交到版本库就被删除的,是无法恢复的
    

    远程仓库

    连接远程仓库

    搭建SSH

    $ ssh-keygen -t rsa -C "[你的邮箱]"
    步骤:
    	第1步:在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
    	第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key
    	
    

    添加远程库

    • 在GitHub上新建一个Ceate a new repository仓库

    • 仓库名字填好后,直接下一步默认选项,最后点击Create repository后就成功建立了一个新的git仓库

    • 在本地的gitdocs下运行命令

    $ git remote add origin git@github.com:[账户名]/[仓库名].git
    
    • 将本地仓库的所有内容推送到远程仓库
    $ git push -u origin master | [分支名] 
    

    注意:

    ​ 第一次需要加-u

    ​ 同时,当第一次使用Git的clone或者push命令时,会得到一个警告,从事需要确认SSHkey是否有效,确认后按回车即可继续

    ​ 这个警告只会出现一次

    推送成功后,就可以查看远程仓库的内容了

    • 之后再进行提交后,就可以简化命令
    $ git push origin master 
    

    从远程仓库克隆

    $ git clone git@github.com:[账户名]/[仓库名].git   // ssh模式
    或者
    $ git clone https://github.com/[账户名]/[仓库名].git   // https模式
    

    想要克隆一个仓库,就得需要知道他的地址

    Git支持多种协议:https、ssh(速度最快)

    分支管理

    创建与合并分支

    master称为主分支,也是Git默认的分支

    HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

    创建分支

    $ git checkout -b [分支名]   // 在终端中可以看到变化,master改为[分支名],创建并切换分支
    

    git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

    $ git branch [分支名]
    $ git checkout [分支名]
    

    git branch命令会列出所有分支

    $ git branch   // 查看所有分支
    

    合并分支

    首先,切换到master主分支上,再执行以下命令
    切换:$ git switch master 或者 $ git checkout master
    合并:$ git merge [分支名] 
    

    删除分支

    $ git branch -d [分支名]
    

    创建分支,在分支上进行工作,和直接在master上工作,效果是一样的,但是过程更安全

    switch

    切换分支这个动作,用switch更科学。因此,最新版本的Git提供了新的git switch命令来切换分支
    创建并切换命令:
    	$ git switch -c [分支名]
    切换分支命令:
    	$ git  switch [分支名]
    

    小结

    查看分支:git branch
    
    创建分支:git branch [分支名]
    
    切换分支:git checkout [分支名]或者git switch [分支名]
    
    创建+切换分支:git checkout -b [分支名]或者git switch -c [分支名]
    
    合并某分支到当前分支:git merge [某分支名]
    
    删除分支:git branch -d [分支名]
    

    解决分支冲突

    当两个不同的分支都修改了文件并都提交之后,在master也同时修改文件

    此时两个分支都有提交,据出现了两个分支都指向了master所在的HEAD,这种情况下,GIT无法实现快速合并,此时需要我们手动修改冲突的文件,并再次提交

    $ git log --graph --pretty=oneline --abbrev-commit  // 查看分支的合并情况
    

    合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

    BUG分支

    • 利用git stash命令将当前工作环境隐藏起来

    • 修改BUG

    • 新建临时分支,修改文件,保存提交

    • 切换到master分支,并完成合并,最后删除临时分支

    • 切换到工作分支

    • 利用git status查看当前工作环境,但是它被隐藏了

    • 恢复方法

      第一种:
      	用git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除;
      第二种:
      	用git stash pop,恢复的同时把stash内容也删了
      
    • 利用git status list查看内容,此时看不到任何stash内容

    • 恢复指定的stash

    $ git stash apply stash@{0}
    

    在master分支上修复bug之后,可能在早期的分支之中,也会存在bug,该如何修复呢?

    • 第一种:按照上述步骤再走一次

    • 第二种:

    $ git cherry-pick [commit id]
    

    这里Git自动给分支做了一次提交,此时的commit id不同于之前的commit id

    利用第二种,我们就可以不需要再重复一次步骤

    小结
    修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
    
    当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
    
    在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
    

    在软件开发的过程中,总会有无穷无尽的新的功能要不断的添加进来,最好是新建立一个分支。

    在新功能被添加的过程之中,难免会有一些功能不再需要了,此时,需要删除分支,而这个分支却没有被合并,通过普通的方法删除是不凑效的。这里就要使用强行删除了

    $ git branch -D [功能分支名]
    

    开发一个新feature,最好新建一个分支;

    如果要丢弃一个没有被合并过的分支,可以通过git branch -D 强行删除。

    多人协作

    $ git remote
    $ git remote -v      // 查询是否有push权限
    

    多人协作的工作模式通常是这样:

    1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
    2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
    3. 如果合并有冲突,则解决冲突,并在本地提交;
    4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

    如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

    这就是多人协作的工作模式,一旦熟悉了,就非常简单。

    小结

    • 查看远程库信息,使用git remote -v
    • 本地新建的分支如果不推送到远程,对其他人就是不可见的;
    • 从本地推送分支,使用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,如果有冲突,要先处理冲突。

    rebase

    • rebase操作可以把本地未push的分叉提交历史整理成直线;
    • rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

    标签管理

    新建标签

    tag就是commit id的一个别称

    $ git tag [标签名] | [commit id] | [-m "标签说明文字"]
    // 给对应的commit id打上标签
    
    $ git show <tagname>  // 查看该标签的信息
    

    注意:标签总是和某个commit挂钩。如果这个commit既出现在master分支,又出现在dev分支,那么在这两个分支上都可以看到这个标签。

    小结

    • 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;
    • 命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;
    • 命令git tag可以查看所有标签。

    删除标签

    $ git tag -d [标签名]
    创建的标签都只存储在本地,不会自动推送到远程。因此,打错的标签可以在本地安全删除。
    

    如果需要将某个标签推送到远程

    $ git push origin <tagname> // 单独推送某个标签
    $ git push origin --tags   // 推送全部标签
    

    如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

    $ git tag -d <tagname>
    

    然后,从远程删除。删除命令也是push,但是格式如下:

    $ git push origin :refs/tags/<tagname>
    

    要看看是否真的从远程库删除了标签,可以登陆GitHub查看。

    小结

    • 命令git push origin <tagname>可以推送一个本地标签;
    • 命令git push origin --tags可以推送全部未推送过的本地标签;
    • 命令git tag -d <tagname>可以删除一个本地标签;
    • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。

    特殊文件的忽略

    • 忽略某些文件时,需要编写.gitignore
    • .gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!
    $ git add -f [文件名]   // 强制添加到git
    git check-ignore       // 检查.gitignore规则
    

    配置别名

    $ git config --global alias.[别名] [原关键词] | ["命令行"]
    例如:
    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"
    

    --global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用;加上则对当前用户起作用,不加则只针对当前仓库起作用

    Linux搭建git服务器

    • 安装git
    $ sudo apt-get install git  // 安装git
    
    • 创建一个git用户,用来运行git服务
    $ sudo adduser git
    
    • 创建证书登录
    收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
    
    • 初始化git仓库
    先选定一个目录作为Git仓库,假定是/srv/sample.git,在/srv目录下输入命令
    $ sudo git init --bare sample.git
    
    • 第五步,禁用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每次一登录就自动退出。

    • 第六步,克隆远程仓库

    现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

    $ git clone git@server:/srv/sample.git
    Cloning into 'sample'...
    warning: You appear to have cloned an empty repository.
    

    ​ 剩下的推送就简单了。

    管理公钥

    如果团队很小,把每个人的公钥收集起来放到服务器的/home/git/.ssh/authorized_keys文件里就是可行的。如果团队有几百号人,就没法这么玩了,这时,可以用Gitosis来管理公钥。

    小结

    • 搭建Git服务器非常简单,通常10分钟即可完成;
    • 要方便管理公钥,用Gitosis
    • 要像SVN那样变态地控制权限,用Gitolite

    注意:本章内容是根据廖雪峰老师的博客进行总结编写

  • 相关阅读:
    python:窗口化和制作图形
    python:随机数 random
    python:数组/列表(remove()函数、append()函数、sort()函数、reverse()函数)
    python:一个轻松的递归逻辑
    python:while 语句的使用方法
    python:ord()和chr()——字符串和ASCll编码转换
    hive引擎的选择:tez和spark
    解决ideal使用maven打包OutOfMemory
    元数据 概念及分类
    hive on mr 参数设置
  • 原文地址:https://www.cnblogs.com/hleisurely/p/13277133.html
Copyright © 2011-2022 走看看