Git操作步骤--详细版

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

目录
  • Git操作步骤-----详细版
    • 本地仓库
      • 安装:
        • 在Linux上安装
        • 在Windows上安装git
      • 项目搭建
      • 提交到仓库
        • 小结:
      • 查看状态结果
        • 小结:
      • 版本回退
      • 工作区和暂存区
      • 撤销修改
      • 删除文件
    • 远程仓库
      • 连接远程仓库
      • 添加远程库
      • 从远程仓库克隆
    • 分支管理
      • 创建与合并分支
      • 解决分支冲突
      • BUG分支
      • 多人协作
    • 小结
      • rebase
    • 标签管理
      • 新建标签
    • 小结
      • 删除标签
    • 小结
    • 特殊文件的忽略
    • 配置别名
  • Linux搭建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 protected]"

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

注意:

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 ,注意,可反复多次使用,添加多个文件;
	2.使用命令git commit -m ,完成。
	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 -- 

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

暂存区

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

删除文件

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

注意:

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

远程仓库

连接远程仓库

搭建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 [email protected]:[账户名]/[仓库名].git
  • 将本地仓库的所有内容推送到远程仓库
$ git push -u origin master | [分支名] 

注意:

​ 第一次需要加-u

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

​ 这个警告只会出现一次

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

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

从远程仓库克隆

$ git clone [email protected]:[账户名]/[仓库名].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 命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

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

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

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

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

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

多人协作

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

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

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

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

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

小结

  • 查看远程库信息,使用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   // 查看该标签的信息

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

小结

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

删除标签

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

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

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

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

$ git tag -d 

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

$ git push origin :refs/tags/

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

小结

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

特殊文件的忽略

  • 忽略某些文件时,需要编写.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。

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

你可能感兴趣的:(Git操作步骤--详细版)