史上最详细Git使用教程

本篇为廖雪峰老师官方网站中Git教程的学习笔记

Git是世界上最先进的分布式版本控制系统,克隆一个项目的速度非常快

每个开发都可以从master上克隆一个本地版本库,就算没有网络,也可以提交代码到本地仓库、查看log、创建项目分支等等

每个版本库都可以创建无限个分支,分支是个完整的目录,且这个目录拥有完整的实际文件

一、安装

网上搜一下安装教程,这里就不介绍了

安装完成后,在开始菜单里找到“Git”->“Git Bash”,弹一个类似命令行窗口的东西,就说明Git安装成功

接着需要设置一下机器信息,这台机器上的所有Git仓库都会使用这个配置

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

二、创建版本库

1、创建一个空目录(最好不要包含中文)

$ mkdir mymenu
$ cd mymenu
$ pwd
/Users/hxk/mymenu

pwd命令显示当前目录

2、初始化仓库

git init命令把这个目录变成git可以管理的仓库

$ git init
Initialized empty Git repository in /Users/hxk/mymenu/.git/

初始化了一个空的仓库,目录下多了.git目录

系统自动创建了唯一一个master分支

版本控制系统只能跟踪文本文件的改动,且编码方式是utf-8

三、文件的基本操作

创建一个test.txt文件,内容如下:

Hello World

1、添加文件到仓库

$ git add test.txt

2、提交文件到仓库

$ git commit -m "a new file"

-m后面输入的是本次提交的说明,提交成功后会显示:

1 file changed:1个文件被改动(我们新添加的readme.txt文件);

2 insertions:插入了两行内容(readme.txt有两行内容)。

为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

如果提交的备注写错了,可以用以下命令修改刚刚提交的备注

$ git commit --amend

3、修改文件

将test.txt文件修改如下:

Hello World ABC

提交

$ git add test.txt
$ git commit -m "append ABC"

每次commit都会生成一个“快照”

4、查看历史记录

$ git log
commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)
Author: hxk <hxk@gmail.com>
Date:   Fri July 20 21:06:15 2018 +0800

    append ABC

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: hxk <hxk@gmail.com>
Date:   Fri July 20 20:59:18 2018 +0800

    a new file

git log显示最近到最远的提交日志,我们可以看到两次提交,最后一次是append ABC

git的版本号是用SHA1计算出来的一个16进制数

如果嫌输出信息太多,可以加上--pretty=oneline

$ git log --pretty=oneline
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append ABC
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 a new file

5、回退历史版本

$ git reset

首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

回退上一版本

$ git reset --hard HEAD^
HEAD is now at eaadf4e a new file

 这时再次查看历史版本

$ git log
commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: hxk <hxk@gmail.com>
Date:   Fri July 20 20:59:18 2018 +0800

    a new file

之前那个版本已经看不到了,这时如果想回到之前那个版本,需要知道版本号,git内部有个指向当前版本的head指针,将指针从当前版本指回去,所以git回退版本特别快

$ git reset --hard 1094adb7

 6、查看历史命令

要是不记得刚才的版本号了,可以使用以下命令:

$ git reflog

7、查看状态

$ git status

四、工作区和暂存区

Git和SVN的一个不同之处就是有暂存区的概念

名词解释:

工作区(Working Directory):指的是在电脑里能看到的目录,比如mymenu文件夹就是一个工作区

版本库(Repository):.git目录,Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

git add是把需要提交的文件添加到暂存区

git commit是把暂存区的所有内容提交到当前分支

-------------------------测试一下--------------------------

在工作区新增一个testfile文本文件

先用git status查看一下状态:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   test.txt

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    testfile

no changes added to commit (use "git add" and/or "git commit -a")

Git非常清楚地告诉我们,test.txt被修改了,而testfile还从来没有被添加过,所以它的状态是Untracked

将testfile提交后再查看状态

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   testfile
    modified:   test.txt

提交后没有对工作区进行修改的话,查看状态,工作区是干净的

$ git status
On branch master
nothing to commit, working tree clean

-------------------------------测试结束------------------------------------

五、修改

1、管理修改

那么,为什么说git比svn优秀呢?因为git跟踪并管理的是修改,而不是文件

修改test.txt文件内容,添加一行

$ cat test.txt
Hello World ABC
This is the second line

然后添加文件

$ git add test.txt

再次修改test.txt

$ cat test.txt
Hello World ABC
This is the second line
This is the third line

提交

$ git commit -m "test add lines"

这时我们发现,第二次的修改未提交,这是为什么呢?

第一次修改-->git add-->第二次修改-->git commit

add将工作区的修改存入暂存区,但是第二次修改并未存入暂存区,git commit只负责把暂存区的修改提交,所以正确的顺序应该是:

第一次修改 --> git add --> 第二次修改 --> git add --> git commit

提交后,查看工作区和版本库里面最新版本的区别:

$ git diff HEAD -- test.txt

2、撤销修改

1)丢弃工作区的修改 git checkout -- file(--很重要,没有--,就变成了“切换到另一个分支”的命令

$ git checkout -- test.txt

命令git checkout -- test.txt意思就是,把test.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是test.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是test.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

2)把暂存区的修改撤销掉(unstage),重新放回工作区  git reset HEAD <file>

$ git reset HEAD test.txt
Unstaged changes after reset:
M    test.txt

git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。

 3、删除文件

工作区中删除文件

$ rm test.txt

一是要从版本库中删除该文件,那就用命令git rm删掉,并且git commit

$ git rm test.txt
$ git commit -m "remove test.txt"

二是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:

$ git checkout -- test.txt

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

PS: 手动删除文件,然后使用git rm <file>和git add<file>效果是一样的。

六、分支管理

1、创建与合并分支

每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

------------------------------------测试开始---------------------------------------------------

1)创建分支   git branch <name>

     切换分支  git checkout <name>

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

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

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

2)查看分支  git branch

然后,用git branch命令查看当前分支:

$ git branch
* dev
  master

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对test.txt做个修改,再提交,dev分支的工作完成后,我们就可以切换回master分支:

$ git checkout master
Switched to branch 'master'

切换回master分支后,再查看一个test.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

3)合并某个分支到当前分支  git merge <name>

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev

git merge命令用于合并指定分支到当前分支。合并后,再查看test.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

4)删除分支  git branch -d <name>

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).

删除后,查看branch,就只剩下master分支了:

$ git branch
* master

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。 

2、解决冲突

创建一个新的分支feature1 

$ git checkout -b feature1
Switched to a new branch 'feature1'

 将test.txt修改了一下,加上“AND Simple”,在feature1分支上提交

Hello World ABC
This is the second line AND Simple

切换到master分支

$ git checkout master

在master分支上,将test.txt的最后一行加上“& Simple”,提交:

Hello World ABC
This is the second line & Simple

当两个分支都分别有了新的提交,如下图所示:

这种情况下无法进行快速合并,只能试图把各自的修改合并起来,这样有可能会造成冲突:

$ git merge feature1
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

这时我们必须手动解决冲突后再提交,git status可以查看冲突的文件:

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)

    both modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

查看test.txt文件的内容:

Hello World ABC
<<<<<<< HEAD
This is the second line & Simple
=======
This is the second line AND Simple
>>>>>>> feature1

Git用<<<<<<<=======>>>>>>>标记出不同分支的内容,我们修改如下后保存:

This is the second line and Simple

再提交

$ git add test.txt 
$ git commit -m "conflict fixed"
[master cf810e4] conflict fixed

现在,master分支和feature1分支变成了下图所示:

用git log --graph --pretty=oneline --abbrev-commit可以看到分支的合并情况,包括分支合并图(--graph)、一行显示(--pretty=oneline)、提交校验码缩略(--abbrev-commit)显示:

$ git log --graph --pretty=oneline --abbrev-commit
*   cf810e4 (HEAD -> master) conflict fixed
|\  
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/  
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append ABC
* eaadf4e a new file

最后,删除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was 14096d0).

3、分支管理策略

通常,合并分支时,Git会用快速合并模式(Fast forward),但这种模式下,删除分支后,会丢掉分支信息。

如果用普通合并模式,从分支历史上就可以看出分支信息。

那么,如何使用普通合并模式呢?我们可以用--no-ff参数

$ git merge --no-ff -m "merge with no-ff" dev

不使用Fast forward模式,merge后就像这样:如下图所示:

分支策略

master分支是最稳定的,只能用于发布新版本,平时不能在上面进行开发,要在新建的分支上进行开发,比如dev,这时dev是不稳定的,到产品1.0发布时,将dev分支和master分支合并,在master分支上发布1.0版本。

所以团队合作的分支看起来就像这张图一样:

4、bug分支

修复bug时,我们会创建一个bug分支进行修复,修复完合并,删除分支。

如果手头上有未完成的工作,先把工作现场git stash一下:

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

查看下工作区是否干净

$ git status

等bug修复完分支删除后,我们先查看下stash

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

恢复工作现场

1)用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除

     可以多次stash,恢复指定的stash;

$ git stash apply stash@{0}

2)用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop

5、Feature分支

开发一个新功能,需要新建一个分支。

如果这个功能还未合并就要取消,要使用-D强行删除

$ git branch -D 分支名

6、多人协作

当你从远程克隆时,git自动把本地master分支和远程master分支对应起来,远程仓库默认名为origin

1)查看远程库的信息

$ git remote

查看远程库的详细信息

$ git remote -v

2)推送分支

将本地master分支推送到远程库

如果不推送到远程,本地分支对于其它人就是不可见的

$ git push origin master

3)抓取分支

如果本地分支推送到远程库的文件有冲突,推送失败,我们就得先从远程库中抓取最新的提交合并到本地,解决冲突再提交。

$ git pull

如果git pull报错:没有指定本地分支与远程分支的链接,我们就要手动设置一下

git branch --set-upstream-to=origin/<远程分支名> 本地分支名

4)Rebase

rebase操作可以把本地未push的分叉提交历史整理成直线;

目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。

$ git rebase

和merge的对比示意图如下:

merge-->

这里写图片描述

rebase--> 

这里写图片描述

七、标签管理

切换到需要打标签的分支上

1)新建一个标签(默认为HEAD,也可以指定一个commit id)

创建带有说明的标签,用-a指定标签名,-m指定说明文字

$ git tag <标签名>
$ git tag <标签名> <commit id>
$ git tag -a <标签名> -m "备注"

2)查看标签

标签不是按时间顺序列出,而是按字母排序的。

git tag查看所有标签,用git show 标签名查看指定的某个标签信息

$ git tag
$ git show <标签名>

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

3)删除标签

创建的标签都只存储在本地,不会自动推送到远程,所以打错的标签可以在本地安全删除;

$ git tag -d <标签名>

如果标签已经推送到远程,要先从本地删除,再从远程删除

$ git tag -d <标签名>
$ git push origin :refs/tags/<标签名>

4)推送标签到远程

推送某个标签到远程 git push origin <tagname>

推送全部尚未推送到远程的本地标签 git push origin --tags

$ git push origin <标签名>
$ git push origin --tags

以上。

To be continued...

  • 422
    点赞
  • 3620
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
### 回答1: Git是一种版本控制系统,用于记录代码的改动,协作开发,和代码管理。Git有很多功能和优势,但一开始学习可能会感到困难,因为它的术语和操作需要一些时间来理解。下面是一个简单的教程,用于介绍Git的基本概念和用法: 1.安装Git:首先你需要下载Git,并按照安装向导进行安装。在Windows系统中,你将看到有一个新的Git Bash窗口,用来输入Git命令。 2.创建仓库:如果你想要将一个项目加入Git进行版本控制,那么你首先需要在你的本地计算机上创建一个仓库。打开Git Bash窗口,输入如下命令来创建一个名为MyProject的仓库: mkdir MyProject cd MyProject git init 3.添加文件:现在,你已经有一个新的仓库,但它是空的。你可以使用命令添加项目中的文件到仓库中。 git add . 4.提交代码:当你改动了文件并想要将它们保存到Git仓库时,你需要使用提交指令。 git commit -m "这里输入你的提交信息" 5.推送至远程仓库:一旦你的本地仓库中的代码得到了提交,并想要在分支中共享它们,你可以使用如下命令将提交的代码推送至远程仓库。 git push origin master 通过以上的5个简单步骤,就可以将你的项目加入到Git中进行版本控制,管理和协作开发了。这是最简单、最清晰易懂的Git使用教程。这里面还有许多更多的高级含义,例如Git的分支,标签,拉取,合并等等,掌握这些功能,需要更进一步的学习和实践。 ### 回答2: Git是一个强大的版本控制系统,它是程序员必须掌握的技能之一。但是,学习Git可能会令人感到有些困难,因为它有其特定的术语和工作流程。下面将为大家提供一份最详细最傻瓜的Git使用教程。 一. Git的安装 首先,你需要安装Git客户端。在Windows系统上可以使用Git Bash或Git GUI, 在Mac或Linux系统上可以使用Git命令行工具。 Git官方网站提供了Git客户端的下载或者直接在命令行使用安装命令进行安装。 二. Git配置 在安装Git之后,你需要对Git进行配置。 通过运行以下两个命令,你可以设置你的用户名和电子邮件地址,这将用于你提交的每个代码的作者身份标记。 git config --global user.name "Your Name" git config --global user.email "youremail@yourdomain.com" 三. 创建和克隆仓库 在Git中,你可以使用init命令创建一个新的仓库。 mkdir mynewproject cd mynewproject git init 你也可以使用clone命令从一个现有仓库进行克隆。 git clone https://github.com/youruser/yourproject.git 四. Git基本的工作流程 在Git中,你需要使用工作区,暂存区和版本库来管理代码。 首先,你需要将代码添加到暂存区中以进行跟踪。 git add myfile.py 然后,你需要将更改提交到版本库中。 git commit -m "Added new feature to myfile.py" 在有多个开发人员协同工作的项目中,每个人都应该在开始工作之前使用pull命令获取最新的代码版本。 git pull 然后,进行开发和更改后,如果你想将更改推送到远程仓库并与团队共享,请使用push命令。 git push origin master 五. Git常用命令 在Git中,你需要掌握以下常用命令。 - git init - 初始化仓库 - git clone - 克隆一个现有仓库 - git add - 添加文件或文件夹 - git commit - 将更改提交到版本库中 - git push - 推送更改到远程仓库 - git pull - 拉取最新的代码版本 - git status - 显示当前代码的状态 - git branch - 显示所有分支 - git checkout - 切换到另一个分支 - git merge - 合并两个分支 - git diff - 显示两个版本之间的差异 六. Git的分支管理 分支是Git最重要的特性之一。在开发过程中,团队中的每个成员都应该使用自己的分支。下面是一些有用的分支管理命令。 - git branch - 列出所有分支 - git branch newbranch - 创建一个新分支 - git checkout branchname - 切换到另一个分支 - git merge branchname - 将分支的更改合并到当前分支中 - git branch -d branchname - 删除特定的分支 七. 总结 本篇文章提供了Git使用教程详细最傻瓜的步骤和命令列表。如果你是初学者,建议先从一些简单的Git使用场景入手,然后扩展到更复杂的方法。如果你在使用Git时遇到问题,请在Stack Overflow或其他技术社区寻求帮助。总之,使用Git来管理你的代码将大大提高你的编程效率。 ### 回答3: Git 是一款非常流行的源代码管理工具,它具有分布式、速度快、支持大型项目等优点。但对于初学者来说,可能会觉得 Git 使用起来有些困难和复杂。 以下是 Git 使用教程详细最傻瓜的步骤: 第一步:安装 Git 工具 需要在官网上下载并安装 Git 工具。macOS 和 Linux 系统已经内置了 Git,只需在终端中输入 git --version 即可查看是否已安装 Git。 第二步:创建本地仓库 首先在本地新建一个文件夹,然后通过终端进入该文件夹。在终端输入 git init,该文件夹就会成为一个本地的 Git 仓库。 第三步:添加文件 在该文件夹中添加需要版本管理的文件,然后在终端中输入 git add .,用来把文件添加到暂存区。 如果只想提交某个文件,则可以使用 git add 文件名 的形式。 第四步:提交文件 在终端中输入 git commit -m "描述信息",用来将文件提交到本地 Git 仓库中。其中描述信息是对此次提交的说明,可以写明本次提交的内容、修改的文件以及其他需要说明的信息。 第五步:创建远程仓库 在 Github 等代码托管平台中创建一个仓库,用于同步本地 Git 仓库中的代码。 然后通过 git remote add origin 远程仓库地址 的方式将本地仓库与远程仓库关联起来。 第六步:推送到远程仓库 在终端中输入 git push -u origin master 将本地仓库的代码上传到远程仓库中。这里 origin 是远程仓库的别名,master 表示上传到主分支中。 之后每次提交代码时,只需执行 git push 命令即可将修改的代码推送到远程仓库中。 以上就是 Git 使用教程详细最傻瓜的步骤,尽管 Git 使用起来可能不是那么容易,但只要跟着这些简单的步骤操作,就能够轻松地做到版本管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值